Sissejuhatus sõnadesse ja kuidas seda NLP jaoks Pythonis kodeerida

Pixabay poolt mustal pinnal olevad valged ja mustad kraapitavad plaadid

Sõnade kott (BOW) on meetod funktsioonide eraldamiseks tekstidokumentidest. Neid funktsioone saab kasutada masinõppe algoritmide koolitamiseks. See loob sõnavara kõigist treeningkomplekti dokumentides esinevatest ainulaadsetest sõnadest.

Lihtsamalt öeldes on see sõnade kogum, mis tähistab lauset sõnade arvuga ja eirab enamasti nende ilmumise järjekorda.

BOW on lähenemisviis, mida kasutatakse laialdaselt koos:

  1. Looduslik keele töötlemine
  2. Teabe otsimine dokumentidest
  3. Dokumentide klassifikatsioonid

Kõrgel tasemel hõlmab see järgmisi samme.

Genereeritud vektoreid saab sisestada teie masinõppe algoritmi.

Alustame mõistmise näitega, võttes mõned laused ja genereerides neile vektorid.

Mõelge järgmisele kahele lausele.

1. "Johnile meeldib filme vaadata. Maryle meeldivad ka filmid."
2. "Johnile meeldib ka jalgpallimänge vaadata."

Neid kahte lauset saab esindada ka sõnade kogumiga.

1. ['John', 'meeldib', 'to', 'watch', 'filme.', 'Mary', 'likes', 'movies', 'too.']
2. ['Johannes', 'ka', 'meeldib', 'kellele', 'vaadata', 'jalgpall', 'mängud']

Eemaldage iga lause korral sõna mitu esinemisjuhtu ja kasutage selle tähistamiseks sõnade arvu.

1. {"John": 1, "meeldib": 2, "kuni": 1, "vaata": 1, "filmid": 2, "Maarja": 1, "liiga": 1}
2. {"John": 1, "ka": 1, "meeldib": 1, "kuni": 1, "vaadata": 1, "jalgpall": 1, "mängud": 1}

Eeldusel, et need laused on osa dokumendist, on allpool toodud kogu meie dokumendi ühendatud sõnade sagedus. Mõlemat lauset võetakse arvesse.

 {"Johannes": 2, "meeldib": 3, "kuni": 2, "vaata": 2, "filmid": 2, "Maarja": 1, "liiga": 1, "ka": 1, " jalgpall ": 1,„ mängud ": 1}

Ülaltoodud sõnavara kõigi dokumendi sõnade kohta koos sõnade arvuga kasutatakse kõigi lausete vektorite loomiseks.

Vektori pikkus võrdub alati sõnavara suurusega. Sel juhul on vektori pikkus 11.

Meie algsete lausete esindamiseks vektoris initsieeritakse iga vektor kõigi nullidega - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Sellele järgneb iteratsioon ja võrdlus meie sõnavara iga sõnaga ja vektori väärtuse suurendamine, kui lausel on see sõna.

Johnile meeldib filme vaadata. Maryle meeldivad ka filmid.
[1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
Johnile meeldib vaadata ka jalgpallimänge.
[1, 1, 1, 1, 0, 0, 0, 1, 1, 1]

Näiteks lauses 1 on sõna meeldimine teisel kohal ja kaks korda. Nii et meie vektori teine ​​element lauses 1 on 2: [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]

Vektor on alati võrdeline meie sõnavara suurusega.

Suur dokument, kus loodud sõnavara on tohutu, võib põhjustada vektori, milles on palju 0 väärtust. Seda nimetatakse hõredaks vektoriks. Hõredad vektorid vajavad modelleerimisel rohkem mälu ja arvutusressursse. Suur arv asendeid või mõõtmeid võib muuta modelleerimisprotsessi traditsiooniliste algoritmide jaoks väga keerukaks.

Meie BOW algoritmi kodeerimine

Meie koodi sisendiks on mitu lauset ja väljundiks vektorid.

Sisendmassiiv on järgmine:

["Joe ootas rongi", "Rong hilines", "Maarja ja Samantha võtsid bussi",
"Ma otsisin Maarja ja Samantha bussijaamast",
"Mary ja Samantha jõudsid bussijaama varakult, kuid ootasid bussi keskpäevani"]

1. samm: lause märgistamine

Alustuseks eemaldame lausetest stoppsõnad.

Märksõnad on sõnad, millel pole piisavalt tähtsust, et neid ilma meie algoritmita kasutada. Me ei tahaks, et need sõnad võtaksid meie andmebaasis ruumi või võtaksid väärtuslikku töötlemisaega. Selleks saame need hõlpsalt eemaldada, salvestades loetelu sõnadest, mida peate peatussõnadeks.

Tokeniseerimine on stringijada jagunemine tükkideks, näiteks sõnadeks, märksõnadeks, fraasideks, sümboliteks ja muudeks elementideks, mida nimetatakse tähisteks. Märgid võivad olla üksikud sõnad, fraasid või isegi terved laused. Juhendamise protsessis loobutakse osadest märkidest, nagu kirjavahemärgid.

def sõna väljavõte (lause):
    ignoreeri = ['a', "the", "is"]
    sõnad = re.sub ("[^ \ w]", "", lause) .split ()
    puhastatud_tekst = [w.lower () w sõnade jaoks, kui w ei jäeta tähelepanuta]
    tagasta puhastatud tekst

Märksõnade kindlamaks rakendamiseks võite kasutada python nltk teeki. Sellel keelel on etteantud sõnade komplekt. Siin on näide:

impordi nltk
saidilt nltk.corpus impordi paroolid
 komplekt (stopwords.words ('eesti'))

2. samm: rakendage märgistus kõigile lausetele

def märk (laused):
    sõnad = []
    lause lausetes:
        w = sõna väljavõte (lause)
        sõnad.extend (w)
        
    sõnad = sorteeritud (nimekiri (komplekt (sõnad)))
    tagasi sõnad

Meetod kordab kõiki lauseid ja lisab eraldatud sõna massiivi.

Selle meetodi väljund on:

['ja', 'saabunud', 'at', 'bus', 'but', 'early', 'for', 'i', 'joe', 'late', 'vaat', 'mary', ' keskpäev ',' samantha ',' jaam ',' ',' 'võttis', 'rong', 'kuni', 'ootas', 'oli']

3. samm: koostage sõnavara ja genereerige vektoreid

Dokumendisõnavara loomiseks ja sõnade lausetest eraldamiseks kasutage 1. ja 2. etapis määratletud meetodeid.

def genereerivat_kaart (allsentences):
    vocab = tokenize (kõik mõtted)
    print ("Dokumendi sõnaloend \ n {0} \ n" .format (vocab));
lauses allsentences:
        sõnad = sõna väljavõte (lause)
        bag_vector = numpy.zeros (len (vocab))
        w jaoks sõnades:
            i jaoks, sõna loendis (sõnavara):
                kui sõna == w:
                    kott_vektor [i] + = 1
                    
        print ("{0} \ n {1} \ n" .vorming (lause, numpy.array (bag_vector)))

Siin on meie koodi määratletud sisestus ja täitmine:

allsentences = ["Joe ootas rongirongi", "Rong hilines", "Maarja ja Samantha võtsid bussi",
"Ma otsisin Maarja ja Samantha bussijaamast",
"Mary ja Samantha jõudsid bussijaama varakult, kuid ootasid bussi keskpäevani"]
genereerima_kaar (kõik mõtted)

Iga lause väljundvektorid on:

Väljund:
Joe ootas rongirongi
[0 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 2. 0. 1. 0.]
Rong hilines
[0 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Maarja ja Samantha võtsid bussi
[1 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0.]
Ma otsisin bussijaamast Maarja ja Samantha
[1 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]]
Maarja ja Samantha jõudsid bussijaama varakult, kuid ootasid bussi keskpäeva
[1 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 0.]

Nagu näete, võrreldi iga lauset meie 1. sammus loodud sõnade nimekirjaga. Võrdluse põhjal võib vektorielemendi väärtust suurendada. Neid vektoreid saab kasutada ML-i algoritmides dokumentide klassifitseerimiseks ja ennustamiseks.

Kirjutasime oma koodi ja genereerisime vektoreid, kuid mõistame nüüd sõnade sisu pisut lähemalt.

Ülevaade sõnade kotist

BOW-mudel arvestab ainult sellega, kas teadaolev sõna esineb dokumendis või mitte. See ei hooli tähendusest, kontekstist ja järjestusest, milles need ilmuvad.

See annab ülevaate, et sarnastes dokumentides on sõnade arv sarnased. Teisisõnu: mida sarnasemad on sõnad kahes dokumendis, seda sarnasemad võivad olla ka dokumendid.

BOW piirangud

  1. Semantiline tähendus: põhiline BOW-lähenemisviis ei arvesta sõna tähendust dokumendis. See eirab täielikult konteksti, milles seda kasutatakse. Sama sõna saab konteksti või läheduses olevate sõnade põhjal kasutada mitmes kohas.
  2. Vektori suurus: suure dokumendi korral võib vektori suurus olla tohutu, mille tulemuseks on palju arvutusi ja aega. Võimalik, et peate sõnu ignoreerima, tuginedes teie kasutusjuhu asjakohasusele.

See oli väike sissejuhatus BOW-meetodisse. Kood näitas, kuidas see töötab madalal tasemel. BOW-ist on veel palju aru saada. Näiteks võite selle asemel, et jagada meie lauset ühe sõnaga (1-grammine), jaotada kahe sõna paariks (bi-grammi või 2-grammi). Kohati tundub kahe grammi esitus palju parem kui ühe grammi kasutamine. Neid saab sageli esitada N-grammise märgistuse abil. Olen loetlenud ressursside osas mõned uurimistööd põhjalikumate teadmiste saamiseks.

Te ei pea alati BOW-i kodeerima, kui seda vajate. See on juba osa paljudest saadaolevatest raamistikest, näiteks CountVectorizer sci-kit õppes.

Meie eelmise koodi saab asendada järgmisega:

saidist sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer ()
X = vectorizer.fit_transform (kõik mõtted)

prindi (X.toarray ())

Alati on hea mõista, kuidas raamistike raamatukogud töötavad, ja mõista nende taga olevaid meetodeid. Mida paremini mõistetest aru saate, seda paremini saab raamistikke kasutada.

Täname, et lugesite artiklit. Kuvatud kood on saadaval minu GitHubis.

Võite mind jälgida lehtedes Medium, Twitter ja LinkedIn. Kõigi küsimuste korral saate minuga ühendust võtta e-posti teel (praveend806 [at] gmail [dot] com).

Vahendid sõnade kotist lähemalt lugemiseks

  1. Vikipeedia-BOW
  2. Sõnade mudeli mõistmine: statistiline raamistik
  3. Semantilised säilitavad sõnade mudelid ja rakendused