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 

Program do zrozumienia Stemmingu

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	 

Program do zrozumienia Stemmingu

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)

Przypadek użycia Lemmatizera

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.

Codzienny biuletyn Guru99

Rozpocznij dzień od najnowszych i najważniejszych wiadomości na temat sztucznej inteligencji, dostarczanych już teraz.