Stemming og lemmatisering i Python NLTK med eksempler

⚡ Smart oppsummering

Stemming og lemmatisering er tekstnormaliseringsteknikker i Python NLTK som reduserer ordvariasjoner til en felles base, der stammeavlinger raskt avler suffikser uten kontekst og lemmatisering returnerer et ekte ordbokord ved hjelp av betydning.

  • ???? Stemming: PorterStemmer beskjærer suffikser for å komme til en rot som kanskje ikke er et ekte ord.
  • 📚 Lemmatisering: WordNetLemmatizer returnerer ordbokens basisform, kalt lemmaet.
  • 🇧🇷 Forskjell: Stemming er raskere, lemmatisering er tregere, men mer nøyaktig og kontekstbevisst.
  • 🔤 normalisering: Begge reduserer ordtettheten slik at maskiner behandler varianter som én funksjon.
  • 🏷️ POS-tagger: Å sende inn en ordklasse-tagg gjør lemmatisatoren mye mer presis.
  • 🤖 AI-fordel: Renere normalisert tekst produserer sterkere maskinlæringsfunksjoner og -modeller.

Stemming og lemmatisering i Python NLTK

Hva er stamme og lemmatisering i Python NLTK?

Stemming og lemmatisering in Python NLTK er tekstnormaliseringsteknikker for naturlig språkbehandling. Disse teknikkene er mye brukt for tekstforbehandling. Forskjellen mellom stemming og lemmatisering er at stemming er raskere fordi den kutter ord uten å kjenne konteksten, mens lemmatisering er tregere fordi den kjenner konteksten til ordene før behandling.

Hva er Stemming?

stemming er en metode for å normalisere ord i Natural Language ProcessingDet er en teknikk der et sett med ord i en setning konverteres til en sekvens for å forkorte oppslaget. I denne metoden normaliseres ord som har samme betydning, men noen variasjoner i henhold til konteksten eller setningen. Med andre ord er det ett rotord, men det finnes mange varianter av det samme ordet. For eksempel er rotordet «spise» og variasjonene er «spiser, spiser, spist og så videre». På samme måte, ved hjelp av stemming i Python, kan vi finne rotordet til enhver variant.

For eksempel:

He was riding.
He was taking the ride.

I de to setningene ovenfor er betydningen den samme, det vil si en rideaktivitet i fortiden. Et menneske kan lett forstå at begge betydningene er de samme. Men for maskiner er begge setningene forskjellige. Dermed blir det vanskelig å konvertere dem til samme datarad. Hvis vi ikke oppgir det samme datasettet, klarer ikke maskinen å forutsi. Så det er nødvendig å differensiere betydningen av hvert ord for å forberede datasettet for maskinlæring. Her brukes stemming for å kategorisere samme type data ved å finne rotordet.

La oss implementere dette med en Python program. NLTK har en algoritme som heter PorterStemmerDenne algoritmen godtar listen over tokeniserte ord og stammer dem til rotord.

Program for å forstå stammen

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

Utgang:

wait
wait
wait
wait

Code Forklaring:

  • Det finnes en stammodul i NLTK som importeres. Hvis du importerer hele modulen, blir programmet tungt ettersom det inneholder tusenvis av kodelinjer. Så fra hele stammodulen importerte vi bare «PorterStemmer».
  • Vi utarbeidet en dummy-liste med variasjonsdata for samme ord.
  • Det opprettes et objekt som tilhører klassen nltk.stem.porter.PorterStemmer.
  • Vi sendte dem til PorterStemmer én etter én ved hjelp av en «for»-løkke. Til slutt fikk vi rotordet til hvert ord som er nevnt i listen.

Ut fra det ovennevnte er stemming et viktig forbehandlingstrinn fordi det fjerner redundans og variasjoner i samme ord. Som et resultat filtreres data, noe som bidrar til bedre maskinopplæring. Nå sender vi en fullstendig setning og sjekker resultatet.

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)

Utgang:

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

Code Forklaring:

  • Pakken PorterStemmer importeres fra modulstammen.
  • Pakker for tokenisering av setninger så vel som ord importeres.
  • Det skrives en setning som skal tokeniseres i neste trinn.
  • Et objekt for PorterStemmer er laget her.
  • En løkke kjøres, og stemming av hvert ord gjøres ved hjelp av objektet som ble opprettet i kodelinje 5.

Kort sagt er stemming en modul for dataforbehandling. Det engelske språket har mange varianter av et enkelt ord, noe som skaper tvetydighet i maskinlæringstrening og prediksjon. For å bygge en vellykket modell er det viktig å filtrere slike ord inn i de samme sekvenserte dataene ved hjelp av stemming. Dette er også kjent som normalisering.

Hva er lemmatisering?

lemmatisering I NLTK er lemmatisering den algoritmiske prosessen med å finne lemmaet til et ord avhengig av dets betydning og kontekst. Lemmatisering refererer vanligvis til morfologisk analyse av ord, som har som mål å fjerne bøyningsendelser. Det hjelper med å returnere grunnformen eller ordboksformen til et ord, kjent som lemmaet. NLTKs lemmatiseringsmetoden er basert på WordNets innebygde morffunksjon. Tekstforbehandling inkluderer både stemming og lemmatisering. Mange synes de to begrepene er forvirrende. Noen behandler disse som det samme, men det er en forskjell mellom stemming og lemmatisering. Lemmatisering foretrekkes fremfor førstnevnte av grunnen nedenfor.

Hvorfor er Lemmatisering bedre enn Stemming?

Stammingsalgoritmen fungerer ved å kutte suffikset fra ordet. I en bredere forstand kutter den enten begynnelsen eller slutten av ordet. Lemmatisering er derimot en kraftigere operasjon, og den tar hensyn til den morfologiske analysen av ordene. Den returnerer lemmaet, som er grunnformen til alle bøyningsformene. Dyptgående språklig kunnskap er nødvendig for å lage ordbøker og lete etter den riktige formen av ordet. Stamming er en generell operasjon, mens lemmatisering er en intelligent operasjon der den riktige formen slås opp i ordboken. Derfor bidrar lemmatisering til å danne bedre maskinlæring funksjoner.

Code å skille mellom lemmatisering og 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)))

Utgang:

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

Utgang:

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

Diskusjon av output

Hvis du ser på stemming for studier og studying, er utdataene det samme (studi), men NLTK-lemmatisereren gir et annet lemma for begge tokenene: study for studier og studying for studying. Så når vi trenger å lage et funksjonssett for å trene en maskin, ville det være flott om lemmatisering foretrekkes.

Bruk Case of Lemmatizer

Lemmatisatoren minimerer teksttvetydighet. Ord som sykkel eller sykler konverteres til grunnordet sykkel. Den konverterer alle ord med samme betydning, men ulik representasjon, til grunnformen, noe som reduserer ordtettheten og hel.ping klargjør nøyaktige funksjoner for trening av en maskin. Jo renere dataene er, desto mer nøyaktig blir maskinlæringsmodellen din. NLTK Lemmatizer sparer også minne og beregningskostnader.

Sanntidseksempel som viser bruk av WordNet-lemmatisering og POS-tagging 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)

Utgang:

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

Code Forklaring:

  • Korpusleseren Wordnet importeres, og WordNetLemmatizer importeres fra Wordnet.
  • Ordtokenisering og ordklassetagger importeres fra nltk, og standardordbok fra samlinger.
  • Det opprettes en ordbok der den første bokstaven i pos_tag er nøkkelen, tilordnet verdien fra wordnet-ordboken.
  • Teksten skrives og tokeniseres, og objektet lemma_function opprettes for bruk inne i løkken.
  • Løkken kjøres, og lemmatize tar to argumenter: tokenet og et kart.ping av pos_tag med wordnet-verdien.

Python Lemmatisering har en nær sammenheng med WordNet-ordbok, så det er viktig å studere dette emnet videre.

Spørsmål og svar

Porter-stemmeren er NLTKs PorterStemmer-klasse. Den bruker suffiks-stripeping regler fra Martin Porters algoritme fra 1980 for å redusere engelske ord til stammen, slik at «waiting», «waited» og «waits» alle blir til «wait».

Bruk stemming når hastighet og enkelhet er viktigere enn lesbarhet, for eksempel ved søkeindeksering, storskala sentimentanalyse eller funksjonsreduksjon. Velg lemmatisering når resultatet må være et gyldig, menneskelig lesbart ord.

Tekstnormalisering konverterer ulike former av et ord til én felles representasjon. Ordstamme og lemmatisering er to normaliseringsteknikker som reduserer ordtetthet, slik at en modell behandler varianter som «studie» og «studier» som én enkelt funksjon.

NLTK tilbyr PorterStemmer (og andre stammere som Snowball) for stemming, og WordNetLemmatizer for lemmatisering. Lemmatisatoren er avhengig av WordNet-ordboken for å returnere riktig grunnform av hvert ord.

De fjerner overflødige ordvariasjoner, slik at en maskinlæringsmodell ser renere, lavere dimensjonale funksjoner. Færre dupliserte tokens betyr mindre tvetydighet under trening og mer nøyaktige prediksjoner på usett tekst.

Moderne AI-modeller utleder kontekst automatisk, men NLTKs WordNetLemmatizer trenger en ordklasse-tagg for å tydeliggjøre. Ved å bruke denne taggen kan den velge riktig lemma, for eksempel å gjøre «learning» om til «learn» når det er tagget som et verb.

Et ord kan være et substantiv eller et verb med forskjellige lemmaer. Uten en ordklasse-tagg antar WordNetLemmatizer et substantiv. Å bruke riktig tagg, for eksempel verb eller adjektiv, gir riktig grunnform.

Nei. Stamming fjerner bare suffikser, så «studier» blir til «studi» og «cries» blir til «cri», som ikke er gyldige ord. Lemmatisering, derimot, returnerer alltid et ekte ordbokord som «studie».

Oppsummer dette innlegget med: