Stemming og lemmatisering i Python NLTK med eksempler

Hvad er stamning og lemmatisering i Python NLTK?

Stemming og Lematisering in Python NLTK er tekstnormaliseringsteknikker til naturlig sprogbehandling. Disse teknikker er meget brugt til tekstforbehandling. Forskellen mellem stemming og lemmatisering er, at stemming er hurtigere, da den skærer ord uden at kende konteksten, mens lemmatisering er langsommere, da den kender konteksten af ​​ord før behandling.

Hvad er Stemming?

Tilsyn er en metode til normalisering af ord i Natural Language Processing. Det er en teknik, hvor et sæt ord i en sætning konverteres til en sekvens for at forkorte dets opslag. I denne metode normaliseres ordene, der har samme betydning, men har nogle variationer i henhold til konteksten eller sætningen.

Med et andet ord er der ét rodord, men der er mange variationer af de samme ord. For eksempel er grundordet "spise", og dets variationer er "spiser, spiser, spist og sådan". På samme måde med hjælp fra Stemming in Python, kan vi finde rodordet for enhver variation.

For eksempel

He was riding.	
He was taking the ride.

I de to ovenstående sætninger er betydningen den samme, dvs. rideaktivitet i fortiden. Et menneske kan nemt forstå, at begge betydninger er de samme. Men for maskiner er begge sætninger forskellige. Det blev derfor svært at konvertere det til den samme datarække. Hvis vi ikke leverer det samme datasæt, kan maskinen ikke forudsige. Så det er nødvendigt at differentiere betydningen af ​​hvert ord for at forberede datasættet til maskinlæring. Og her bruges stemming til at kategorisere den samme type data ved at få dets rodord.

Lad os implementere dette med en Python program.NLTK har en algoritme kaldet "PorterStemmer". Denne algoritme accepterer listen over tokeniserede ord og omdanner det til rodord.

Program til at forstå 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)

Produktion:

wait	
wait	
wait	
wait 

Program til at forstå stammen

Kodeforklaring:

  • Der er et stammodul i NLTk som importeres. Hvis du importerer hele modulet, bliver programmet tungt, da det indeholder tusindvis af linjer med koder. Så fra hele stammemodulet importerede vi kun "PorterStemmer."
  • Vi udarbejdede en dummy-liste over variationsdata af det samme ord.
  • Der oprettes et objekt, som tilhører klassen nltk.stem.porter.PorterStemmer.
  • Yderligere sendte vi den til PorterStemmer en efter en ved hjælp af "for" loop. Til sidst fik vi output-rodord for hvert ord nævnt på listen.

Ud fra ovenstående forklaring kan det også konkluderes, at stemming betragtes som et vigtigt forbehandlingstrin, fordi det fjernede redundans i dataene og variationer i det samme ord. Som et resultat filtreres data, hvilket vil hjælpe med bedre maskintræning.

Nu sender vi en hel sætning og kontrollerer dens opførsel som output.

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)

Output:

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

Program til at forstå stammen

Kodeforklaring:

  • Pakke PorterStemer importeres fra modulstamme
  • Pakker til tokenisering af sætning samt ord importeres
  • Der skrives en sætning, som skal tokeniseres i næste trin.
  • Ordtokenisering, der stammer fra lemmatisering, implementeres i dette trin.
  • Her oprettes et objekt til PorterStemmer.
  • Loop køres, og stemming af hvert ord udføres ved hjælp af objektet oprettet i kodelinje 5

konklusion:

Stemming er et data-forbehandlingsmodul. Det engelske sprog har mange variationer af et enkelt ord. Disse variationer skaber tvetydighed i maskinlæringstræning og forudsigelse. For at skabe en succesfuld model er det vigtigt at filtrere sådanne ord og konvertere til den samme type sekvenserede data ved hjælp af stemming. Dette er også en vigtig teknik til at få rækkedata fra et sæt sætninger og fjernelse af overflødige data, også kendt som normalisering.

Hvad er lemmatisering?

lemmatisering i NLTK er den algoritmiske proces med at finde et ords lemma afhængigt af dets betydning og kontekst. Lemmatisering refererer normalt til den morfologiske analyse af ord, som har til formål at fjerne bøjningsendelser. Det hjælper med at returnere basis- eller ordbogsformen af ​​et ord kendt som lemma.

NLTK Lemmatiseringsmetoden er baseret på WorldNets indbyggede morph-funktion. Tekstforbehandling omfatter både stammering og lemmatisering. Mange mennesker finder de to udtryk forvirrende. Nogle behandler disse som det samme, men der er en forskel mellem stemming vs lemmatisering. Lemmatisering foretrækkes frem for førstnævnte på grund af nedenstående årsag.

Hvorfor er Lemmatisering bedre end Stemming?

Stemming-algoritmen fungerer ved at skære suffikset fra ordet. I bredere forstand skærer enten begyndelsen eller slutningen af ​​ordet.

Tværtimod er lemmatisering en mere kraftfuld operation, og den tager hensyn til morfologisk analyse af ordene. Det returnerer lemmaet, som er grundformen for alle dets bøjningsformer. Der kræves dybtgående sproglig viden for at skabe ordbøger og lede efter ordets rette form. Stemming er en generel operation, mens lemmatisering er en intelligent operation, hvor den korrekte form vil blive kigget i ordbogen. Derfor hjælper lemmatisering med at danne bedre machine learning funktioner.

Kode til at skelne mellem Lemmatisering og Stemming

Stamkode:

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

Output::

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

Lematiseringskode:

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

Output:

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

Diskussion af output

Hvis du ser ud til at stamme efter studier og studier, er output det samme (studi), men NLTK lemmatizer giver forskellige lemmaer for både tokens-studie til studier og studier for at studere. Så når vi skal lave funktionssæt til at træne maskine, ville det være fantastisk, hvis lemmatisering foretrækkes.

Brug Case of Lemmatizer

Lemmatizer minimerer tekstens uklarhed. Eksempelord som cykel eller cykler konverteres til grundord cykel. Grundlæggende vil det konvertere alle ord, der har samme betydning, men forskellig repræsentation, til deres basisform. Det reducerer ordtætheden i den givne tekst og hjælper med at forberede de nøjagtige funktioner til træningsmaskine. Renere data, jo mere intelligent og nøjagtig vil din maskinlæringsmodel være. NLTK Lemmatizer sparer også hukommelse såvel som beregningsomkostninger.

Realtidseksempel, der viser brugen af ​​Wordnet Lemmatization og POS-tagging 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)

Brug Case of Lemmatizer

Kode Forklaring

  • For det første importeres korpuslæserens wordnet.
  • WordNetLemmatizer importeres fra wordnet.
  • Word tokenize såvel som dele af tale-tag importeres fra nltk.
  • Standardordbog importeres fra samlinger.
  • Ordbog oprettes, hvor pos_tag (første bogstav) er nøgleværdierne, hvis værdier er afbildet med værdien fra wordnet-ordbogen. Vi har taget det eneste første bogstav, da vi vil bruge det senere i løkken.
  • Teksten er skrevet og er tokeniseret.
  • Objekt lemma_function oprettes, som vil blive brugt inde i løkken.
  • Loop køres, og lemmatize vil tage to argumenter, det ene er token, og det andet er en mapping af pos_tag med wordnet-værdi.

Produktion:

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

Python Lematisering har en tæt sammenhæng med wordnet ordbog, så det er vigtigt at studere dette emne, så vi beholder dette som det næste emne.