Stemming a lemmatizace v Python NLTK s příklady

⚡ Chytré shrnutí

Stemming a lematizace jsou techniky normalizace textu v Python NLTK, které redukují varianty slov na společný základ, kde stemming rychle ořezává přípony bez kontextu a lematizace vrací skutečné slovníkové slovo s použitím významu.

  • ???? Odvození: PorterStemmer ořezává přípony, aby dosáhl kořene, který nemusí být skutečným slovem.
  • ???? Lematizace: WordNetLemmatizer vrací základní tvar slovníku, nazývaný lemma.
  • 🇧🇷 Rozdíl: Stemming je rychlejší, lematizace je pomalejší, ale přesnější a kontextově orientovaná.
  • 🔤 Normalizace: Oba zmenšují hustotu slov, takže stroje považují varianty za jeden prvek.
  • ???? ️ Tagy POS: Předání tagu slovního druhu dělá lematizátor mnohem přesnějším.
  • 🤖 Výhody umělé inteligence: Čistší normalizovaný text vytváří silnější funkce a modely strojového učení.

Stemming a lemmatizace v Python NLTK

V čem je stemming a lemmatizace Python NLTK?

Stemming a lemmatizace in Python NLTK jsou techniky normalizace textu pro zpracování přirozeného jazyka. Tyto techniky se široce používají pro předzpracování textu. Rozdíl mezi stemmingem a lematizací spočívá v tom, že stemming je rychlejší, protože ořezává slova bez znalosti kontextu, zatímco lemmatizace je pomalejší, protože zná kontext slov před zpracováním.

Co je Stemming?

Nálada je metoda normalizace slov v Zpracování přirozeného jazykaJedná se o techniku, při které se sada slov ve větě převede do posloupnosti, aby se zkrátilo vyhledávání. V této metodě se normalizují slova, která mají stejný význam, ale určité obměny v závislosti na kontextu nebo větě. Jinými slovy, existuje jeden kořen slova, ale mnoho variant téhož slova. Například kořen slova je „jíst“ a jeho varianty jsou „jí, jíst, snědený atd.“. Stejným způsobem se s pomocí stemmingu v Python, můžeme najít kořen slova jakékoli varianty.

Například:

He was riding.
He was taking the ride.

Ve výše uvedených dvou větách je význam stejný, tj. jde o jízdu na koni v minulosti. Člověk snadno pochopí, že oba významy jsou stejné. Pro stroje jsou však obě věty odlišné. Proto je obtížné je převést do stejného datového řádku. Pokud neposkytneme stejnou datovou sadu, stroj nedokáže předpovídat. Je tedy nutné rozlišit význam každého slova, aby se sada dat připravila pro strojové učení. Zde se stemming používá ke kategorizaci stejného typu dat získáním jejich kořene.

Implementujme to pomocí Python program. NLTK má algoritmus s názvem PorterStemmerTento algoritmus přijímá seznam tokenizovaných slov a převádí je na kořenová slova.

Program pro porozumění Stemmingu

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

Výstup:

wait
wait
wait
wait

Code Vysvětlení:

  • V NLTK je importován stem modul. Pokud importujete celý modul, program se stane těžkým, protože obsahuje tisíce řádků kódu. Z celého stem modulu jsme tedy importovali pouze „PorterStemmer“.
  • Připravili jsme fiktivní seznam variačních dat stejného slova.
  • Vytvoří se objekt, který patří do třídy nltk.stem.porter.PorterStemmer.
  • Postupně jsme je předávali PorterStemmeru pomocí smyčky „for“. Nakonec jsme dostali výstupní kořen slova každého slova uvedeného v seznamu.

Z výše uvedeného vyplývá, že stemming je důležitým krokem předzpracování, protože odstraňuje redundanci a variace ve stejném slově. V důsledku toho jsou data filtrována, což pomáhá při lepším strojovém trénování. Nyní předáme celou větu a zkontrolujeme její výstup.

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)

Výstup:

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

Code Vysvětlení:

  • Balíček PorterStemmer je importován z modulu stem.
  • Importují se balíčky pro tokenizaci vět i slov.
  • Je napsána věta, která má být v dalším kroku tokenizována.
  • Zde se vytvoří objekt pro PorterStemmer.
  • Spustí se smyčka a odvození od kořene každého slova se provádí pomocí objektu vytvořeného v řádku kódu 5.

Stručně řečeno, stemming je modul pro předzpracování dat. Anglický jazyk má mnoho variant jednoho slova, což vytváří nejednoznačnost při trénování a predikci strojového učení. Pro vytvoření úspěšného modelu je nezbytné filtrovat taková slova do stejných sekvenčních dat pomocí stemmingu. Tomu se také říká normalizace.

Co je lemmatizace?

Lemmatizace V NLTK je algoritmický proces hledání lemmatu slova v závislosti na jeho významu a kontextu. Lematizace se obvykle vztahuje k morfologické analýze slov, jejímž cílem je odstranit inflekční koncovky. Pomáhá při vrácení základního nebo slovníkového tvaru slova, známého jako lemma. Metoda lematizace NLTK je založena na vestavěné funkci morph ve WordNetu. Předzpracování textu zahrnuje stemming i lemmatizaci. Mnoho lidí považuje tyto dva pojmy za matoucí. Někteří je považují za totéž, ale mezi stemmingem a lematizací je rozdíl. Lematizace je upřednostňována před prvním z níže uvedeného důvodu.

Proč je lemmatizace lepší než stemming?

Algoritmus pro stemming funguje tak, že ze slova odstraňuje příponu. V širším smyslu odstraňuje buď začátek, nebo konec slova. Lematizace je naopak výkonnější operace, která bere v úvahu morfologickou analýzu slov. Vrací lemma, což je základní tvar všech jeho ohýbacích tvarů. K vytváření slovníků a hledání správného tvaru slova jsou zapotřebí hluboké lingvistické znalosti. Stemming je obecná operace, zatímco lematizace je inteligentní operace, při které se správný tvar vyhledává ve slovníku. Lematizace tak pomáhá při tvorbě lepších slov. strojové učení rysy.

Code rozlišovat mezi lematizací a stemmingem

Nálada 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)))

Výstup:

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

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

Výstup:

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

Diskuse o výstupu

Pokud se podíváte na stemming pro slova studies a studying, výstup je stejný (studi), ale lematizátor NLTK poskytuje pro oba tokeny jiné lema: study pro studies a studying pro studying. Takže když potřebujeme vytvořit sadu funkcí pro trénování stroje, bylo by skvělé, kdyby se preferovala lematizace.

Use Case of Lemmatizer

Lematizér minimalizuje nejednoznačnost textu. Slova jako bicycle nebo bicycles jsou převedena na základní slovo bicycle. Převádí všechna slova se stejným významem, ale s různou reprezentací, na jejich základní tvar, čímž snižuje hustotu slov a hel.ping připravte přesné funkce pro trénování stroje. Čím čistší data, tím přesnější bude váš model strojového učení. Lemmatizer NLTK také šetří paměť a výpočetní náklady.

Příklad v reálném čase ukazující použití lematizace WordNetu a POS tagování v 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)

Výstup:

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

Code Vysvětlení:

  • Čtečka korpusu Wordnet je importována a WordNetLemmatizer je importován z Wordnetu.
  • Tokenizace slov a tag slovních druhů se importují z nltk a výchozí slovník z kolekcí.
  • Vytvoří se slovník, kde první písmeno proměnné pos_tag představuje klíč, namapovaný na hodnotu ze slovníku Wordnet.
  • Text je zapsán a tokenizován a objekt lemma_function je vytvořen pro použití uvnitř smyčky.
  • Smyčka se spustí a lemmatize přijímá dva argumenty: token a mapu.ping z pozice pozice pozice s hodnotou wordnet.

Python Lematizace má úzký vztah k Slovník WordNetu, takže je nezbytné toto téma dále prostudovat.

Nejčastější dotazy

Porterův stemmer je třída PorterStemmer v NLTK. Aplikuje suffix-strip.ping pravidla z algoritmu Martina Portera z roku 1980 pro redukci anglických slov na jejich kmen, takže „waiting“, „waited“ a „waits“ se stanou „wait“.

Používejte stemming, když je rychlost a jednoduchost důležitější než čitelnost, například při indexování vyhledávání, rozsáhlé analýze sentimentu nebo redukci rysů. Lematizaci zvolte, když výstup musí být platné, lidsky čitelné slovo.

Normalizace textu převádí různé tvary slova do jedné společné reprezentace. Stemming a lematizace jsou dvě normalizační techniky, které snižují hustotu slov, takže model zachází s variantami jako „study“ a „studies“ jako s jedním prvkem.

NLTK poskytuje PorterStemmer (a další stemmery jako Snowball) pro stemming a WordNetLemmatizer pro lematizaci. Lematizér se spoléhá na slovník WordNet, aby vrátil správný základní tvar každého slova.

Odstraňují nadbytečné varianty slov, takže model strojového učení vidí čistší, méně dimenzionální prvky. Méně duplicitních tokenů znamená menší nejednoznačnost během trénování a přesnější předpovědi na základě neviditelného textu.

Moderní modely umělé inteligence automaticky odvozují kontext, ale WordNetLemmatizer od NLTK potřebuje k jednoznačné identifikaci tag slovního druhu. Zadání tohoto tagu mu umožňuje vybrat správné lemma, například přeměnit „learning“ na „learn“, když je tagováno jako sloveso.

Slovo může být podstatné jméno nebo sloveso s různými lemmaty. Bez tagu slovního druhu WordNetLemmatizer předpokládá podstatné jméno. Předání správného tagu, například slovesa nebo přídavného jména, poskytne správný základní tvar.

Ne. Odvozování od kořene slova pouze ořezává přípony, takže „studies“ se stane „studi“ a „cries“ se stane „cri“, což nejsou platná slova. Lematizace naopak vždy vrátí skutečné slovníkové slovo, jako například „study“.

Shrňte tento příspěvek takto: