Stemming and Lemmatization in Python NLTK példákkal

⚡ Okos összefoglaló

A szótagolás és a lemmatizáció szövegnormalizálási technikák. Python Az NLTK olyan szóváltozatokat tartalmaz, amelyek egy közös alapra redukálják a szóváltozatokat, ahol a növényi eredetű utótagok gyorsan, kontextus nélkül alakulnak ki, a lemmatizáció pedig egy valódi szótári szót ad vissza jelentéssel.

  • ???? Származási: A PorterStemmer utótagokat használ, hogy olyan szótöveket érjen el, amelyek esetleg nem is valódi szavak.
  • ???? Lemmatizálás: A WordNetLemmatizer visszaadja a szótár alapformáját, amelyet lemmának nevezünk.
  • 🇧🇷 Különbség: A szótőzés gyorsabb, a lemmatizáció lassabb, de pontosabb és kontextusérzékenyebb.
  • 🔤 Normalizálás: Mindkettő csökkenti a szósűrűséget, így a gépek egyetlen jellemzőként kezelik a változatokat.
  • 🏷️ POS címkék: Egy szófaji címke átadása sokkal pontosabbá teszi a lemmatizátort.
  • 🤖 MI előnye: A tisztább, normalizált szöveg erősebb gépi tanulási funkciókat és modelleket eredményez.

Stemming and Lemmatization in Python NLTK

Miben rejlik a Stemming és a Lemmatization? Python NLTK?

Száradás és lemmatizáció in Python Az NLTK szövegnormalizálási technikák a természetes nyelvi feldolgozáshoz. Ezeket a technikákat széles körben használják a szöveg előfeldolgozásához. A szótagolás és a lemmatizálás közötti különbség az, hogy a szótagolás gyorsabb, mert a kontextus ismerete nélkül vágja ki a szavakat, míg a lemmatizálás lassabb, mert a feldolgozás előtt ismeri a szavak kontextusát.

Mi az a Stemming?

fakadó egy módszer a szavak normalizálására Természetes nyelvi feldolgozásEz egy olyan technika, amelynek során egy mondatban lévő szavakat sorozattá alakítanak át a keresés lerövidítése érdekében. Ebben a módszerben az azonos jelentésű, de a kontextustól vagy a mondattól függően néhány eltérést mutató szavak normalizálódnak. Más szóval, van egy tőszó, de ugyanazon szónak sok változata létezik. Például az tőszó az „eat” (enni), és a változatai az „eats”, az „eats, eating, eaten” (evett) és így tovább. Ugyanígy, a szótőképzés segítségével... Python, bármely variáció alapszavát megtalálhatjuk.

Például:

He was riding.
He was taking the ride.

A fenti két mondatban a jelentés ugyanaz, azaz egy múltbeli lovaglás. Egy ember könnyen megértheti, hogy a két jelentés ugyanaz. De a gépek számára a két mondat különböző. Ezért nehéz őket ugyanabba az adatsorba konvertálni. Ha nem ugyanazt az adathalmazt biztosítjuk, akkor a gép nem tudja megjósolni. Ezért meg kell különböztetni az egyes szavak jelentését, hogy felkészítsük az adathalmazt a gépi tanulásra. Itt a szótőképzőt arra használjuk, hogy azonos típusú adatokat kategorizáljunk a gyökérszavuk kinyerésével.

Valósítsuk meg ezt egy Python program. Az NLTK-nak van egy algoritmusa, melynek neve PorterStemmerEz az algoritmus elfogadja a tokenizált szavak listáját, és gyökérszavakká alakítja azokat.

Program az eredet megértéséhez

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

output:

wait
wait
wait
wait

Code Magyarázat:

  • Van egy NLTK-ban egy importált stem modul. Ha a teljes modult importáljuk, a program nehézkessé válik, mivel több ezer sornyi kódot tartalmaz. Tehát a teljes stem modulból csak a „PorterStemmer”-t importáltuk.
  • Ugyanannak a szónak a variációs adataiból állistát készítettünk.
  • Létrejön egy objektum, amely az nltk.stem.porter.PorterStemmer osztályba tartozik.
  • Egy „for” ciklus segítségével egyesével adtuk át a PorterStemmernek. Végül megkaptuk a listában szereplő összes szó gyökérszavát.

A fentiekből kitűnik, hogy a szótőzés fontos előfeldolgozási lépés, mivel eltávolítja a redundanciát és a variációkat ugyanazon szón belül. Ennek eredményeként az adatok szűrésre kerülnek, ami segít a jobb gépi betanításban. Most átadunk egy teljes mondatot, és ellenőrizzük a kimenetét.

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

Code Magyarázat:

  • A PorterStemmer csomag a modul törzséből importálódik.
  • Mondatok és szavak tokenizálására szolgáló csomagok importálásra kerülnek.
  • Egy mondatot írunk, amelyet a következő lépésben kell tokenizálni.
  • Itt jön létre egy objektum a PorterStemmer számára.
  • Egy ciklus lefut, és az 5. kódsorban létrehozott objektum segítségével minden szót szárba rendelünk.

Röviden, a stemming (származás) egy adat-előfeldolgozó modul. Az angol nyelvben egyetlen szónak számos variációja létezik, ami kétértelműséget okoz a gépi tanulás betanításában és predikciójában. Egy sikeres modell felépítéséhez elengedhetetlen az ilyen szavak szűrése ugyanabba a szekvenált adatba stemming (származás) segítségével. Ezt normalizálásnak is nevezik.

Mi az a lemmatizáció?

Lemmatizálás Az NLTK-ban az a algoritmikus folyamat, amely egy szó lemmáját keresi meg a jelentése és a kontextusa alapján. A lemmatizáció általában a szavak morfológiai elemzésére utal, amelynek célja az inflexiós végződések eltávolítása. Segít a szó alap- vagy szótári alakjának, az úgynevezett lemmának a visszaadásában. Az NLTK lemmatizációs módszere a WordNet beépített morph függvényén alapul. A szöveg előfeldolgozása magában foglalja mind a stemming, mind a lemmatizációt. Sokan zavarosnak találják a két kifejezést. Egyesek ugyanazon kifejezésként kezelik őket, de van különbség a stemming és a lemmatizáció között. A lemmatizációt az előbbivel szemben az alábbi okok miatt részesítik előnyben.

Miért jobb a lemmatizálás, mint a száradás?

A szótagképző algoritmus úgy működik, hogy kivágja a szó utótagját. Tágabb értelemben a szó elejét vagy végét vágja ki. Ezzel szemben a lemmatizáció egy hatékonyabb művelet, és figyelembe veszi a szavak morfológiai elemzését. Visszaadja a lemmát, amely az összes ragozó alakjának alapalakja. A szótárak létrehozásához és a szó megfelelő alakjának kereséséhez mélyreható nyelvészeti ismeretekre van szükség. A szótagképzés egy általános művelet, míg a lemmatizáció egy intelligens művelet, amelynek során a megfelelő alakot a szótárban keressük. Így a lemmatizáció segít a jobb szóalkotásban. gépi tanulás jellemzők.

Code különbséget tenni a lemmatizáció és a szótagolás között

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

output:

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

Lemmatizálás 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)))

output:

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

A kimenet megbeszélése

Ha a studies és a studying szavakhoz a stemminget nézzük, a kimenet ugyanaz (studi), de az NLTK lemmatizáló más lemmát biztosít mindkét tokenhez: a study-t a studieshez és a studying-et a studyinghez. Tehát amikor egy gép betanításához jellemzőkészletet kell létrehoznunk, nagyszerű lenne, ha a lemmatizációt részesítenénk előnyben.

A Lemmatizer használati esete

A Lemmatizátor minimalizálja a szöveg kétértelműségét. Az olyan szavak, mint a „bicycle” vagy a „bicycles” (kerékpárok), a „bicycle” (kerékpár) alapszóvá alakulnak. Az összes azonos jelentésű, de eltérő ábrázolású szót az alapszóvá alakítja, csökkentve a szósűrűséget és a hel (súlyt).ping Készítsen pontos jellemzőket a gép betanításához. Minél tisztábbak az adatok, annál pontosabb lesz a gépi tanulási modellje. Az NLTK Lemmatizer memóriát és számítási költségeket is takarít meg.

Valós idejű példa a WordNet lemmatizáció és a POS címkézés használatára 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)

output:

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

Code Magyarázat:

  • A korpuszolvasó wordnetjét importálja, a WordNetLemmatizer pedig a wordnetből importálódik.
  • A szó tokenize és a szófaji címkék az nltk-ből, az alapértelmezett szótárak pedig gyűjteményekből importálódnak.
  • Létrejön egy szótár, ahol a pos_tag első betűje a kulcs, amelyet a Wordnet szótár értékéhez rendelnek.
  • A szöveg kiírásra és tokenizálásra kerül, majd a lemma_function objektum létrejön a cikluson belüli használatra.
  • A ciklus lefut, és a lemmatize két argumentumot fogad el: a tokent és egy map-et.ping a pos_tag wordnet értékével.

Python A lemmatizáció szoros kapcsolatban áll a WordNet szótár, ezért elengedhetetlen a téma további tanulmányozása.

GYIK

A Porter szótagoló az NLTK PorterStemmer osztálya. Utótag-csíkot alkalmaz.ping Martin Porter 1980-as algoritmusának szabályait használja az angol szavak szótőjükre redukálására, így a „waiting”, a „waited” és a „waits” szavakból mind „wait” lesz.

Használj szótőzéses fordítást, ha a sebesség és az egyszerűség fontosabb, mint az olvashatóság, például keresési indexelésnél, nagyléptékű hangulatelemzésnél vagy jellemzők csökkentésénél. Válaszd a lemmatizációt, ha a kimenetnek érvényes, ember által olvasható szónak kell lennie.

A szövegnormalizálás egy szó különböző alakjait egyetlen közös reprezentációvá alakítja. A szótőzés és a lemmatizáció két olyan normalizálási technika, amelyek csökkentik a szósűrűséget, így a modell egyetlen jellemzőként kezeli az olyan változatokat, mint a „study” és a „studies”.

Az NLTK a PorterStemmert (és más szótőalakítókat, például a Snowballt) biztosítja a szótőalakításhoz, valamint a WordNetLemmatizert a lemmatizátorhoz. A lemmatizátor a WordNet szótárra támaszkodik az egyes szavak helyes alapalakjának visszaadásához.

Eltávolítják a redundáns szóváltozatokat, így a gépi tanulási modell tisztább, alacsonyabb dimenziójú jellemzőket lát. Kevesebb ismétlődő token kevesebb kétértelműséget jelent a betanítás során, és pontosabb előrejelzéseket ad a láthatatlan szövegre.

A modern mesterséges intelligencia modellek automatikusan következtetnek a kontextusra, de az NLTK WordNetLemmatizer-ének szüksége van egy szófaji címkére az egyértelműsítéshez. Ennek a címkének a megadásával kiválaszthatja a megfelelő lemmát, például a „learning” szót „learn”-ra alakíthatja, ha igeként van címkézve.

Egy szó lehet főnév vagy ige, különböző lemmákkal. Szófaji címke nélkül a WordNetLemmatizer főnevet feltételez. A megfelelő címke, például ige vagy melléknév átadása adja a megfelelő alapalakot.

Nem. A szótőzés csak utótagokat eredményez, így a „studies” szóból „studi”, a „cries” szóból pedig „cri” lesz, amelyek nem érvényes szavak. Ezzel szemben a lemmatizáció mindig egy valódi szótári szót ad vissza, például a „study”.

Foglald össze ezt a bejegyzést a következőképpen: