Sanan upottaminen ja Word2Vec esimerkin avulla
โก รlykรคs yhteenveto
Word Embedding ja Word2Vec muuntavat tekstin tiheiksi numeerisiksi vektoreiksi, jotta koneoppimismallit tunnistavat samanmerkitykseisiรค sanoja. Tรคmรค resurssi selittรครค tekniikan, sen CBOW- ja Skip-Gram-arkkitehtuurit, aktivointifunktiot ja tรคydellisen Gensim-toteutuksen todellisiin sovelluksiin.

Mikรค on Wordin upottaminen?
Sanaan upottaminen on sanojen esitystapa, jonka avulla koneoppimisalgoritmit voivat ymmรคrtรครค samankaltaisia โโsanoja. Se on kielen mallinnus- ja ominaisuuksien oppimistekniikka, jolla sanat voidaan yhdistรครค reaalilukujen vektoreiksi kรคyttรคmรคllรค neuroverkkoja, probabilistisia malleja tai dimensioiden pienentรคmistรค sanojen yhteisesiintymismatriisissa. Joitakin sanojen upotusmalleja ovat Word2vec (Google), GloVe (Stanford) ja fastText (Facebook).
Sanan upottamista kutsutaan myรถs hajautetuksi semanttiseksi malliksi, hajautetuksi edustetuksi malliksi, semanttiseksi vektoriavaruudeksi tai vektoriavaruusmalliksi. Nรคitรค nimiรค lukiessasi tรถrmรครคt sanaan semanttinen, mikรค tarkoittaa samankaltaisten sanojen luokittelua yhteen. Esimerkiksi hedelmรคt, kuten omena, mango ja banaani, tulisi sijoittaa lรคhelle toisiaan, kun taas kirjat sijoitetaan kauas nรคistรค sanoista. Laajemmassa merkityksessรค sanojen upottaminen luo hedelmistรค vektorin, joka sijoitetaan kauas kirjojen vektoriesityksestรค.
Missรค Word Embeddingia kรคytetรครคn?
Sanan upottaminen auttaa ominaisuuksien luomisessa, asiakirjojen klusteroinnissa, tekstin luokittelussa ja luonnollisen kielen kรคsittelytehtรคvissรค. Listataanpa nรคmรค sovellukset ja kรคsitellรครคn niitรค kaikkia.
- Laske samanlaiset sanat: Sanan upottamista kรคytetรครคn ehdottamaan samankaltaisia โโsanoja ennustusmallin kohteena olevan sanan kanssa. Sen lisรคksi se ehdottaa myรถs erilaisia โโsanoja sekรค yleisimpiรค sanoja.
- Luo ryhmรค toisiinsa liittyviรค sanoja: Sitรค kรคytetรครคn semanttiseen ryhmittelyynping, joka ryhmittelee samankaltaisia โโโโominaisuuksia omaavat asiat yhteen ja tyรถntรครค erilaiset kauas pois.
- Tekstin luokittelun ominaisuus: Teksti mapataan vektoritaulukoiksi, jotka syรถtetรครคn mallille koulutusta ja ennustamista varten. Tekstipohjaisia โโluokittelumalleja ei voida kouluttaa merkkijonoilla, joten tรคmรค muuntaa tekstin koneellisesti opetettavaan muotoon. Sen semanttiset rakennusominaisuudet auttavat edelleen tekstipohjaisessa luokittelussa.
- Asiakirjojen klusterointi: Tรคmรค on toinen sovellus, jossa Word Embeddingiรค ja Word2veciรค kรคytetรครคn laajalti.
- Luonnollisen kielen kรคsittely: On monia sovelluksia, joissa sanojen upottaminen on hyรถdyllistรค ja voittaa ominaisuusesimerkin.traction vaiheet, kuten sanaluokkien merkitseminen, mielipideanalyysi ja syntaktinen analyysi.
Nyt kun ymmรคrrรคt, mihin sanojen upottamista kรคytetรครคn, katsotaanpa suosituinta mallia, jota kรคytetรครคn nรคiden upotusten luomiseen.
Mikรค on Word2vec?
Word2vec on tekniikka tai malli, joka tuottaa sanojen upotuksia paremman sanojen esitystavan saavuttamiseksi. Se on luonnollisen kielen kรคsittelymenetelmรค, joka tallentaa suuren mรครคrรคn tarkkoja syntaktisia ja semanttisia sanasuhteita. Se on matala kaksikerroksinen neuroverkko, joka pystyy tunnistamaan synonyymeja ja ehdottamaan lisรคsanoja osittaisiin lauseisiin, kun se on koulutettu.
Ennen kuin jatkat, katso ero matalan ja syvรคn neuroverkon vรคlillรค, kuten alla olevasta Word-upotusesimerkkikaaviosta nรคkyy:
Pintainen neuroverkko koostuu vain yhdestรค piilotetusta kerroksesta syรถtteen ja lรคhdรถn vรคlillรค, kun taas syvรคssรค neuroverkossa on useita piilotettuja kerroksia syรถtteen ja lรคhdรถn vรคlillรค. Syรถttรถ on alttiina solmuille, kun taas piilotettu kerros, samoin kuin lรคhtรถkerros, sisรคltรครค neuroneja.

Word2vec on kaksikerroksinen verkko, jossa on tulokerros, yksi piilokerros ja lรคhtรถkerros.
Word2vecin kehitti Tomas Mikolovin johtama tutkijaryhmรค GoogleWord2vec on parempi ja tehokkaampi kuin latentti semanttinen analyysimalli.
Miksi Word2vec?
Word2vec esittรครค sanoja vektoriavaruuden esityksessรค. Sanat esitetรครคn vektorien muodossa, ja sijoittelu tehdรครคn siten, ettรค samanmerkitykseiset sanat esiintyvรคt yhdessรค ja erilaiset sanat sijaitsevat kaukana toisistaan. Tรคtรค kutsutaan myรถs semanttiseksi suhteeksi. Neuroverkot eivรคt ymmรคrrรค tekstiรค; sen sijaan ne ymmรคrtรคvรคt vain numeroita. Sanan upottaminen tarjoaa tavan muuntaa teksti numeeriseksi vektoriksi.
Word2vec rekonstruoi sanojen kielellisen kontekstin. Ennen kuin jatkamme, ymmรคrretรครคn, mitรค kielellinen konteksti on. Yleisessรค tilanteessa, kun puhumme tai kirjoitamme kommunikoidaksemme, muut ihmiset yrittรคvรคt selvittรครค lauseen tarkoituksen. Esimerkiksi: "Mikรค on Intian lรคmpรถtila?" Tรคssรค kontekstina on, ettรค kรคyttรคjรค haluaa tietรครค "Intian lรคmpรถtilan". Lyhyesti sanottuna lauseen pรครคtarkoitus on konteksti. Puhuttua tai kirjoitettua kieltรค ympรคrรถivรคt sanat tai lauseet auttavat mรครคrittรคmรครคn kontekstin merkityksen. Word2vec oppii sanojen vektoriesityksen nรคiden kontekstien avulla.
Mitรค Word2vec tekee?
Ennen Wordin upottamista
On tรคrkeรครค tietรครค, mitรค lรคhestymistapaa kรคytettiin ennen sanojen upottamista ja mitkรค ovat sen haitat, ja sen jรคlkeen katsomme, miten nรคmรค haitat korjataan sanojen upottamisella Word2vec-lรคhestymistapaa kรคyttรคen. Lopuksi siirrymme siihen, miten Word2vec toimii, koska on tรคrkeรครค ymmรคrtรครค sen toimintaperiaate.
Lรคhestymistapa piilevรครคn semanttiseen analyysiin
Tรคtรค lรคhestymistapaa kรคytettiin ennen sanojen upottamista. Siinรค kรคytettiin sanapussin kรคsitettรค, jossa sanat esitetรครคn koodattujen vektorien muodossa. Se on harva vektoriesitys, jossa dimensio on yhtรค suuri kuin sanaston koko. Jos sana esiintyy sanakirjassa, se lasketaan; muuten sitรค ei. Lisรคtietoja on alla olevassa ohjelmassa.
Word2vec esimerkki
from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() data_corpus = ["guru99 is the best site for online tutorials. I love to visit guru99."] vocabulary = vectorizer.fit(data_corpus) X = vectorizer.transform(data_corpus) print(X.toarray()) print(vectorizer.get_feature_names_out())
lรคhtรถ:
[[1 2 1 1 1 1 1 1 1 1]] [u'best', u'guru99', u'is', u'love', u'online', u'sitefor', u'the', u'to', u'tutorials', u'visit']
Code Selitys
- CountVectorizer on moduuli, jota kรคytetรครคn sanaston tallentamiseen sanojen sopivuuden perusteella. Tรคmรค on tuotu sklearnista.
- Tee objekti kรคyttรคmรคllรค luokkaa CountVectorizer.
- Kirjoita listaan โโtiedot, jotka sovitetaan CountVectorizeriin.
- Data mahtuu luokasta CountVectorizer luotuun objektiin.
- Kรคytรค sanapussimenetelmรครค sanojen laskemiseen datassa sanaston avulla. Jos sanaa tai merkkiรค ei ole saatavilla sanastossa, sen indeksisijainti asetetaan nollaksi.
- Rivillรค 5 oleva muuttuja, joka on x, muunnetaan taulukoksi (x:lle kรคytettรคvissรค oleva metodi). Tรคmรค antaa rivillรค 3 annetun lauseen tai listan kunkin tunnuksen lukumรครคrรคn.
- Tรคmรค nรคyttรครค sanastoon kuuluvat ominaisuudet, kun se sovitetaan rivin 4 tietojen perusteella.
Latenttisemanttisessa lรคhestymistavassa rivi edustaa yksilรถllisiรค sanoja, kun taas sarake edustaa sanan esiintymiskertojen lukumรครคrรครค dokumentissa. Se on sanojen esitys dokumenttimatriisin muodossa. Termin esiintymistiheys-kรครคnteinen dokumenttifrekvenssi (TF-IDF) -funktiota kรคytetรครคn sanojen esiintymistiheyden laskemiseen dokumentissa, joka on termin esiintymistiheys dokumentissa jaettuna termin esiintymistiheydellรค koko korpuksessa.
Bag of Words -menetelmรคn puute
- Se jรคttรครค sanajรคrjestyksen huomiotta; esim. Tรคmรค on huono = paha onko tรคmรค.
- Se jรคttรครค sanojen kontekstin huomiotta. Oletetaan, ettรค kirjoitamme lauseen โHรคn rakasti kirjoja. Koulutus lรถytyy parhaiten kirjoista.โ Se loisi kaksi vektoria: yhden lauseelle โHรคn rakasti kirjojaโ ja toisen lauseelle โKoulutus lรถytyy parhaiten kirjoistaโ. Se kรคsittelisi molempia ortogonaalisina, mikรค tekee niistรค itsenรคisiรค, mutta todellisuudessa ne ovat yhteydessรค toisiinsa.
Nรคiden rajoitusten voittamiseksi kehitettiin sanojen upottaminen, ja Word2vec on yksi sen toteuttamiseen kรคytetty lรคhestymistapa.
Miten Word2vec toimii?
Word2vec oppii sanan ennustamalla sen kontekstin. Otetaan esimerkiksi sana โHรคn rakastaa Jalkapallo."
Haluamme laskea sanan Word2vec-muuttujat: rakastaa.
Olettaa:
loves = Vin. P(Vout / Vin) is calculated where, Vin is the input word. P is the probability of likelihood. Vout is the output word.
sana rakastaa siirtyy jokaisen korpuksen sanan yli. Sanojen vรคliset syntaktiset ja semanttiset suhteet koodataan. Tรคmรค auttaa lรถytรคmรครคn samankaltaisia โโja analogisia sanoja.
Kaikki sanan satunnaiset ominaisuudet rakastaa lasketaan. Nรคitรค ominaisuuksia muutetaan tai pรคivitetรครคn suhteessa naapuri- tai kontekstisanoihin kรคyttรคmรคllรค Takaisin leviรคminen menetelmรคllรค.
Toinen tapa oppia on, ettรค jos kahden sanan asiayhteydet ovat samankaltaiset tai kahdella sanalla on samankaltaisia โโpiirteitรค, niin tรคllaiset sanat ovat sukua toisilleen.
Word2vec Archirakenne
Word2vec kรคyttรครค kahta arkkitehtuuria:
- Jatkuva sanapussi (CBOW)
- Ohitusgrammi
Ennen kuin jatkamme, keskustellaanpa siitรค, miksi nรคmรค arkkitehtuurit tai mallit ovat tรคrkeitรค sanan esityksen kannalta. Sanan esityksen oppiminen on pohjimmiltaan ohjaamatonta, mutta mallin kouluttamiseen tarvitaan kohteita/tunnisteita. Skip-gram ja CBOW muuntavat ohjaamattoman esityksen valvottuun muotoon mallin kouluttamista varten.
CBOW:ssa nykyinen sana ennustetaan kรคyttรคmรคllรค ympรคrรถivien kontekstiikkunoiden ikkunaa. Esimerkiksi jos wi-1, Wi-2, Wi + 1, Wi + 2 on annettu sanoja tai konteksti, tรคmรค malli tarjoaa wi.
Skip-Gram toimii CBOW:n vastakkaisella tavalla, mikรค tarkoittaa, ettรค se ennustaa annetun sekvenssin tai kontekstin sanasta. Voit kรครคntรครค esimerkin pรคinvastaiseksi ymmรคrtรครคksesi sitรค. Jos wi jos annetaan, tรคmรค ennustaa kontekstin eli wi-1, Wi-2, Wi + 1, Wi + 2.
Word2vec tarjoaa mahdollisuuden valita CBOW:n (Continuous Bag of Words) ja skip-gramin vรคlillรค. Nรคmรค parametrit annetaan mallin koulutuksen aikana. Voidaan kรคyttรครค negatiivista nรคytteenottoa tai hierarkkista softmax-kerrosta.
Jatkuva sanapussi
Piirretรครคn yksinkertainen Word2vec-esimerkkikaavio jatkuvan sanapussiarkkitehtuurin ymmรคrtรคmiseksi.
Lasketaan yhtรคlรถt matemaattisesti. Oletetaan, ettรค V on sanaston koko ja N on piilotetun kerroksen koko. Syรถte mรครคritellรครคn muodossa { xi-1, xi-2, xi + 1, xi + 2 }. Saamme painomatriisin kertomalla V * N. Toinen matriisi saadaan kertomalla syรถttรถvektori painomatriisilla. Tรคmรค voidaan ymmรคrtรครค myรถs seuraavasta yhtรคlรถstรค.
h = xitW
missรค xit ja W ovat vastaavasti syรถtevektori ja painomatriisi.
Laske kontekstin ja seuraavan sanan vรคlinen vastaavuus alla olevan yhtรคlรถn avulla.
u = ennustettu esitys * h
jossa ennustettu esitys saadaan yllรค olevan yhtรคlรถn mallista.
Skip-Gram malli
Skip-Gram-lรคhestymistapaa kรคytetรครคn lauseen ennustamiseen syรถtetyn sanan perusteella. Ymmรคrtรครคksemme sitรค paremmin, piirretรครคn alla olevassa Word2vec-esimerkissรค esitetty kaavio.
Sitรค voidaan kรคsitellรค kรครคnteisenรค versiona jatkuvasta sanasรคkistรค (Continuous Bag of Words), jossa syรถte on sana ja malli tarjoaa kontekstin tai sekvenssin. Voimme myรถs pรครคtellรค, ettรค kohde syรถtetรครคn syรถtteeseen ja tulostekerros replikoidaan useita kertoja valitun kontekstisanojen mรครคrรคn mukauttamiseksi. Kaikkien tulostekerrosten virhevektori summataan painojen sรครคtรคmiseksi takaisinpropagaatiomenetelmรคllรค.
Mikรค malli valita?
CBOW on useita kertoja nopeampi kuin skip-gram ja tarjoaa paremman taajuuden usein esiintyville sanoille, kun taas skip-gram tarvitsee pienen mรครคrรคn harjoitusdataa ja edustaa jopa harvinaisia โโsanoja tai lauseita. Alla oleva taulukko vertailee molempia arkkitehtuureja yhdellรค silmรคyksellรค.
| Aspect | CBOW | Skip-Gram |
|---|---|---|
| Ennustus | Ennustaa kohdesanan asiayhteydestรค | Ennustaa kontekstin kohdesanasta |
| Harjoittelun nopeus | Nopeampi | hitaampi |
| Usein esiintyviรค sanoja | Suurempi tarkkuus | Pienempi tarkkuus |
| Harvinaisia โโsanoja | Heikompi edustus | Vahvempi edustus |
| Harjoittelutiedot | Tarvitsee lisรครค dataa | Toimii vรคhemmรคllรค datalla |
Word2vecin ja NLTK:n vรคlinen suhde
NLTK on luonnollinen Language Toolpakkaus. Sitรค kรคytetรครคn tekstin esikรคsittelyyn. Sillรค voidaan suorittaa erilaisia โโtoimintoja, kuten sanaluokkien merkitsemistรค, lemmatisointia, vartalonmuodostusta, stop-sanojen poistamista sekรค harvinaisten tai vรคhiten kรคytettyjen sanojen poistamista. Se auttaa tekstin puhdistamisessa ja ominaisuuksien valmistelussa tehokkaista sanoista. Toisaalta Word2veciรค kรคytetรครคn semanttiseen (lรคheisesti toisiinsa liittyvรคt kohdat) ja syntaktiseen (sekvenssi) yhteensovittamiseen. Word2vecin avulla voidaan lรถytรครค samankaltaisia โโsanoja, erilaisia โโsanoja, mittojen pienentรคmistรค ja monia muita toimintoja. Toinen tรคrkeรค Word2vecin ominaisuus on muuntaa tekstin korkeamman ulottuvuuden esitys matalamman ulottuvuuden vektoreiksi.
Missรค NLTK:ta ja Word2vecia kรคytetรครคn?
Jos on suoritettava joitakin edellรค mainittuja yleiskรคyttรถisiรค tehtรคviรค, kuten tokenisointi, POS-tunnisteet ja jรคsentรคminen, on kรคytettรคvรค NLTK:ta, kun taas sanojen ennustamiseen jonkin kontekstin, aihemallinnuksen tai dokumenttien samankaltaisuuden mukaan on kรคytettรคvรค Word2vecia.
NLTK:n ja Word2vecin suhde koodin avulla
NLTK:ta ja Word2veciรค voidaan kรคyttรครค yhdessรค samankaltaisten sanaesitysten tai syntaktisten vastaavuuksien lรถytรคmiseen. NLTK-tyรถkalupakin avulla voidaan ladata useita NLTK:n mukana tulevia paketteja, ja Word2vecin avulla voidaan luoda malli. Sitรค voidaan sitten testata reaaliaikaisilla sanoilla. Katsotaanpa molempien yhdistelmรครค seuraavassa koodissa. Ennen kuin jatkat kรคsittelyรค, tutustu NLTK:n tarjoamiin korpusiin. Voit ladata sen komennolla:
nltk(nltk.download('all'))
Katso koodi kuvakaappauksesta.
import nltk import gensim from nltk.corpus import abc model = gensim.models.Word2Vec(abc.sents()) X = list(model.wv.vocab) data = model.most_similar('science') print(data)
lรคhtรถ:
[('law', 0.9415997266769409), ('practice', 0.9276568293571472), ('discussion', 0.9259148836135864), ('agriculture', 0.9257254004478455), ('media', 0.9232194423675537), ('policy', 0.922248125076294), ('general', 0.9166069030761719), ('undertaking', 0.916458249092102), ('tight', 0.9129181504249573), ('board', 0.9107444286346436)]
Selitys Code
- Nltk-kirjasto tuodaan, josta voit ladata abc-korpuksen, jota kรคytรคmme seuraavassa vaiheessa.
- Gensim on tuotu. Jos Gensim Word2vec ei ole asennettu, asenna se komennolla โpip3 install gensimโ. Katso alla olevaa kuvakaappausta.
- Tuo abc-korpus, joka on ladattu funktiolla nltk.download('abc').
- Vรคlitรค tiedostot lauseina Word2vec-mallille, joka tuodaan Gensimin avulla.
- Sanasto tallennetaan muuttujan muodossa.
- Mallia testataan esimerkkisanalla tiede, koska nรคmรค tiedostot liittyvรคt tieteeseen.
- Tรคssรค malli ennustaa samankaltaisen sanan "tiede".
Aktivaattorit ja Word2Vec
Neuronien aktivaatiofunktio mรครคrittelee neuronien tuotoksen tietyllรค syรถtejoukolla. Se on biologisesti inspiroitunut aivojemme toiminnasta, jossa eri neuronit aktivoituvat erilaisten รคrsykkeiden vaikutuksesta. Ymmรคrretรครคn aktivaatiofunktio seuraavan kaavion avulla.
Tรคssรค x1, x2, โฆ x4 ovat neuroverkon solmut.
w1, w2 ja w3 ovat solmujen painot.
Kaikkien painojen ja solmuarvojen summa (ฮฃ) toimii aktivointifunktiona.
Miksi aktivointitoiminto?
Jos aktivointifunktiota ei kรคytetรค, tuloste olisi lineaarinen, mutta lineaarisen funktion toiminnallisuus on rajoitettu. Monimutkaisten toimintojen, kuten objektien tunnistuksen, kuvan luokittelun, saavuttamiseksiping tekstin tuottamiseen รครคnellรค ja moniin muihin epรคlineaarisiin tulosteisiin tarvitaan aktivointifunktio.
Kuinka aktivointikerros lasketaan sanan upotuksessa (Word2vec)
Softmax-kerros (normalisoitu eksponentiaalifunktio) on lรคhtรถkerroksen funktio, joka aktivoi tai laukaisee jokaisen solmun. Toinen kรคytetty lรคhestymistapa on hierarkkinen softmax, jossa kompleksisuus lasketaan O(log2V), kun taas softmaxissa se on O(V), jossa V on sanaston koko. Nรคiden vรคlinen ero on hierarkkisen softmax-kerroksen monimutkaisuuden vรคhentรคminen. Ymmรคrtรครคksesi sen toiminnallisuuden, katso alla olevaa Wordin upotusesimerkkiรค:
Oletetaan, ettรค haluamme laskea sanan havaitsemisen todennรคkรถisyyden rakkaus tietyssรค kontekstissa. Virta juuresta lehtisolmuun siirtyy ensin solmuun 2 ja sitten solmuun 5. Joten jos sanaston koko on 8, tarvitaan vain kolme laskutoimitusta. Tรคmรค mahdollistaa yhden sanan todennรคkรถisyyden laskennan hajottamisen osiin (rakkaus).
Mitรค muita vaihtoehtoja on saatavilla kuin Hierarchical Softmax?
Yleisesti ottaen kรคytettรคvissรค olevat sanojen upotusvaihtoehdot ovat differentioitu Softmax, CNN-Softmax, tรคrkeysnรคytteenotto, adaptiivinen tรคrkeysnรคytteenotto, kohinan kontrastiivinen estimointi, negatiivinen nรคytteenotto, itsenormalisointi ja harvinainen normalisointi.
Erityisesti Word2vecin osalta meillรค on saatavilla negatiivista nรคytteenottoa.
Negatiivinen nรคytteenotto on tapa ottaa nรคytteitรค harjoitusdatasta. Se on jonkin verran kuin stokastinen gradienttilaskeutuminen, mutta sillรค on joitakin eroja. Negatiivinen nรคytteenotto etsii vain negatiivisia harjoitusesimerkkejรค. Se perustuu kohinan kontrastiiviseen estimointiin ja ottaa nรคytteitรค satunnaisesti sanoista, jotka eivรคt ole kontekstissa. Se on nopea harjoitusmenetelmรค ja valitsee kontekstin satunnaisesti. Jos ennustettu sana esiintyy satunnaisesti valitussa kontekstissa, molemmat vektorit ovat lรคhellรค toisiaan.
Mitรค johtopรครคtรถstรค voidaan vetรครค?
Aktivaattorit laukaisevat neuroneja aivan kuten omat neuronimme laukaistaan โโulkoisten รคrsykkeiden vaikutuksesta. Softmax-kerros on yksi tulostuskerroksen funktioista, joka laukaisee neuronit sanojen upottamisen tapauksessa. Word2vecissรค meillรค on vaihtoehtoja, kuten hierarkkinen softmax ja negatiivinen nรคytteenotto. Aktivaattoreiden avulla voidaan muuntaa lineaarinen funktio epรคlineaariseksi funktioksi, ja tรคllaisten funktioiden avulla voidaan toteuttaa monimutkainen koneoppimisalgoritmi.
Mikรค on Gensim?
Gensim on avoimen lรคhdekoodin aihemallinnuksen ja luonnollisen kielen kรคsittelyn tyรถkalupakki, joka on toteutettu Python ja Cython. Gensim-tyรถkalupakki mahdollistaa Word2vecin tuonnin aiheiden mallintamista varten, jotta voidaan lรถytรครค piilotettuja rakenteita tekstistรค. Gensim tarjoaa paitsi Word2vecin toteutuksen myรถs Doc2vecin ja FastTextin.
Tรคmรค osio keskittyy Word2veciin, joten pysymme nykyisessรค aiheessa.
Kuinka ottaa Word2vec kรคyttรถรถn Gensimin avulla
Tรคhรคn asti olemme kรคsitelleet, mitรค Word2vec on, sen eri arkkitehtuureja, miksi sanapussista on siirrytty Word2veciin, Word2vecin ja NLTK:n vรคlistรค suhdetta reaaliaikaiseen koodiin sekรค aktivointifunktioita.
Alla on vaiheittainen menetelmรค Word2vecin toteuttamiseksi Gensimin avulla:
Vaihe 1) Tiedonkeruu
Ensimmรคinen askel minkรค tahansa koneoppimismallin toteuttamisessa tai luonnollisen kielen kรคsittelyn toteuttamisessa on tiedonkeruu.
Tarkkaile tietoja rakentaaksesi รคlykkรครคn chatbotin alla olevan Gensim Word2vec -esimerkin mukaisesti.
[{"tag": "welcome",
"patterns": ["Hi", "How are you", "Is any one to talk?", "Hello", "hi are you available"],
"responses": ["Hello, thanks for contacting us", "Good to see you here", "Hi there, how may I assist you?"]
},
{"tag": "goodbye",
"patterns": ["Bye", "See you later", "Goodbye", "I will come back soon"],
"responses": ["See you later, thanks for visiting", "have a great day ahead", "Wish you Come back again soon."]
},
{"tag": "thankful",
"patterns": ["Thanks for helping me", "Thank your guidance", "That's helpful and kind from you"],
"responses": ["Happy to help!", "Any time!", "My pleasure", "It is my duty to help you"]
},
{"tag": "hoursopening",
"patterns": ["What hours are you open?", "Tell your opening time?", "When are you open?", "Just your timing please"],
"responses": ["We're open every day 8am-7pm", "Our office hours are 8am-7pm every day", "We open office at 8 am and close at 7 pm"]
},
{"tag": "payments",
"patterns": ["Can I pay using credit card?", "Can I pay using Mastercard?", "Can I pay using cash only?"],
"responses": ["We accept VISA, Mastercard and credit card", "We accept credit card, debit cards and cash. Please don't worry"]
}
]
Tรคssรค on mitรค ymmรคrrรคmme datasta:
- Tรคmรค data sisรคltรครค kolme asiaa: tagin, mallin ja vastaukset. Tagi on tarkoitus (mikรค on keskustelun aihe).
- Tiedot ovat JSON-muodossa.
- Kuvio on kysymys, jonka kรคyttรคjรคt kysyvรคt botilta.
- Vastaukset ovat vastauksia, jotka chatbot antaa vastaavaan kysymykseen/kuvioon.
Vaihe 2) Tietojen esikรคsittely
On erittรคin tรคrkeรครค kรคsitellรค raakadataa. Jos koneeseen syรถtetรครคn puhdistettua dataa, malli reagoi tarkemmin ja oppii tiedot tehokkaammin.
Tรคssรค vaiheessa poistetaan pysรคytyssanat, rungonmuodostus, tarpeettomat sanat jne. Ennen jatkamista on tรคrkeรครค ladata data ja muuntaa se datakehykseksi. Katso alla oleva koodi tรคstรค.
import json json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f)
Selitys Code:
- Koska data on JSON-muodossa, json tuodaan.
- Tiedosto tallennetaan muuttujaan.
- Tiedosto avataan ja ladataan datamuuttujaan.
Nyt tiedot on tuotu, ja on aika muuntaa ne datakehykseksi. Katso seuraava vaihe alla olevasta koodista.
import pandas as pd df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join)
Selitys Code:
1. Data muunnetaan datakehykseksi kรคyttรคmรคllรค edellรค tuotuja pandoja.
2. Se muuntaa sarakekuvioiden luettelon merkkijonoksi.
from nltk.corpus import stopwords from textblob import Word stop = stopwords.words('english') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)) df['patterns'] = df['patterns'].str.replace('[^\w\s]', '') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
Code Selitys:
1. Englanninkieliset pysรคytyssanat tuodaan nltk-tyรถkalupakin stop-word-moduulilla.
2. Kaikki tekstin sanat muunnetaan pieniksi kirjaimiksi kรคyttรคmรคllรค for-ehtoa ja lambda-funktiota. A Lambda toiminto on anonyymi toiminto.
3. Kaikki datakehyksen tekstirivit tarkistetaan merkkijonojen vรคlimerkkien varalta ja ne suodatetaan.
4. Merkit, kuten numerot tai pisteet, poistetaan sรครคnnรถllisen lausekkeen avulla.
5. Digits poistetaan tekstistรค.
6. Stop-sanat poistetaan tรคssรค vaiheessa.
7. Sanat suodatetaan nyt ja saman sanan eri muodot poistetaan lemmatisoinnin avulla. Nรคillรค olemme saattaneet datan esikรคsittelyn pรครคtรถkseen.
lรคhtรถ:
, patterns, responses, tag 0,hi one talk hello hi available,"['Hello, thanks for contacting us', 'Good to see you here', ' Hi there, how may I assist you?']",welcome 1,bye see later goodbye come back soon,"['See you later, thanks for visiting', 'have a great day ahead', 'Wish you Come back again soon.']",goodbye 2,thanks helping thank guidance thats helpful kind,"['Happy to help!', 'Any time!', 'My pleasure', 'It is my duty to help you']",thankful 3,hour open tell opening time open timing please,"[""We're open every day 8am-7pm"", 'Our office hours are 8am-7pm every day', 'We open office at 8 am and close at 7 pm']",hoursopening 4,pay using credit card pay using mastercard pay using cash,"['We accept VISA, Mastercard and credit card', 'We accept credit card, debit cards and cash. Please dont worry']",payments
Vaihe 3) Neuraaliverkon rakentaminen Word2vecillรค
Nyt on aika rakentaa malli Gensim Word2vec -moduulia kรคyttรคen. Meidรคn on tuotava Word2vec Gensimistรค. Tehdรครคn tรคmรค, minkรค jรคlkeen rakennamme mallin ja viimeisessรค vaiheessa tarkistamme mallin reaaliaikaisen datan avulla.
from gensim.models import Word2Vec
Nyt voimme onnistuneesti rakentaa mallin Word2Vecillรค. Katso seuraavalta koodiriviltรค, โโmiten malli luodaan Word2Vecillรค. Teksti annetaan mallille luettelon muodossa, joten muunnamme datakehyksen tekstin luetteloksi alla olevan koodin avulla.
Bigger_list = [] for i in df['patterns']: li = list(i.split("")) Bigger_list.append(li) Model = Word2Vec(Bigger_list, min_count=1, size=300, workers=4)
Selitys Code:
1. Luotiin bigger_list-lista, johon sisรคlista liitetรครคn. Tรคmรค on muoto, joka syรถtetรครคn Word2Vec-mallille.
2. Toteutetaan silmukka ja jokainen datakehyksen kuviosarakkeen merkintรค iteroidaan.
3. Sarakekuvioiden jokainen elementti jaetaan ja tallennetaan sisempรครคn listaan โโli.
4. Sisรคiseen luetteloon liitetรครคn ulompi luettelo.
5. Tรคmรค lista on tarkoitettu Word2Vec-mallille. Tarkastellaanpa joitakin tรคssรค annettuja parametreja.
Min_count: Se jรคttรครค huomiotta kaikki sanat, joiden kokonaisfrekvenssi on tรคtรค pienempi.
Koko: Se kertoo sanavektorien ulottuvuuden.
tyรถntekijรคt: Nรคmรค ovat sรคikeet mallin kouluttamiseen.
Tarjolla on myรถs muita vaihtoehtoja, ja joitakin tรคrkeimmistรค selitetรครคn alla.
ikkuna: Maksimietรคisyys nykyisen ja ennustetun sanan vรคlillรค lauseessa.
Sg: Se on harjoitusalgoritmi: 1 skip-grammille ja 0 jatkuvalle sanapussille. Olemme kรคsitelleet nรคitรค yksityiskohtaisesti edellรค.
Hs: Jos tรคmรค on 1, kรคytรคmme opetuksessa hierarkkista softmaxia, ja jos 0, kรคytรคmme negatiivista nรคytteenottoa.
alpha: Alkuperรคinen oppimisnopeus.
Nรคytรค lopullinen koodi alla:
# list of libraries used by the code import string from gensim.models import Word2Vec import logging from nltk.corpus import stopwords from textblob import Word import json import pandas as pd # data in json format json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f) # displaying the list of stopwords stop = stopwords.words('english') # dataframe df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join) # cleaning the data using the NLP approach print(df) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)) df['patterns'] = df['patterns'].str.replace('[^\w\s]', '') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()])) # taking the outer list bigger_list = [] for i in df['patterns']: li = list(i.split(" ")) bigger_list.append(li) # structure of data to be taken by the model.word2vec print("Data format for the overall list:", bigger_list) # custom data is fed to machine for further processing model = Word2Vec(bigger_list, min_count=1, size=300, workers=4)
Vaihe 4) Mallin tallennus
Malli voidaan tallentaa bin- ja mallitiedostomuotoon. Bin on binรครคrimuoto. Katso alla olevat rivit mallin tallentamiseksi.
model.save("word2vec.model") model.save("model.bin")
Yllรค olevan koodin selitys
1. Malli tallennetaan .model-tiedostona.
2. Malli tallennetaan .bin-tiedostona.
Kรคytรคmme tรคtรค mallia reaaliaikaiseen testaukseen, kuten samankaltaisten sanojen, erilaisten sanojen ja yleisimpien sanojen testaamiseen.
Vaihe 5) Lataa malli ja suorita reaaliaikainen testaus
Malli ladataan alla olevalla koodilla:
model = Word2Vec.load('model.bin')
Jos haluat tulostaa sanaston siitรค, se tehdรครคn seuraavalla komennolla:
vocab = list(model.wv.vocab)
Katso tulos:
['see', 'thank', 'back', 'thanks', 'soon', 'open', 'mastercard', 'card', 'time', 'pay', 'talk', 'cash', 'one', 'please', 'goodbye', 'thats', 'helpful', 'hour', 'credit', 'hi', 'later', 'guidance', 'opening', 'timing', 'hello', 'helping', 'bye', 'tell', 'come', 'using', 'kind', 'available']
Vaihe 6) Useimpien samankaltaisten sanojen tarkistus
Toteutetaan asiat kรคytรคnnรถssรค:
similar_words = model.most_similar('thanks') print(similar_words)
Katso tulos:
[('kind', 0.16104359924793243), ('using', 0.1352398842573166), ('come', 0.11500970274209976), ('later', 0.09989878535270691), ('helping', 0.04855936020612717), ('credit', 0.04659383371472359), ('pay', 0.0329081267118454), ('thank', 0.02484947443008423), ('hour', 0.0202352125197649), ('opening', 0.018177658319473267)]
Vaihe 7) Ei vastaa sanaa toimitetuista sanoista
dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split()) print(dissimlar_words)
Olemme toimittaneet sanat Nรคhdรครคn myรถhemmin, kiitos vierailustasi.Tรคmรค tulostaa nรคistรค sanoista toisistaan โโโโpoikkeavimman sanan. Suoritetaan tรคmรค koodi ja etsitรครคn tulos.
Tulos yllรค olevan koodin suorittamisen jรคlkeen:
Thanks
Vaihe 8) Etsi samankaltaisuus kahden sanan vรคlillรค
Tรคmรค kertoo tuloksen kahden sanan samankaltaisuuden todennรคkรถisyyden funktiona. Katso alla olevasta koodista ohjeet tรคmรคn osion suorittamiseen.
similarity_two_words = model.similarity('please', 'see') print("Please provide the similarity between these two words:") print(similarity_two_words)
Yllรค olevan koodin tulos on seuraava:
0.13706
Voit lรถytรครค lisรครค samankaltaisia โโsanoja suorittamalla seuraavan koodin:
similar = model.similar_by_word('kind') print(similar)
Yllรค olevan koodin tuloste:
[('credit', 0.11764447391033173), ('cash', 0.11440904438495636), ('one', 0.11151769757270813), ('hour', 0.0944807156920433), ('using', 0.0705675333738327), ('thats', 0.05206916481256485), ('later', 0.04502468928694725), ('bye', 0.03960943967103958), ('back', 0.03837274760007858), ('thank', 0.0380823090672493)]


