Stemming ir Lemmatization su Python NLTK

Kas yra „Stemming“?

Šakniavimas yra tam tikras žodžių normalizavimas. Normalizavimas yra technika, kai sakinyje esančių žodžių rinkinys paverčiamas seka, kad sutrumpėtų jo paieška. Žodžiai, turintys tą pačią reikšmę, bet turintys tam tikrą variaciją pagal kontekstą ar sakinį, yra normalizuojami.

Kitame žodyje yra vienas šaknis, tačiau yra daug tų pačių žodžių variantų. Pavyzdžiui, pagrindinis žodis yra „valgyti“, o jo variantai yra „valgo, valgo, valgo ir panašiai“. Lygiai taip pat, naudojant „Stemming“, galime rasti bet kurio varianto šaknies žodį.

Pavyzdžiui

He was riding.He was taking the ride.

Ankstesniuose dviejuose sakiniuose reikšmė yra ta pati, ty jojimo veikla praeityje. Žmogus gali lengvai suprasti, kad abi reikšmės yra vienodos. Tačiau mašinoms abu sakiniai skiriasi. Taigi tapo sunku ją konvertuoti į tą pačią duomenų eilutę. Jei mes nepateiksime to paties duomenų rinkinio, mašina nesugebės numatyti. Taigi, norint parengti duomenų rinkinį mašininiam mokymuisi, būtina atskirti kiekvieno žodžio reikšmę. O štai kamieno vartojimas naudojamas to paties tipo duomenims suskirstyti gaunant pagrindinį žodį.

Įgyvendinkime tai su „Python“ programa. NLTK turi algoritmą, pavadintą „PorterStemmer“. Šis algoritmas priima tokenizuoto žodžio sąrašą ir suveda jį į šaknies žodį.

Programa, skirta suprasti „Stemming“

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

Išvestis :

waitwaitwaitwait

Kodo paaiškinimas:

  • NLTk yra kamieno modulis, kuris yra importuojamas. Jei importuojate visą modulį, programa tampa sunki, nes joje yra tūkstančiai kodų eilučių. Taigi iš viso kamieno modulio importavome tik „PorterStemmer“.
  • Parengėme manekenišką to paties žodžio variantų duomenų sąrašą.
  • Sukuriamas objektas, kuris priklauso klasei nltk.stem.porter.PorterStemmer.
  • Be to, mes perdavėme jį „PorterStemmer“ po vieną naudodami „for“ kilpą. Galiausiai gavome kiekvieno sąraše paminėto žodžio išvesties šaknies žodį.

Iš pirmiau pateikto paaiškinimo taip pat galima padaryti išvadą, kad išvedimas yra laikomas svarbiu išankstinio apdorojimo etapu, nes jis pašalino duomenų perteklių ir to paties žodžio variantus. Todėl duomenys yra filtruojami, o tai padės geriau mokyti mašinas.

Dabar mes priimame visą sakinį ir patikriname jo elgesį kaip rezultatą.

Programa:

from nltk.stem import PorterStemmerfrom nltk.tokenize import sent_tokenize, word_tokenizesentence="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)

Išvestis:

helloguru99,youhavebuildaverigoodsiteandIlovevisityoursite

Kodo paaiškinimas

  • Paketas „PorterStemer“ importuojamas iš modulio kamieno
  • Importuojami sakinių ir žodžių žymėjimo paketai
  • Parašomas sakinys, kurį reikia pažymėti kitame etape.
  • Šiame etape įgyvendinamas žodžių žymėjimas.
  • Čia sukurtas „PorterStemmer“ objektas.
  • Vykdoma kilpa ir kiekvieno žodžio ištraukimas atliekamas naudojant objektą, sukurtą 5 kodo eilutėje

Išvada:

„Stemming“ yra duomenų apdorojimo modulis. Anglų kalba turi daug vieno žodžio variantų. Šie variantai sukuria mašininio mokymosi ir numatymo dviprasmiškumą. Norint sukurti sėkmingą modelį, būtina filtruoti tokius žodžius ir konvertuoti į to paties tipo nuoseklius duomenis, naudojant kamieninius žodžius. Be to, tai yra svarbi technika norint gauti eilučių duomenis iš sakinių rinkinio ir pašalinti nereikalingus duomenis, dar vadinamus normalizavimu.

Kas yra Lemmatization?

Lemmatizacija yra algoritminis žodžio lemmos suradimo procesas, atsižvelgiant į jų reikšmę. Lemmatizacija paprastai reiškia morfologinę žodžių analizę, kuria siekiama pašalinti linksnių galūnes. Tai padeda grąžinti žodžio, vadinamo lemma, pagrindinę ar žodyno formą. NLTK „Lemmatization“ metodas pagrįstas „WorldNet“ integruota morfo funkcija. Išankstinis teksto apdorojimas apima ir stemming, ir lemmatization. Daugeliui žmonių šie du terminai atrodo painūs. Kai kurie traktuoja tuos pačius dalykus, tačiau yra abiejų skirtumų. Dėl žemiau nurodytos priežasties pirmenybė teikiama lemmatizacijai, palyginti su pirma.

Kodėl Lemmatization yra geriau nei Stemming?

Išvestinis algoritmas veikia iškirpdamas nuo žodžio galūnę. Platesne prasme pjauna žodžio pradžią arba pabaigą.

Priešingai, „Lemmatization“ yra galingesnė operacija, kurioje atsižvelgiama į žodžių morfologinę analizę. Jis grąžina lemmą, kuri yra visų jo linksnių formų pagrindinė forma. Norint sukurti žodynus ir ieškoti tinkamos žodžio formos, reikalingos išsamios kalbinės žinios. Šakniavimas yra bendroji operacija, o lemmatizacija yra protinga operacija, kai tinkama forma bus ieškoma žodyne. Vadinasi, lemmatizacija padeda formuoti geresnes mašininio mokymosi ypatybes.

Kodas atskirti Lemmatization ir Stemming

Kamieno kodas

import nltkfrom nltk.stem.porter import PorterStemmerporter_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)))

Išvestis:

Stemming for studies is studiStemming for studying is studiStemming for cries is criStemming for cry is cri

Lemmatization kodas

import nltkfrom nltk.stem import WordNetLemmatizerwordnet_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)))

Išvestis:

Lemma for studies is studyLemma for studying is studyingLemma for cries is cryLemma for cry is cry

Rezultatų aptarimas:

Jei žiūrite į studijas ir studijas, rezultatas yra tas pats (studi), tačiau lemmatizer pateikia skirtingą žymą tiek žetonų studijoms, tiek studijoms. Taigi, kai mums reikia nustatyti traukinio mašinai skirtą funkciją, būtų puiku, jei pirmenybė būtų teikiama lemmatizacijai.

„Lemmatizer“ naudojimo atvejis:

„Lemmatizer“ sumažina teksto dviprasmybę. Žodžių pavyzdžiai, pavyzdžiui, dviratis ar dviračiai, paverčiami pagrindiniu žodžiu dviratis. Iš esmės, visi žodžiai, turintys tą pačią prasmę, bet skirtingai, pavers jų pagrindine forma. Tai sumažina žodžio tankį pateiktame tekste ir padeda paruošti tikslias treniruoklio ypatybes. Švaresni duomenys, tuo protingesnis ir tikslesnis bus jūsų mašininio mokymosi modelis. „Lemmatizerwill“ taip pat taupo atmintį ir skaičiavimo išlaidas.

Realaus laiko pavyzdys, parodantis „Wordnet Lemmatization“ ir „POS Tagging“ naudojimą „Python“

from nltk.corpus import wordnet as wnfrom nltk.stem.wordnet import WordNetLemmatizerfrom nltk import word_tokenize, pos_tagfrom collections import defaultdicttag_map = defaultdict(lambda : wn.NOUN)tag_map['J'] = wn.ADJtag_map['V'] = wn.VERBtag_map['R'] = wn.ADVtext = "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)

Kodo paaiškinimas

  • Pirma, korpuso skaitytojo žodinis tinklas yra importuojamas.
  • „WordNetLemmatizer“ yra importuojamas iš „wordnet“
  • Žodis „tokenize“ ir kalbos žymos dalys yra importuojamos iš „nltk“
  • Numatytasis žodynas yra importuojamas iš kolekcijų
  • Žodynas sukurtas ten, kur pos_tag (pirmoji raidė) yra pagrindinės vertės, kurių reikšmės susiejamos su verte iš wordnet žodyno. Mes paėmėme vienintelę pirmąją raidę, nes ją panaudosime vėliau.
  • Tekstas yra parašytas ir pažymėtas.
  • Sukurtas objektas lemma_function, kuris bus naudojamas kilpos viduje
  • Loop yra vykdomas, o lemmatize bus du argumentai, vienas yra žetonas, o kitas - pos_tag susiejimas su wordnet verte.

Išvestis:

guru99 => guru99is => betotally => totallynew => newkind => kindof => oflearning => learnexperience => experience. => .

„Lemmatization“ yra glaudžiai susijęs su „wordnet“ žodynu, todėl būtina studijuoti šią temą, todėl mes tai laikome kita tema

Įdomios straipsniai...