Stamning och lemmatisering in Python NLTK med exempel

⚡ Smart sammanfattning

Stemming och lemmatisering är textnormaliseringstekniker i Python NLTK som reducerar ordvariationer till en gemensam bas, där stamning av beskär suffix snabbt utan kontext och lemmatisering returnerar ett sant ordboksord med betydelse.

  • ???? Stammning: PorterStemmer beskär suffix för att nå en rot som kanske inte är ett riktigt ord.
  • 📚 Lemmatisering: WordNetLemmatizer returnerar ordbokens basform, kallad lemma.
  • ⚖️ Skillnad: Stambildning är snabbare, lemmatisering är långsammare men mer exakt och kontextmedveten.
  • 🔤 Normalisering: Båda minskar orddensiteten så att maskiner behandlar varianter som en enda funktion.
  • 🏷️ POS-taggar: Att skicka med en ordklass-tagg gör lemmatiseraren mycket mer precis.
  • 🤖 AI-fördel: Renare normaliserad text ger starkare maskininlärningsfunktioner och modeller.

Stamning och lemmatisering in Python Nltk

Vad är stam och lemmatisering i Python NLTK?

Stamning och lemmatisering in Python NLTK är textnormaliseringstekniker för naturlig språkbehandling (NLTK). Dessa tekniker används ofta för textförbehandling. Skillnaden mellan stemming och lemmatisering är att stemming är snabbare eftersom den klipper ut ord utan att känna till sammanhanget, medan lemmatisering är långsammare eftersom den känner till ordens sammanhang innan bearbetning.

Vad är Stemming?

stemming är en metod för att normalisera ord i Naturlig språkbehandlingDet är en teknik där en uppsättning ord i en mening omvandlas till en sekvens för att förkorta sökningen. I den här metoden normaliseras ord som har samma betydelse men vissa variationer beroende på sammanhanget eller meningen. Med andra ord finns det ett rotord, men det finns många variationer av samma ord. Till exempel är rotordet "äta" och dess variationer är "äter, ätande, ätit och så vidare". På samma sätt, med hjälp av stämmning i Python, kan vi hitta rotordet till vilken variant som helst.

Till exempel:

He was riding.
He was taking the ride.

I de två meningarna ovan är betydelsen densamma, det vill säga en ridaktivitet i det förflutna. En människa kan lätt förstå att båda betydelserna är desamma. Men för maskiner är båda meningarna olika. Därför blir det svårt att konvertera dem till samma datarad. Om vi ​​inte tillhandahåller samma datamängd misslyckas maskinen med att förutsäga. Så det är nödvändigt att differentiera betydelsen av varje ord för att förbereda datamängden för maskininlärning. Här används stemming för att kategorisera samma typ av data genom att hämta dess rotord.

Låt oss genomföra detta med en Python program. NLTK har en algoritm som heter PorterStemmerDenna algoritm accepterar listan med tokeniserade ord och stammar av dem till rotord.

Program för att förstå stam

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

Produktion:

wait
wait
wait
wait

Code Förklaring:

  • Det finns en stammodul i NLTK som importeras. Om du importerar hela modulen blir programmet tungt eftersom det innehåller tusentals rader kod. Så från hela stammodulen importerade vi bara "PorterStemmer".
  • Vi förberedde en dummylista med variationsdata för samma ord.
  • Ett objekt skapas som tillhör klassen nltk.stem.porter.PorterStemmer.
  • Vi skickade den till PorterStemmer en efter en med hjälp av en "for"-loop. Slutligen fick vi rotordet för varje ord som nämndes i listan.

Av ovanstående utgångspunkt är stemming ett viktigt förbehandlingssteg eftersom det tar bort redundans och variationer i samma ord. Som ett resultat filtreras data, vilket bidrar till bättre maskinträning. Nu skickar vi en komplett mening och kontrollerar dess utdata.

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)

Produktion:

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

Code Förklaring:

  • Paketet PorterStemmer importeras från modulens stem.
  • Paket för tokenisering av både meningar och ord importeras.
  • En mening skrivs som ska tokeniseras i nästa steg.
  • Ett objekt för PorterStemmer skapas här.
  • En loop körs och stemming av varje ord görs med hjälp av objektet som skapades i kodrad 5.

Kort sagt är stemming en modul för dataförbehandling. Det engelska språket har många varianter av ett enda ord, vilket skapar tvetydighet i maskininlärningsträning och prediktioner. För att bygga en framgångsrik modell är det viktigt att filtrera sådana ord till samma sekvenserade data med hjälp av stemming. Detta kallas även normalisering.

Vad är lemmatisering?

lemmatisering I NLTK är lemmatisering den algoritmiska processen att hitta ett ords lemma beroende på dess betydelse och kontext. Lemmatisering hänvisar vanligtvis till morfologisk analys av ord, vars syfte är att ta bort böjningsändelser. Det hjälper till att returnera grund- eller ordboksformen av ett ord, känd som lemma. NLTK:s lemmatiseringsmetod är baserad på WordNets inbyggda morffunktion. Textförbehandling inkluderar både stamning och lemmatisering. Många tycker att de två termerna är förvirrande. Vissa behandlar dessa som samma sak, men det finns en skillnad mellan stamning och lemmatisering. Lemmatisering föredras framför den förra av anledningen nedan.

Varför är Lemmatisering bättre än Stemming?

Stamningsalgoritmen fungerar genom att ta bort suffixet från ordet. I en bredare bemärkelse tar den bort antingen början eller slutet av ordet. Lemmatisering är däremot en kraftfullare operation, och den tar hänsyn till den morfologiska analysen av orden. Den returnerar lemmat, vilket är basformen för alla dess böjningsformer. Djupgående språkkunskaper krävs för att skapa ordböcker och leta efter ordets korrekta form. Stamning är en generell operation, medan lemmatisering är en intelligent operation där den korrekta formen slås upp i ordboken. Därför hjälper lemmatisering till att bilda bättre... maskininlärning funktioner.

Code att skilja mellan lemmatisering och stemming

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

Produktion:

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

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

Produktion:

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

Diskussion om output

Om man tittar på stemming för studier och studerande är utdata densamma (studi), men NLTK-lemmatiseraren tillhandahåller ett annat lemma för båda tokens: studera för studier och studera för studerande. Så när vi behöver skapa en funktionsuppsättning för att träna en maskin vore det bra om lemmatisering föredras.

Använd Case of Lemmatizer

Lemmatiseraren minimerar textens tvetydighet. Ord som cykel eller cyklar konverteras till grundordet cykel. Den konverterar alla ord med samma betydelse men olika representation till deras grundform, vilket minskar orddensiteten och helvetet.ping förbered noggranna funktioner för att träna en maskin. Ju renare data, desto mer exakt blir din maskininlärningsmodell. NLTK Lemmatizer sparar också minne och beräkningskostnader.

Realtidsexempel som visar användningen av WordNet-lemmatisering och POS-taggning i 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)

Produktion:

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

Code Förklaring:

  • Korpusläsaren Wordnet importeras, och WordNetLemmatizer importeras från Wordnet.
  • Ordtokenisering och ordklasstaggar importeras från nltk och standardordlistan från samlingar.
  • En ordbok skapas där den första bokstaven i pos_tag är nyckeln, mappad till värdet från wordnet-ordboken.
  • Texten skrivs och tokeniseras, och objektet lemma_function skapas för användning inuti loopen.
  • Loopen körs, och lemmatize tar två argument: token och en mappning.ping av pos_tag med wordnet-värdet.

Python Lemmatisering har ett nära samband med WordNet-ordbok, så det är viktigt att studera det ämnet härnäst.

Vanliga frågor

Porter-stemmern är NLTK:s PorterStemmer-klass. Den använder suffix-stripping regler från Martin Porters algoritm från 1980 för att reducera engelska ord till deras stam, så att ”waiting”, ”waited” och ”waits” alla blir ”wait”.

Använd stamning när snabbhet och enkelhet är viktigare än läsbarhet, till exempel vid sökindexering, storskalig sentimentanalys eller funktionsreducering. Välj lemmatisering när utdata måste vara ett giltigt, människoläsligt ord.

Textnormalisering omvandlar olika former av ett ord till en gemensam representation. Ordstamning och lemmatisering är två normaliseringstekniker som minskar ordtätheten, så en modell behandlar varianter som "studie" och "studier" som en enda funktion.

NLTK tillhandahåller PorterStemmer (och andra stammverktyg som Snowball) för stamning, och WordNetLemmatizer för lemmatisering. Lemmatiseraren förlitar sig på WordNet-ordboken för att returnera den korrekta grundformen av varje ord.

De tar bort redundanta ordvariationer, så att en maskininlärningsmodell ser renare, lägre dimensionella funktioner. Färre duplicerade tokens innebär mindre tvetydighet under träning och mer exakta förutsägelser på osynlig text.

Moderna AI-modeller härleder kontext automatiskt, men NLTK:s WordNetLemmatizer behöver en ordklasstagg för att kunna tolka ordet tydligt. Genom att använda den taggen kan den välja rätt lemma, till exempel genom att omvandla "learning" till "learn" när det taggas som ett verb.

Ett ord kan vara ett substantiv eller ett verb med olika lemman. Utan en ordklasstagg antar WordNetLemmatizer att det är ett substantiv. Att skicka med rätt tagg, såsom verb eller adjektiv, ger den korrekta grundformen.

Nej. Avstamning tar bara bort suffix, så ”studier” blir ”studi” och ”cries” blir ”cri”, vilka inte är giltiga ord. Lemmatisering, däremot, returnerar alltid ett riktigt ordboksord som ”study”.

Sammanfatta detta inlägg med: