Stemming și lematizare în Python NLTK cu exemple

În ce este stemming și lematizare Python NLTK?

Stemming și lematizare in Python NLTK sunt tehnici de normalizare a textului pentru procesarea limbajului natural. Aceste tehnici sunt utilizate pe scară largă pentru preprocesarea textului. Diferența dintre stemming și lematizare este că stemming este mai rapid, deoarece taie cuvintele fără a cunoaște contextul, în timp ce lematizarea este mai lentă, deoarece cunoaște contextul cuvintelor înainte de procesare.

Ce este Stemming?

Pentru a putea reduce este o metodă de normalizare a cuvintelor în Procesarea limbajului natural. Este o tehnică în care un set de cuvinte dintr-o propoziție este convertit într-o secvență pentru a scurta căutarea acesteia. În această metodă, sunt normalizate cuvintele care au același sens dar au unele variații în funcție de context sau propoziție.

Cu un alt cuvânt, există un cuvânt rădăcină, dar există multe variații ale acelorași cuvinte. De exemplu, cuvântul rădăcină este „mănâncă” și variațiile sale sunt „mănâncă, mănâncă, mănâncă și așa”. În același mod, cu ajutorul Stemming in Python, putem găsi cuvântul rădăcină al oricăror variații.

De exemplu

He was riding.	
He was taking the ride.

În cele două propoziții de mai sus, sensul este același, adică activitatea de călărie în trecut. Un om poate înțelege cu ușurință că ambele sensuri sunt aceleași. Dar pentru mașini, ambele propoziții sunt diferite. Astfel, a devenit dificil să îl convertești în același rând de date. În cazul în care nu oferim același set de date, atunci mașina nu reușește să prezică. Prin urmare, este necesar să se diferențieze sensul fiecărui cuvânt pentru a pregăti setul de date pentru învățarea automată. Și aici stemming este folosit pentru a clasifica același tip de date prin obținerea cuvântului său rădăcină.

Să implementăm asta cu a Python program.NLTK are un algoritm numit „PorterStemmer”. Acest algoritm acceptă lista de cuvinte tokenizate și o transformă în cuvânt rădăcină.

Program pentru înțelegerea Stemming

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

producție:

wait	
wait	
wait	
wait 

Program pentru înțelegerea stemming

Explicația codului:

  • Există un modul stem în NLTk care este importat. Dacă importați modulul complet, atunci programul devine greu deoarece conține mii de linii de coduri. Deci, din întregul modul stem, am importat doar „PorterStemmer”.
  • Am pregătit o listă inactivă a datelor de variație ale aceluiași cuvânt.
  • Este creat un obiect care aparține clasei nltk.stem.porter.PorterStemmer.
  • În plus, l-am transmis lui PorterStemmer unul câte unul folosind bucla „for”. În cele din urmă, am obținut cuvântul rădăcină de ieșire pentru fiecare cuvânt menționat în listă.

Din explicația de mai sus, se poate de asemenea concluziona că stemming-ul este considerat un pas important de preprocesare deoarece a eliminat redundanța datelor și variațiile din același cuvânt. Ca rezultat, datele sunt filtrate, ceea ce va ajuta la o mai bună pregătire a mașinii.

Acum transmitem o propoziție completă și verificăm comportamentul acesteia ca rezultat.

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)

ieșire:

hello	
guru99	
,	
you	
have	
build	
a	
veri	
good	
site	
and	
I	
love	
visit	
your	
site	 

Program pentru înțelegerea stemming

Explicația codului:

  • Pachetul PorterStemer este importat din stem modulului
  • Sunt importate pachete pentru tokenizarea propoziției, precum și a cuvintelor
  • Se scrie o propoziție care urmează să fie simbolizată în pasul următor.
  • Lematizarea care determină tokenizarea cuvântului este implementată în acest pas.
  • Aici este creat un obiect pentru PorterStemmer.
  • Bucla este rulată și ramificarea fiecărui cuvânt se face folosind obiectul creat în linia de cod 5

Concluzie:

Stemming este un modul de preprocesare a datelor. Limba engleză are multe variante ale unui singur cuvânt. Aceste variații creează ambiguitate în instruirea și predicția învățării automate. Pentru a crea un model de succes, este vital să filtrați astfel de cuvinte și să convertiți la același tip de date secvențiale folosind stemming. De asemenea, aceasta este o tehnică importantă pentru a obține date de rând dintr-un set de propoziții și eliminarea datelor redundante cunoscute și sub numele de normalizare.

Ce este lematizarea?

Lematizarea în NLTK este procesul algoritmic de găsire a lemei unui cuvânt în funcție de sensul și contextul acestuia. Lematizarea se referă de obicei la analiza morfologică a cuvintelor, care are ca scop eliminarea terminațiilor flexive. Ajută la returnarea formei de bază sau de dicționar a unui cuvânt cunoscut sub numele de lemă.

Metoda de lematizare NLTK se bazează pe funcția morph încorporată din WorldNet. Preprocesarea textului include atât derivarea, cât și lematizarea. Mulți oameni consideră cei doi termeni confuzi. Unii le tratează ca la fel, dar există o diferență între stemming și lematizare. Lematizarea este preferată față de prima din cauza motivului de mai jos.

De ce este mai bună lematizarea decât stemming?

Algoritmul stemming funcționează prin tăierea sufixului din cuvânt. Într-un sens mai larg, decupează fie începutul, fie sfârșitul cuvântului.

Dimpotrivă, lematizarea este o operație mai puternică și ia în considerare analiza morfologică a cuvintelor. Returnează lema care este forma de bază a tuturor formelor sale de flexiune. Sunt necesare cunoștințe lingvistice aprofundate pentru a crea dicționare și pentru a căuta forma potrivită a cuvântului. Stemming este o operație generală, în timp ce lematizarea este o operație inteligentă în care forma potrivită va fi căutată în dicționar. Prin urmare, lematizarea ajută la formarea mai bună masina de învățare caracteristici.

Cod pentru a distinge între lematizare și stemming

Cod de bază:

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)))  

ieșire::

Stemming for studies is studi
Stemming for studying is studi
Stemming for cries is cri
Stemming for cry is cri

Cod de lematizare:

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)))  

ieșire:

Lemma for studies is study
Lemma for studying is studying
Lemma for cries is cry
Lemma for cry is cry

Discuție despre ieșire

Dacă te uiți la bază pentru studii și studiu, rezultatul este același (studi), dar lematizatorul NLTK oferă lemă diferită pentru ambele simboluri, studiul pentru studii și studiul pentru studiu. Deci, atunci când trebuie să facem un set de funcții pentru a antrena mașina, ar fi grozav dacă se preferă lematizarea.

Cazul de utilizare a Lematizerului

Lematizatorul minimizează ambiguitatea textului. Exemple de cuvinte precum bicicletă sau biciclete sunt convertite în cuvântul de bază bicicletă. Practic, va converti toate cuvintele care au același sens, dar o reprezentare diferită la forma lor de bază. Reduce densitatea cuvintelor din textul dat și ajută la pregătirea caracteristicilor precise pentru mașina de antrenament. Mai curate datele, cu atât mai inteligent și mai precis va fi modelul dvs. de învățare automată. NLTK Lemmatizer va economisi, de asemenea, memorie, precum și costuri de calcul.

Exemplu în timp real care arată utilizarea lematizării Wordnet și a etichetării POS 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)

Cazul de utilizare a Lematizerului

Explicarea codului

  • În primul rând, este importat corpus reader wordnet.
  • WordNetLemmatizer este importat din wordnet.
  • Tokenizarea cuvântului, precum și părțile etichetei de vorbire sunt importate din nltk.
  • Dicționarul implicit este importat din colecții.
  • Dicționarul este creat unde pos_tag (prima literă) sunt valorile cheie ale căror valori sunt mapate cu valoarea din dicționarul wordnet. Am luat singura prima literă, așa cum o vom folosi mai târziu în buclă.
  • Textul este scris și este simbolizat.
  • Este creat obiectul lemma_function care va fi folosit în interiorul buclei.
  • Loop este rulat și lematize va lua două argumente, unul este token și celălalt este o mapare a pos_tag cu valoare wordnet.

producție:

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

Python Lematizarea are o strânsă legătură cu dicționar wordnet, deci este esențial să studiem acest subiect, așa că îl păstrăm ca următor subiect.