Stemming i lematyzacja w Python NLTK z przykładami

⚡ Inteligentne podsumowanie

Stemming i lematyzacja to techniki normalizacji tekstu w Python NLTK redukuje odmiany słów do wspólnej bazy, gdzie rdzeniowe przyrostki „crows” szybko tworzą wyrazy bez kontekstu, a lematyzacja zwraca prawdziwe słowo słownikowe, wykorzystując znaczenie.

  • 🌱 Przybitka: Metoda PorterStemmer polega na dodawaniu przyrostków, aby dotrzeć do rdzenia, który może nie być prawdziwym słowem.
  • 📚 Lemmatyzacja: WordNetLemmatizer zwraca podstawową formę słownika, zwaną lematem.
  • ⚖️. Różnica: Stemming jest szybszy, lematyzacja wolniejsza, ale dokładniejsza i uwzględniająca kontekst.
  • 🔤 Normalizacja: Oba rozwiązania zmniejszają gęstość słów, więc maszyny traktują warianty jako jedną cechę.
  • 🏷️ Tagi POS: Przekazanie znacznika części mowy sprawia, że ​​lematyzator staje się dużo bardziej precyzyjny.
  • 🤖 Korzyści ze sztucznej inteligencji: Bardziej przejrzysty, znormalizowany tekst zapewnia skuteczniejsze funkcje i modele uczenia maszynowego.

Stemming i lematyzacja w Python NLTK

Na czym polega Stemming i Lematyzacja Python NLTK?

Pochodzenie i lemmatyzacja in Python NLTK to techniki normalizacji tekstu wykorzystywane w przetwarzaniu 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 słowa o tym samym znaczeniu, ale z pewnymi wariantami w zależności od kontekstu lub zdania, są normalizowane. Innymi słowy, istnieje jeden rdzeń, ale istnieje wiele wariantów tego samego słowa. Na przykład rdzeń to „eat”, a jego warianty to „eats”, eating, eaten itd.”. W ten sam sposób, z pomocą stemmingu w Python, możemy znaleźć rdzeń każdej odmiany.

Na przykład:

He was riding.
He was taking the ride.

W powyższych dwóch zdaniach znaczenie jest takie samo, czyli dotyczy jazdy konnej w przeszłości. Człowiek z łatwością zrozumie, że oba znaczenia są takie same. Jednak dla maszyn oba zdania są różne. W związku z tym trudno jest przekształcić je w ten sam wiersz danych. Jeśli nie dostarczymy tego samego zestawu danych, maszyna nie będzie w stanie przewidzieć. Konieczne jest zatem rozróżnienie 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 wyprowadzenie jego słowa kluczowego.

Wdrażajmy to za pomocą Python program. NLTK ma algorytm o nazwie Porter StemmerTen algorytm akceptuje listę tokenizowanych słów i przekształca je w słowa rdzeniowe.

Program do zrozumienia Stemmingu

from nltk.stem import PorterStemmer
e_words= ["wait", "waiting", "waited", "waits"]
ps =PorterStemmer()
for w in e_words:
    rootWord=ps.stem(w)
    print(rootWord)

Wyjście:

wait
wait
wait
wait

Code Wyjaśnienie:

  • W NLTK znajduje się moduł STEM, który został zaimportowany. Jeśli zaimportujemy cały moduł, program stanie się ciężki, ponieważ zawiera tysiące linii kodu. Dlatego z całego modułu STEM 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.
  • Przekazaliśmy je do PorterStemmera pojedynczo, używając pętli „for”. Na koniec otrzymaliśmy rdzeń każdego słowa wymienionego na liście.

Z powyższego wynika, że ​​stemming jest ważnym etapem wstępnego przetwarzania, ponieważ usuwa redundancję i zmienność w obrębie tego samego słowa. W rezultacie dane są filtrowane, co pomaga w lepszym szkoleniu maszyn. Teraz przekazujemy pełne zdanie i sprawdzamy jego wynik.

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

Code Wyjaśnienie:

  • Pakiet PorterStemmer jest importowany z modułu STEM.
  • Importowane są pakiety do tokenizacji zdań i słów.
  • Zapisywane jest zdanie, które w kolejnym kroku należy tokenizować.
  • Tutaj tworzony jest obiekt dla PorterStemmer.
  • Uruchomiona zostaje pętla, a rdzeniowanie każdego słowa odbywa się przy użyciu obiektu utworzonego w wierszu kodu 5.

Krótko mówiąc, stemming to moduł wstępnego przetwarzania danych. Język angielski ma wiele wariantów jednego słowa, co powoduje niejednoznaczność w uczeniu maszynowym i przewidywaniu. Aby zbudować skuteczny model, kluczowe jest filtrowanie takich słów do tych samych danych sekwencyjnych za pomocą stemmingu. Jest to również znane jako normalizacja.

Co to jest lematyzacja?

Lemmatyzacja W NLTK to algorytmiczny proces znajdowania lematu słowa w zależności od jego znaczenia i kontekstu. Lematyzacja zazwyczaj odnosi się do analizy morfologicznej słów, której celem jest usunięcie końcówek fleksyjnych. Pomaga ona w zwróceniu formy bazowej lub słownikowej słowa, zwanej lematem. Metoda lematyzacji w NLTK opiera się na wbudowanej funkcji morphingu w WordNet. 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 jako to samo, ale istnieje różnica między stemmingiem a lematyzacją. Lematyzacja jest preferowana z poniższego powodu.

Dlaczego lematyzacja jest lepsza od Stemmingu?

Algorytm stemmingu działa poprzez odcięcie sufiksu ze słowa. W szerszym sensie, odcina początek lub koniec słowa. Z kolei lematyzacja jest operacją bardziej zaawansowaną, uwzględniającą analizę morfologiczną słów. Zwraca lemat, który jest formą bazową wszystkich form fleksyjnych. Do tworzenia słowników i wyszukiwania właściwej formy słowa wymagana jest dogłębna wiedza lingwistyczna. Stemming to operacja ogólna, podczas gdy lematyzacja to operacja inteligentna, polegająca na wyszukiwaniu właściwej formy w słowniku. Zatem lematyzacja pomaga w tworzeniu lepszych uczenie maszynowe funkcje.

Code rozróżniać lematyzację i stemming

Przybitka Code:

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

Lemmatyzacja Code:

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 spojrzymy na stemming dla studies i teaching, wynik jest taki sam (studi), ale lematyzator NLTK generuje inny lemat dla obu tokenów: teaching dla studies i teaching dla teaching. Dlatego gdy potrzebujemy stworzyć zestaw cech do trenowania maszyny, lematyzacja byłaby idealnym rozwiązaniem.

Przypadek użycia Lemmatizera

Lemmatizer minimalizuje niejednoznaczność tekstu. Słowa takie jak „rower” lub „rowery” są konwertowane na słowo bazowe „rower”. Konwertuje wszystkie słowa o tym samym znaczeniu, ale o innej reprezentacji, na ich formę bazową, zmniejszając gęstość słów i…ping Przygotuj dokładne cechy do trenowania maszyny. Im czystsze dane, tym dokładniejszy będzie Twój model uczenia maszynowego. Lemmatizer NLTK oszczędza również pamięć i zmniejsza 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)

Wyjście:

guru99 => guru99
is => be
totally => totally
new => new
kind => kind
of => of
learning => learn
experience => experience
. => .

Code Wyjaśnienie:

  • Importowany jest czytnik korpusu WordNet i moduł WordNetLemmatizer importowany z WordNet.
  • Tokenizacja słów i znaczniki części mowy są importowane z nltk, a słownik domyślny z kolekcji.
  • Tworzony jest słownik, w którym pierwsza litera znacznika pos_tag stanowi klucz, mapowany na wartość ze słownika Wordnet.
  • Tekst zostaje zapisany i podzielony na tokeny, a następnie tworzony jest obiekt lemma_function przeznaczony do użycia wewnątrz pętli.
  • Pętla jest uruchamiana, a funkcja lematize przyjmuje dwa argumenty: token i mapęping pos_tag z wartością wordnet.

Python Lematyzacja ma ścisły związek z Słownik WordNet, dlatego też tak ważne jest, aby zgłębić ten temat.

FAQ

Stemmer Portera to klasa PorterStemmer z NLTK. Stosuje ona suffix-stripping reguły algorytmu Martina Portera z 1980 r. służącego do redukcji angielskich słów do ich rdzenia, dzięki czemu „waiting”, „waited” i „waits” stają się „wait”.

Stosuj stemming, gdy szybkość i prostota są ważniejsze niż czytelność, na przykład w indeksowaniu wyszukiwania, analizie sentymentów na dużą skalę lub redukcji cech. Wybierz lematyzację, gdy wynik musi być poprawnym, zrozumiałym dla człowieka słowem.

Normalizacja tekstu przekształca różne formy słowa w jedną wspólną reprezentację. Stemming i lematyzacja to dwie techniki normalizacji, które zmniejszają gęstość słów, dzięki czemu model traktuje warianty takie jak „study” i „studies” jako pojedynczą cechę.

NLTK udostępnia narzędzie PorterStemmer (i inne narzędzia, takie jak Snowball) do stemmingu oraz narzędzie WordNetLemmatizer do lematyzacji. Narzędzie to wykorzystuje słownik WordNet, aby zwrócić poprawną formę bazową każdego słowa.

Usuwają zbędne warianty słów, dzięki czemu model uczenia maszynowego dostrzega czystsze, mniej wymiarowe cechy. Mniej zduplikowanych tokenów oznacza mniej niejednoznaczności podczas treningu i dokładniejsze przewidywania w oparciu o niewidziany tekst.

Nowoczesne modele sztucznej inteligencji automatycznie wnioskują o kontekście, ale WordNetLemmatizer NLTK potrzebuje znacznika części mowy do ujednoznacznienia. Podanie tego znacznika pozwala mu wybrać odpowiedni lemat, na przykład zamienić „uczenie się” na „uczyć się” po oznaczeniu go jako czasownika.

Słowo może być rzeczownikiem lub czasownikiem z różnymi lemmatami. Bez znacznika części mowy, WordNetLemmatizer zakłada rzeczownik. Podanie odpowiedniego znacznika, takiego jak czasownik lub przymiotnik, daje poprawną formę podstawową.

Nie. Odmiana rdzeniowa dotyczy tylko sufiksów, więc „studies” staje się „studi”, a „cries” staje się „cri”, co nie jest poprawnym słowem. Lematyzacja natomiast zawsze zwraca prawdziwe słowo słownikowe, takie jak „study”.

Podsumuj ten post następująco: