Pyton

Jak wyodrębnić zdania z tekstu za pomocą modułu Python NLTK?

Jak wyodrębnić zdania z tekstu za pomocą modułu Python NLTK?
Natural Language Toolkit (NLTK) to moduł do przetwarzania języka i tekstu dla Pythona. NLTK może analizować, przetwarzać i tokenizować tekst dostępny w wielu różnych językach, korzystając z wbudowanej biblioteki korpusów i dużej puli danych leksykalnych. Python jest jednym z najpopularniejszych języków programowania wykorzystywanych w nauce danych i przetwarzaniu języka, głównie ze względu na wszechstronność języka i dostępność przydatnych modułów, takich jak NLTK. W tym artykule wyjaśnimy, jak wyodrębnić zdania z akapitów tekstu za pomocą NLTK. Kod w tym przewodniku został przetestowany w Pythonie 3.8.2 i NLTK 3.4.5 na Ubuntu 20.04 LTS.

Instalowanie NLTK w Linuksie

Aby zainstalować NLTK w Ubuntu, uruchom poniższe polecenie:

$ sudo apt install python3-nltk

Pakiety NLTK są dostępne we wszystkich głównych dystrybucjach Linuksa. Wyszukaj słowo kluczowe „NLTK” w menedżerze pakietów, aby zainstalować pakiety. Jeśli z jakiegoś powodu NLTK nie jest dostępny w repozytoriach twojej dystrybucji, możesz zainstalować go z menedżera pakietów pip, uruchamiając poniższe polecenie:

$ pip install --user -U nltk

Pamiętaj, że aby powyższe polecenie zadziałało, musisz najpierw zainstalować pip z menedżera pakietów. W niektórych dystrybucjach może się nazywać pip3. Możesz również postępować zgodnie ze szczegółowymi instrukcjami instalacji dostępnymi na oficjalna strona internetowa NLTK.

Wyodrębnianie zdań z akapitu za pomocą NLTK

W przypadku akapitów bez skomplikowanych interpunkcji i odstępów można użyć wbudowanego tokenizera zdań NLTK, zwanego „Punkt tokenizer”, który jest dostarczany ze wstępnie wytrenowanym modelem. Możesz także użyć własnych wytrenowanych modeli danych do tokenizacji tekstu w zdania. Wytrenowane niestandardowe modele danych są poza zakresem tego artykułu, więc poniższy kod będzie używał wbudowanego tokenizera Punkt English. Aby pobrać plik zasobów Punkt, uruchom kolejno następujące trzy polecenia i poczekaj na zakończenie pobierania:

$ Python3
$ importuj nltk
$ nltk.pobierz('punkt')

W poniższym przykładzie kodu zostanie użyty akapit z „Alicji w Krainie Czarów”:

importuj nltk
para = „Albo studnia była bardzo głęboka, albo spadała bardzo wolno, bo miała
dużo czasu, kiedy schodziła, żeby się rozejrzeć i zastanowić, co się dzieje
wydarzy się dalej. Najpierw spróbowała spojrzeć w dół i zrozumieć, do czego zmierza,
ale było zbyt ciemno, żeby cokolwiek zobaczyć; potem spojrzała na boki studni i…
zauważył, że są wypełnione szafkami i półkami na książki; tu i tam ona
widziałem mapy i obrazki zawieszone na kołkach. Zdjęła słoik z jednej z półek
gdy mijała; był oznaczony jako „POMARAŃCZOWA MARMALADA”, ale ku jej wielkiemu rozczarowaniu to
była pusta: nie lubiła upuszczać słoika w obawie, że kogoś zabije, więc udało się
aby włożyć go do jednej z szafek, gdy przechodziła obok niego."
tokeny = nltk.sent_tokenize(para)
dla t w żetonach:
drukuj (t, "\n")

Uruchomienie powyższego kodu da następujące dane wyjściowe:

Albo studnia była bardzo głęboka, albo spadała bardzo wolno, bo miała mnóstwo czasu na…
zeszła na dół, żeby się rozejrzeć i zastanowić, co będzie dalej.
Najpierw spróbowała spojrzeć w dół i zobaczyć, do czego zmierza, ale było za ciemno
zobaczyć cokolwiek; potem spojrzała na boki studni i zauważyła, że ​​są
wypełnione szafkami i regałami na książki; tu i tam widziała rozwieszone mapy i zdjęcia
na kołkach.
Przechodząc zdjęła słoik z jednej z półek; był oznaczony jako „ORANGEMARMALADE”,
ale ku jej wielkiemu rozczarowaniu był pusty: nie lubiła upuszczać słoika ze strachu
zabiła kogoś, więc zdołała włożyć go do jednej z szafek, gdy wpadła obok niego.

Wbudowany tokenizator zdań Punkt działa dobrze, jeśli chcesz tokenizować proste akapity. Po zaimportowaniu modułu NLTK wystarczy użyć metody „sent_tokenize()” na dużym korpusie tekstowym. Jednak tokenizator zdań Punkt może nie wykrywać poprawnie zdań, gdy istnieje złożony akapit zawierający wiele znaków interpunkcyjnych, wykrzykników, skrótów lub powtarzających się symboli. Nie jest możliwe zdefiniowanie standardowego sposobu przezwyciężenia tych problemów. Będziesz musiał napisać niestandardowy kod, aby rozwiązać te problemy, używając wyrażenia regularnego, manipulacji ciągami lub trenując własny model danych zamiast korzystania z wbudowanego modelu danych Punkt.

Możesz także spróbować poprawić istniejący model Punktu, aby naprawić nieprawidłową tokenizację, używając dodatkowych parametrów. Aby to zrobić, postępuj zgodnie z dostępną oficjalną dokumentacją tokenizacji Punktu tutaj. Aby użyć własnych niestandardowych poprawek, wymagana jest niewielka zmiana w kodzie:

od nltk.tokenizować.punkt import PunktSentenceTokenizer, PunktParametry
para = „Albo studnia była bardzo głęboka, albo spadała bardzo wolno, bo miała dużo
czasu, gdy zeszła na dół, żeby się rozejrzeć i zastanowić, co się stanie
Kolejny. Najpierw próbowała spojrzeć w dół i zrozumieć, do czego zmierza, ale tak było
zbyt ciemno, by cokolwiek zobaczyć; potem spojrzała na boki studni i zauważyła
że były wypełnione szafami i regałami z książkami; tu i tam widziała mapy
i obrazki zawieszone na kołkach. Zdjęła słoik z jednej z półek, gdy…
przeszedł; był oznaczony jako „POMARAŃCZOWA MARMALADA”, ale ku jej wielkiemu rozczarowaniu tak było?
pusta: nie lubiła upuścić słoika w obawie, że kogoś zabije, więc udało jej się
wsadziła go do jednej z szafek, gdy przechodziła obok niego."
punkt_params = PunktParametry()
punkt_params.abbrev_types = set(['Pan', 'Pani', 'LLC'])
tokenizer = PunktSentenceTokenizer(punkt_params)
tokeny = tokenizer.tokenizować (para)
dla t w żetonach:
drukuj (t, "\n")

Powyższy kod wykonuje to samo zadanie, co metoda „sent_tokenize()”. Możesz jednak teraz definiować własne reguły za pomocą wbudowanych metod i przekazywać je jako argumenty, jak opisano w dokumentacji. Na przykład do powyższego kodu dodano kilka skrótów. Jeśli po tych skrótach następuje interpunkcja, nie zostaną one podzielone na nowe zdanie. Normalnym zachowaniem jest użycie kropki lub kropki jako wskazania końca zdania.

Wniosek

NLTK i jego metody tokenizacji są dość wydajne w tokenizacji i przetwarzaniu danych tekstowych. Jednak wstępnie wytrenowane modele mogą nie działać w 100% z różnymi rodzajami tekstów. Być może będziesz musiał ulepszyć istniejące modele, wyszkolić i dostarczyć własne lub napisać własny kod, aby naprawić anomalie.

Gry OpenTTD vs Simutrans
OpenTTD vs Simutrans
Creating your own transport simulation can be fun, relaxing and extremely enticing. That's why you need to make sure that you try out as many games as...
Gry OpenTTD Tutorial
OpenTTD Tutorial
OpenTTD is one of the most popular business simulation games out there. In this game, you need to create a wonderful transportation business. However,...
Gry SuperTuxKart for Linux
SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...