Stemming i lematyzacja w Python NLTK z przykładami
Na czym polega Stemming i Lematyzacja Python NLTK?
Pochodzenie i lemmatyzacja in Python NLTK to techniki normalizacji tekstu dla przetwarzania języka naturalnego. Techniki te są szeroko stosowane do wstępnego przetwarzania tekstu. Różnica między stemmingiem a lematyzacją polega na tym, że stemming jest szybszy, ponieważ wycina słowa bez znajomości kontekstu, podczas gdy lematyzacja jest wolniejsza, ponieważ zna kontekst słów przed przetworzeniem.
Co to jest Stemming?
Przybitka jest metodą normalizacji słów w Przetwarzanie języka naturalnego. Jest to technika, w której zestaw słów w zdaniu jest przekształcany w sekwencję, aby skrócić wyszukiwanie. W tej metodzie normalizowane są słowa mające to samo znaczenie, ale mające pewne różnice w zależności od kontekstu lub zdania.
Innymi słowy, istnieje jedno słowo główne, ale istnieje wiele odmian tego samego słowa. Na przykład rdzeń słowa to „jeść”, a jego odmiany to „je, je, je, i tak dalej”. W ten sam sposób, za pomocą Stemming in Python, możemy znaleźć rdzeń wszelkich odmian.
Na przykład
He was riding. He was taking the ride.
W powyższych dwóch zdaniach znaczenie jest takie samo, tj. aktywność konna w przeszłości. Człowiek może łatwo zrozumieć, że oba znaczenia są takie same. Ale w przypadku maszyn oba zdania są różne. Dlatego trudno było przekonwertować go na ten sam wiersz danych. Jeśli nie dostarczymy tego samego zestawu danych, maszyna nie będzie w stanie przewidzieć. Dlatego konieczne jest zróżnicowanie znaczenia każdego słowa, aby przygotować zbiór danych do uczenia maszynowego. W tym przypadku stemming służy do kategoryzowania tego samego typu danych poprzez uzyskanie ich rdzenia.
Zaimplementujmy to za pomocą a Python program.NLTK ma algorytm o nazwie „PorterStemmer”. Algorytm ten akceptuje listę słów tokenizowanych i przekształca ją w słowo główne.
Program do zrozumienia Stemminga
from nltk.stem import PorterStemmer e_words= ["wait", "waiting", "waited", "waits"] ps =PorterStemmer() for w in e_words: rootWord=ps.stem(w) print(rootWord)
Wydajność:
wait wait wait wait
Wyjaśnienie kodu:
- W NLTk znajduje się moduł macierzysty, który jest importowany. Jeśli zaimportujesz cały moduł, program stanie się ciężki, ponieważ zawiera tysiące linii kodów. Zatem z całego modułu łodygi zaimportowaliśmy tylko „PorterStemmer”.
- Przygotowaliśmy fikcyjną listę danych o odmianach tego samego słowa.
- Tworzony jest obiekt należący do klasy nltk.stem.porter.PorterStemmer.
- Następnie przekazaliśmy go PorterStemmerowi jeden po drugim za pomocą pętli „for”. Na koniec otrzymaliśmy wyjściowe słowo główne każdego słowa wymienionego na liście.
Z powyższego wyjaśnienia można również wywnioskować, że rdzeniowanie jest uważane za ważny etap przetwarzania wstępnego, ponieważ usuwa nadmiar danych i różnice w tym samym słowie. W rezultacie dane są filtrowane, co pomoże w lepszym szkoleniu maszyn.
Teraz przekazujemy całe zdanie i sprawdzamy jego zachowanie jako wynik.
Program:
from nltk.stem import PorterStemmer from nltk.tokenize import sent_tokenize, word_tokenize sentence="Hello Guru99, You have to build a very good site and I love visiting your site." words = word_tokenize(sentence) ps = PorterStemmer() for w in words: rootWord=ps.stem(w) print(rootWord)
Wyjście:
hello guru99 , you have build a veri good site and I love visit your site
Wyjaśnienie kodu:
- Pakiet PorterStemer jest importowany z rdzenia modułu
- Importowane są pakiety do tokenizacji zdań i słów
- Zapisywane jest zdanie, które w kolejnym kroku należy tokenizować.
- Na tym etapie wdrażana jest tokenizacja słów wynikająca z lematyzacji.
- Tutaj tworzony jest obiekt dla PorterStemmer.
- Uruchamiana jest pętla, a wyszukiwanie każdego słowa odbywa się przy użyciu obiektu utworzonego w linii kodu 5
Wnioski:
Stemming to moduł wstępnego przetwarzania danych. W języku angielskim istnieje wiele odmian tego samego słowa. Te różnice powodują niejednoznaczność w szkoleniu i przewidywaniu uczenia maszynowego. Aby stworzyć udany model, konieczne jest odfiltrowanie takich słów i przekonwertowanie ich na sekwencjonowane dane tego samego typu za pomocą stemmingu. Jest to również ważna technika uzyskiwania danych wierszowych ze zbioru zdań i usuwania zbędnych danych, zwana także normalizacją.
Co to jest lematyzacja?
Lemmatyzacja w NLTK to algorytmiczny proces znajdowania lematu słowa w zależności od jego znaczenia i kontekstu. Lematyzacja zwykle odnosi się do analizy morfologicznej słów, której celem jest usunięcie końcówek fleksyjnych. Pomaga w zwróceniu podstawowej lub słownikowej formy słowa znanego jako lemat.
Metoda lematyzacji NLTK opiera się na wbudowanej funkcji morficznej WorldNet. Wstępne przetwarzanie tekstu obejmuje zarówno stemming, jak i lematyzację. Wiele osób uważa te dwa terminy za mylące. Niektórzy traktują je tak samo, ale istnieje różnica między stemplowaniem a lematyzacją. Lematyzacja jest preferowana w stosunku do tej pierwszej z poniższego powodu.
Dlaczego lematyzacja jest lepsza od Stemmingu?
Algorytm Stemming polega na wycinaniu przyrostka ze słowa. W szerszym znaczeniu obcina początek lub koniec słowa.
Wręcz przeciwnie, lematyzacja jest potężniejszą operacją i bierze pod uwagę analizę morfologiczną słów. Zwraca lemat, który jest formą bazową wszystkich form fleksyjnych. Dogłębna wiedza językoznawcza jest wymagana do tworzenia słowników i wyszukiwania właściwej formy słowa. Stemming jest operacją ogólną, podczas gdy lematyzacja jest operacją inteligentną, w której właściwa forma będzie sprawdzana w słowniku. Dlatego lematyzacja pomaga w tworzeniu lepszych uczenie maszynowe funkcje.
Kod pozwalający rozróżnić lematyzację od stemmingu
Kod źródłowy:
import nltk from nltk.stem.porter import PorterStemmer porter_stemmer = PorterStemmer() text = "studies studying cries cry" tokenization = nltk.word_tokenize(text) for w in tokenization: print("Stemming for {} is {}".format(w,porter_stemmer.stem(w)))
Wyjście::
Stemming for studies is studi Stemming for studying is studi Stemming for cries is cri Stemming for cry is cri
Kod lematyzacji:
import nltk from nltk.stem import WordNetLemmatizer wordnet_lemmatizer = WordNetLemmatizer() text = "studies studying cries cry" tokenization = nltk.word_tokenize(text) for w in tokenization: print("Lemma for {} is {}".format(w, wordnet_lemmatizer.lemmatize(w)))
Wyjście:
Lemma for studies is study Lemma for studying is studying Lemma for cries is cry Lemma for cry is cry
Omówienie wyników
Jeśli spojrzysz na studia i studia, wynik jest taki sam (studi), ale lematyzator NLTK zapewnia inny lemat dla obu tokenów: studiowanie na studia i studiowanie na studia. Kiedy więc musimy stworzyć zestaw funkcji do trenowania maszyny, byłoby wspaniale, gdyby preferowana była lematyzacja.
Przypadek użycia Lemmatizera
Lematizer minimalizuje niejednoznaczność tekstu. Przykładowe słowa, takie jak rower lub rowery, są konwertowane na słowo podstawowe rower. Zasadniczo przekonwertuje wszystkie słowa o tym samym znaczeniu, ale inną reprezentację, na ich formę podstawową. Zmniejsza gęstość słów w podanym tekście i pomaga w przygotowaniu dokładnych funkcji dla maszyny szkoleniowej. Im czystsze dane, tym inteligentniejszy i dokładniejszy będzie model uczenia maszynowego. NLTK Lemmatizer pozwala również zaoszczędzić pamięć i koszty obliczeniowe.
Przykład w czasie rzeczywistym pokazujący zastosowanie lematyzacji Wordnet i tagowania POS w Python
from nltk.corpus import wordnet as wn from nltk.stem.wordnet import WordNetLemmatizer from nltk import word_tokenize, pos_tag from collections import defaultdict tag_map = defaultdict(lambda : wn.NOUN) tag_map['J'] = wn.ADJ tag_map['V'] = wn.VERB tag_map['R'] = wn.ADV text = "guru99 is a totally new kind of learning experience." tokens = word_tokenize(text) lemma_function = WordNetLemmatizer() for token, tag in pos_tag(tokens): lemma = lemma_function.lemmatize(token, tag_map[tag[0]]) print(token, "=>", lemma)
Objaśnienie kodu
- Po pierwsze, importowana jest wordnet czytnika korpusu.
- WordNetLemmatizer jest importowany z wordnetu.
- Tokenizacja słów oraz części znaczników mowy są importowane z nltk.
- Domyślny słownik jest importowany z kolekcji.
- Słownik jest tworzony, gdzie pos_tag (pierwsza litera) to wartości kluczowe, których wartości są mapowane na wartość ze słownika Wordnet. Wzięliśmy tylko pierwszą literę, ponieważ użyjemy jej później w pętli.
- Tekst jest zapisywany i tokenizowany.
- Tworzony jest obiekt lemma_function, który będzie używany wewnątrz pętli.
- Uruchamiana jest pętla, a lematize przyjmuje dwa argumenty, jeden jest tokenem, a drugi jest mapowaniem pos_tag na wartość wordnet.
Wydajność:
guru99 => guru99 is => be totally => totally new => new kind => kind of => of learning => learn experience => experience . => .
Python Lematyzacja ma ścisły związek z słownik wordnetu, dlatego istotne jest przestudiowanie tego tematu, dlatego pozostawimy go jako następny temat.