Stemming ja lemmatisaatio sisään Python NLTK esimerkkien kanssa

⚡ Älykäs yhteenveto

Vartalon luominen ja lemmatisointi ovat tekstin normalisointitekniikoita, Python NLTK, joka supistaa sanavariaatiot yhteiseen kantaan, jossa rungon muodostamat sadot muodostavat päätteitä nopeasti ilman kontekstia ja lemmatisointi palauttaa todellisen sanakirjasanan merkityksen avulla.

  • 🌱 Varsinainen: PorterStemmerin mukaan sananjuurta ei välttämättä löydy suffikseista.
  • 📚 Lemmatisaatio: WordNetLemmatizer palauttaa sanakirjan perusmuodon eli lemman.
  • 🇧🇷 Ero: Vartalon luonti on nopeampaa, lemmatisointi hitaampaa, mutta tarkempaa ja kontekstitietoisempaa.
  • 🔤 normalisointi: Molemmat pienentävät sanatiheyttä, jotta koneet käsittelevät variantteja yhtenä ominaisuutena.
  • 🏷️ Myyntipistetunnisteet: Sanaluokatagin välittäminen tekee lemmatisoijasta paljon tarkemman.
  • 🤖 Tekoälyn hyöty: Puhtaampi normalisoitu teksti tuottaa vahvempia koneoppimisominaisuuksia ja -malleja.

Stemming ja lemmatisaatio sisään Python NLTK

Mitä stemming ja lemmatisaatio ovat Python NLTK?

Stemming ja lemmatisaatio in Python NLTK on luonnollisen kielen käsittelyyn tarkoitettu tekstin normalisointitekniikka. Näitä tekniikoita käytetään laajalti tekstin esikäsittelyyn. Stemmauksen ja lemmatisoinnin välinen ero on se, että stemmaus on nopeampi, koska se leikkaa sanoja tuntematta kontekstia, kun taas lemmatisointi on hitaampaa, koska se tietää sanojen kontekstin ennen käsittelyä.

Mikä on Stemming?

Sanan vartalo on menetelmä sanojen normalisoimiseksi Luonnollinen kielen käsittelySe on tekniikka, jossa lauseen sanajoukko muunnetaan jonoksi hakujen lyhentämiseksi. Tässä menetelmässä sanat, joilla on sama merkitys, mutta joitain variaatioita asiayhteydestä tai lauseesta riippuen, normalisoidaan. Toisin sanoen on yksi juurisana, mutta samasta sanasta on useita variaatioita. Esimerkiksi juurisana on ”syö” ja sen variaatiot ovat ”syö, syöminen, syödään ja niin edelleen”. Samalla tavalla, stemmingin avulla Python, voimme löytää minkä tahansa muunnelman kantasanan.

Esimerkiksi:

He was riding.
He was taking the ride.

Yllä olevissa kahdessa lauseessa merkitys on sama, eli ratsastustoiminta menneisyydessä. Ihminen ymmärtää helposti, että molemmat merkitykset ovat samat. Mutta koneille lauseet ovat erilaisia. Siksi niiden muuntaminen samaksi datariviksi on vaikeaa. Jos emme tarjoa samaa datajoukkoa, kone ei pysty ennustamaan. Siksi on tarpeen erottaa sanojen merkitys, jotta datajoukko voidaan valmistella koneoppimista varten. Tässä käytetään stemmausta saman datatyypin luokittelemiseen hakemalla sen juurisana.

Toteutetaan tämä käyttämällä Python ohjelma. NLTK:lla on algoritmi nimeltä PorterStemmerTämä algoritmi hyväksyy luettelon tokenisoiduista sanoista ja muodostaa niistä juurisanat.

Ohjelma johdon ymmärtämiseen

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

lähtö:

wait
wait
wait
wait

Code Selitys:

  • NLTK:ssa on stem-moduuli, joka tuodaan. Jos tuot koko moduulin, ohjelmasta tulee raskas, koska se sisältää tuhansia koodirivejä. Joten koko stem-moduulista tuotiin vain "PorterStemmer".
  • Laadimme valeluettelon saman sanan muunnelmatiedoista.
  • Luodaan objekti, joka kuuluu luokkaan nltk.stem.porter.PorterStemmer.
  • Välitimme sen PorterStemmerille yksi kerrallaan käyttämällä "for"-silmukkaa. Lopuksi saimme tulosteena jokaisen listassa mainitun sanan juurisanan.

Yllä olevan perusteella stemmaaminen on tärkeä esikäsittelyvaihe, koska se poistaa redundanssia ja variaatioita samasta sanasta. Tämän seurauksena data suodattuu, mikä auttaa parantamaan koneenkoulutusta. Nyt välitämme kokonaisen lauseen ja tarkistamme sen tulosteen.

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)

lähtö:

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

Code Selitys:

  • PorterStemmer-paketti tuodaan moduulin varresta.
  • Lauseiden ja sanojen tokenisointiin tarkoitetut paketit tuodaan.
  • Lause kirjoitetaan, joka tulee tokenisoida seuraavassa vaiheessa.
  • PorterStemmerin objekti luodaan tähän.
  • Suoritetaan silmukka ja jokaisen sanan vartalo muodostetaan koodirivillä 5 luodun objektin avulla.

Lyhyesti sanottuna stemmaus on datan esikäsittelymoduuli. Englannin kielessä on monia variaatioita yhdestä sanasta, mikä aiheuttaa epäselvyyttä koneoppimisen koulutuksessa ja ennustamisessa. Onnistuneen mallin rakentamiseksi on tärkeää suodattaa tällaiset sanat samaan sekvensoituun dataan stemmauksen avulla. Tätä kutsutaan myös normalisoinniksi.

Mitä on lemmatisaatio?

perusmuotoistaminen NLTK:ssa on algoritminen prosessi, jossa löydetään sanan lemmat sen merkityksen ja asiayhteyden perusteella. Lemmatisointi viittaa yleensä sanojen morfologiseen analyysiin, jonka tarkoituksena on poistaa taivutuspäätteet. Se auttaa palauttamaan sanan perusmuodon eli sanakirjamuodon, joka tunnetaan nimellä lemmatisointi. NLTK:n lemmatisointimenetelmä perustuu WordNetin sisäänrakennettuun morph-funktioon. Tekstin esikäsittely sisältää sekä stemmauksen että lemmatisoinnin. Monet ihmiset hämmentävät näitä kahta termiä. Jotkut pitävät niitä samana, mutta stemmauksen ja lemmatisoinnin välillä on ero. Lemmatisointia suositaan ensin mainittuun verrattuna alla olevasta syystä.

Miksi lemmatisaatio on parempi kuin stemming?

Vartalonmuodostusalgoritmi toimii leikkaamalla sanasta päätteen. Laajemmassa merkityksessä se leikkaa joko sanan alun tai lopun. Lemmatisointi on sitä vastoin tehokkaampi operaatio, ja se ottaa huomioon sanojen morfologisen analyysin. Se palauttaa lemman, joka on kaikkien sen taivutusmuotojen perusmuoto. Sanakirjojen luominen ja sanan oikean muodon etsiminen vaatii syvällistä kielitieteellistä tietämystä. Vartalonmuodostus on yleinen operaatio, kun taas lemmatisointi on älykäs operaatio, jossa oikea muoto etsitään sanakirjasta. Näin ollen lemmatisointi auttaa muodostamaan paremmin koneoppiminen ominaisuuksia.

Code erottaa lemmatisointi ja stemming

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

lähtö:

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

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

lähtö:

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

Tuotoskeskustelu

Jos tarkastellaan stemmausta sekä studies- että studying-lausekkeille, tuloste on sama (studi), mutta NLTK-lemmatisointityökalu tarjoaa eri lemman molemmille tokeneille: study-lauseen studies-lausekkeelle ja studying-lauseen studying-lausekkeelle. Joten kun meidän on luotava ominaisuusjoukko koneen kouluttamiseksi, olisi hienoa, jos lemmatisointia suosittaisiin.

Lemmatizerin käyttötapaus

Lemmatisointitoiminto minimoi tekstin monitulkintaisuuden. Sanat kuten "bicycle" tai "bicycles" muunnetaan perusmuodoksi "bicycle". Se muuntaa kaikki saman merkityksen mutta eri esitystavan omaavat sanat perusmuotoonsa, mikä vähentää sanatiheyttä ja help-arvoa.ping valmistele tarkkoja ominaisuuksia koneen kouluttamista varten. Mitä puhtaampi data on, sitä tarkempi koneoppimismallisi on. NLTK Lemmatizer säästää myös muistia ja laskentakustannuksia.

Reaaliaikainen esimerkki WordNet-lemmatisoinnin ja POS-tunnisteiden käytöstä 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)

lähtö:

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

Code Selitys:

  • Korpuslukijan Wordnet tuodaan ja WordNetLemmatizer tuodaan Wordnetistä.
  • Sanatunnisteet ja sanaluokat tuodaan nltk:sta ja oletussanakirja kokoelmista.
  • Luodaan sanakirja, jossa pos_tag-muuttujasta ensimmäinen kirjain on avain, joka on yhdistetty Wordnet-sanakirjan arvoon.
  • Teksti kirjoitetaan ja tokenisoidaan, ja lemma_function-objekti luodaan silmukan sisäistä käyttöä varten.
  • Silmukka suoritetaan ja lemmatize ottaa kaksi argumenttia: tunnuksen ja kartan.ping pos_tag-tunnisteesta wordnet-arvolla.

Python Lemmatisaatiolla on läheinen yhteys WordNet-sanakirja, joten aiheen tutkiminen seuraavaksi on välttämätöntä.

UKK

Porter-stemmeri on NLTK:n PorterStemmer-luokka. Se käyttää suffiksi-strippausta.ping Martin Porterin vuoden 1980 algoritmin sääntöjä, jotka pelkistävät englanninkieliset sanat vartaloonsa, jolloin sanoista ”waiting”, ”waited” ja ”waits” tulee kaikista ”wait”.

Käytä sanan rungonmuodostusta, kun nopeus ja yksinkertaisuus ovat luettavuutta tärkeämpiä, kuten hakujen indeksoinnissa, laajamittaisessa mielipideanalyysissä tai ominaisuuksien vähentämisessä. Valitse lemmatisointi, kun tulosteen on oltava kelvollinen, ihmisen luettava sana.

Tekstin normalisointi muuntaa sanan eri muodot yhdeksi yhteiseksi esitystavaksi. Vartalon luominen ja lemmatisointi ovat kaksi normalisointitekniikkaa, jotka vähentävät sanatiheyttä, joten malli käsittelee variantteja, kuten "study" ja "studies", yhtenä ominaisuutena.

NLTK tarjoaa PorterStemmerin (ja muita stemmareita, kuten Snowballin) stemmaukseen ja WordNetLemmatizerin lemmatisointiin. Lemmatisointityökalu käyttää WordNet-sanakirjaa palauttaakseen kunkin sanan oikean perusmuodon.

Ne poistavat tarpeettomia sanamuunnelmia, joten koneoppimismalli näkee selkeämpiä, matalamman ulottuvuuden ominaisuuksia. Vähemmän kaksoiskappaleita tarkoittaa vähemmän monitulkintaisuutta harjoittelun aikana ja tarkempia ennusteita näkymättömälle tekstille.

Nykyaikaiset tekoälymallit päättelevät kontekstin automaattisesti, mutta NLTK:n WordNetLemmatizer tarvitsee sanaluokkatunnisteen yksiselitteistääkseen sen. Tunnisteen syöttäminen antaa sille mahdollisuuden valita oikean lemman, esimerkiksi muuttaa sanan "learning" sanaksi "learn", kun se on merkitty verbiksi.

Sana voi olla substantiivi tai verbi, jolla on erilaiset leemat. Ilman sanaluokkatunnistetta WordNetLemmatizer olettaa substantiivin. Oikean tunnisteen, kuten verbin tai adjektiivin, välittäminen antaa oikean perusmuodon.

Ei. Vartalon luominen luo vain päätteitä, joten sanasta ”studies” tulee ”studi” ja sanasta ”cries” tulee ”cri”, jotka eivät ole valideja sanoja. Lemmatisointi sitä vastoin palauttaa aina oikean sanakirjasanan, kuten ”study”.

Tiivistä tämä viesti seuraavasti: