Ugrađivanje riječi i Word2Vec s primjerom
⚡ Pametni sažetak
Word Embedding i Word2Vec pretvaraju tekst u guste numeričke vektore tako da modeli strojnog učenja prepoznaju riječi sa sličnim značenjem. Ovaj resurs objašnjava tehniku, njezine CBOW i Skip-Gram arhitekture, aktivacijske funkcije i potpunu Gensim implementaciju za stvarne primjene.

Što je Word Embedding?
Umetanje riječi je vrsta reprezentacije riječi koja omogućuje algoritmima strojnog učenja da razumiju riječi sa sličnim značenjima. To je tehnika modeliranja jezika i učenja značajki za mapiranje riječi u vektore realnih brojeva pomoću neuronskih mreža, probabilističkih modela ili smanjenja dimenzije na matrici zajedničkog pojavljivanja riječi. Neki modeli ugrađivanja riječi su Word2vec (Google), GloVe (Stanford) i fastText (Facebook).
Ugrađivanje riječi naziva se i distribuirani semantički model, distribuirani predstavljeni model, semantički vektorski prostor ili model vektorskog prostora. Dok čitate ove nazive, nailazite na riječ semantički, što znači kategoriziranje sličnih riječi. Na primjer, voće poput jabuke, manga i banane trebalo bi smjestiti blizu jedno drugome, dok će knjige biti smještene daleko od tih riječi. U širem smislu, ugrađivanje riječi stvorit će vektor voća koji je smješten daleko od vektorskog prikaza knjiga.
Gdje se koristi Word Embedding?
Ugrađivanje riječi pomaže u generiranju značajki, grupiranju dokumenata, klasifikaciji teksta i zadacima obrade prirodnog jezika. Navedimo ove primjene i raspravimo svaku od njih.
- Izračunaj slične riječi: Ugrađivanje riječi koristi se za predlaganje sličnih riječi riječi koja je podvrgnuta modelu predviđanja. Uz to, predlaže i različite riječi, kao i najčešće riječi.
- Napravite grupu povezanih riječi: Koristi se za semantičku grupuping, koji grupira stvari sličnih karakteristika zajedno i odmiče različite predmete.
- Značajka za klasifikaciju teksta: Tekst se mapira u nizove vektora koji se unose u model za obuku, kao i za predviđanje. Modeli klasifikatora temeljeni na tekstu ne mogu se trenirati na nizovima znakova, pa se time tekst pretvara u oblik koji se može trenirati strojno. Njegove značajke semantičke izgradnje dodatno pomažu u klasifikaciji temeljenoj na tekstu.
- Grupiranje dokumenata: Ovo je još jedna aplikacija u kojoj se Word Embedding i Word2vec široko koriste.
- Obrada prirodnog jezika: Postoje mnoge primjene u kojima je ugrađivanje riječi korisno i pobjeđuje nad značajkama extracfaze, kao što su označavanje vrsta riječi, analiza sentimenta i sintaktička analiza.
Sada kada razumijete gdje se primjenjuje ugrađivanje riječi, pogledajmo najpopularniji model koji se koristi za stvaranje ovih ugrađivanja.
Što je Word2vec?
Word2vec je tehnika ili model koji stvara ugrađivanja riječi za bolju reprezentaciju riječi. To je metoda obrade prirodnog jezika koja bilježi veliki broj preciznih sintaktičkih i semantičkih odnosa riječi. To je plitka dvoslojna neuronska mreža koja može otkriti sinonimne riječi i predložiti dodatne riječi za djelomične rečenice nakon što je obučena.
Prije nego što krenemo dalje, molimo pogledajte razliku između plitke i duboke neuronske mreže kao što je prikazano na donjem dijagramu primjera ugradnje Worda:
Plitka neuronska mreža sastoji se od samo jednog skrivenog sloja između ulaza i izlaza, dok duboka neuronska mreža sadrži više skrivenih slojeva između ulaza i izlaza. Ulaz je podložan čvorovima, dok skriveni sloj, kao i izlazni sloj, sadrži neurone.

Word2vec je dvoslojna mreža u kojoj postoji ulaz, jedan skriveni sloj i izlaz.
Word2vec je razvila grupa istraživača na čelu s Tomasom Mikolovom na GoogleWord2vec je bolji i učinkovitiji od modela latentne semantičke analize.
Zašto Word2vec?
Word2vec predstavlja riječi u vektorskom prostoru. Riječi su predstavljene u obliku vektora, a smještaj se vrši na takav način da se riječi sličnog značenja pojavljuju zajedno, a riječi različitih značenja nalaze se daleko. To se naziva i semantičkim odnosom. Neuronske mreže ne razumiju tekst; umjesto toga, razumiju samo brojeve. Ugrađivanje riječi (Word Embedding) omogućuje pretvaranje teksta u numerički vektor.
Word2vec rekonstruira jezični kontekst riječi. Prije nego što nastavimo, shvatimo što je jezični kontekst. U općem scenariju, kada govorimo ili pišemo kako bismo komunicirali, drugi ljudi pokušavaju shvatiti cilj rečenice. Na primjer, „Kolika je temperatura u Indiji?“ Ovdje je kontekst da korisnik želi znati „temperaturu Indije“. Ukratko, glavni cilj rečenice je kontekst. Riječi ili rečenice koje okružuju govorni ili pisani jezik pomažu u određivanju značenja konteksta. Word2vec uči vektorski prikaz riječi kroz te kontekste.
Što radi Word2vec?
Prije ugradnje riječi
Važno je znati koji je pristup korišten prije ugrađivanja riječi i koji su mu nedostaci, a zatim ćemo vidjeti kako se ti nedostaci prevladavaju ugrađivanjem riječi korištenjem Word2vec pristupa. Na kraju ćemo se osvrnuti na to kako Word2vec funkcionira, jer je važno razumjeti njegov način rada.
Pristup latentnoj semantičkoj analizi
Ovo je pristup koji se koristio prije ugrađivanja riječi. Koristio je koncept Vreće riječi, gdje su riječi predstavljene u obliku kodiranih vektora. To je rijetki vektorski prikaz gdje je dimenzija jednaka veličini vokabulara. Ako se riječ pojavljuje u rječniku, broji se; inače se ne broji. Za više informacija pogledajte program u nastavku.
Primjer Word2vec
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())
Izlaz:
[[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 Objašnjenje
- CountVectorizer je modul koji se koristi za pohranjivanje vokabulara na temelju uklapanja riječi u njega. Ovo je uvezeno iz sklearn-a.
- Napravite objekt pomoću klase CountVectorizer.
- Zapišite podatke u popis koji će se uklopiti u CountVectorizer.
- Podaci se uklapaju u objekt kreiran iz klase CountVectorizer.
- Primijenite pristup "vreće riječi" za brojanje riječi u podacima pomoću vokabulara. Ako riječ ili token nisu dostupni u vokabularu, tada se takva pozicija indeksa postavlja na nulu.
- Varijabla u retku 5, koja je x, pretvara se u niz (metoda dostupna za x). To daje broj svakog tokena u rečenici ili popisu navedenom u retku 3.
- Ovo prikazuje značajke koje su dio vokabulara kada se prilagodi korištenjem podataka iz retka 4.
U latentno-semantičkom pristupu, redak predstavlja jedinstvene riječi, dok stupac predstavlja broj pojavljivanja te riječi u dokumentu. To je prikaz riječi u obliku matrice dokumenta. Učestalost pojma - inverzna učestalost dokumenta (TF-IDF) koristi se za brojanje učestalosti riječi u dokumentu, što je učestalost pojma u dokumentu podijeljena s učestalošću pojma u cijelom korpusu.
Nedostatak metode Vrećica riječi
- Zanemaruje redoslijed riječi; na primjer, to je loše = loše je ovo.
- Zanemaruje kontekst riječi. Pretpostavimo da napišemo rečenicu „Volio je knjige. Obrazovanje se najbolje nalazi u knjigama.“ Stvorila bi dva vektora: jedan za „Volio je knjige“ i drugi za „Obrazovanje se najbolje nalazi u knjigama“. Oba bi se tretirala kao ortogonalna, što ih čini neovisnima, ali u stvarnosti su međusobno povezani.
Kako bi se prevladala ta ograničenja, razvijeno je ugrađivanje riječi, a Word2vec je jedan od pristupa koji se koristi za njegovu implementaciju.
Kako radi Word2vec?
Word2vec uči riječ predviđajući njen okolni kontekst. Na primjer, uzmimo riječ „On voli Nogomet."
Želimo izračunati Word2vec za riječ: voli.
Pretpostavimo:
loves = Vin. P(Vout / Vin) is calculated where, Vin is the input word. P is the probability of likelihood. Vout is the output word.
Riječ voli pomiče se preko svake riječi u korpusu. Kodiraju se sintaktički i semantički odnosi između riječi. To pomaže u pronalaženju sličnih i analognih riječi.
Sve nasumične značajke riječi voli izračunavaju se. Ove se značajke mijenjaju ili ažuriraju u odnosu na susjedne ili kontekstualne riječi uz pomoć Povratno razmnožavanje metoda.
Drugi način učenja jest da ako su konteksti dviju riječi slični ili dvije riječi imaju slične značajke, onda su takve riječi povezane.
Word2vec Architektura
Postoje dvije arhitekture koje koristi Word2vec:
- Neprekidna vreća riječi (CBOW)
- Skip-gram
Prije nego što nastavimo, raspravimo zašto su ove arhitekture ili modeli važni s gledišta reprezentacije riječi. Učenje reprezentacije riječi je u biti nenadzirano, ali ciljevi/oznake su potrebni za treniranje modela. Skip-gram i CBOW pretvaraju nenadziranu reprezentaciju u nadzirani oblik za treniranje modela.
U CBOW-u se trenutna riječ predviđa pomoću prozora okolnih prozora konteksta. Na primjer, ako wi-1Wi-2Wi+1Wi+2 su date riječi ili kontekst, ovaj model će pružiti wi.
Skip-Gram izvodi suprotno od CBOW-a, što implicira da predviđa zadani slijed ili kontekst iz riječi. Možete obrnuti primjer da biste ga razumjeli. Ako wi je zadano, ovo će predvidjeti kontekst ili wi-1Wi-2Wi+1Wi+2.
Word2vec nudi mogućnost odabira između CBOW (Continuous Bag of Words - Kontinuirana vreća riječi) i skip-grama. Takvi parametri se daju tijekom treniranja modela. Moguće je koristiti negativno uzorkovanje ili hijerarhijski softmax sloj.
Kontinuirana vreća riječi
Nacrtajmo jednostavan Word2vec dijagram kako bismo razumjeli arhitekturu kontinuirane vreće riječi.
Izračunajmo jednadžbe matematički. Pretpostavimo da je V veličina vokabulara, a N veličina skrivenog sloja. Ulaz je definiran kao { xi-1,xi-2,xi+1,xi+2 }. Matricu težina dobivamo množenjem V * N. Druga matrica dobiva se množenjem ulaznog vektora s matricom težina. To se također može razumjeti sljedećom jednadžbom.
h = xitW
gdje je xit i W su ulazni vektor i matrica težina.
Za izračun podudaranja između konteksta i sljedeće riječi, pogledajte donju jednadžbu.
u = predviđena reprezentacija * h
gdje se predviđena reprezentacija dobiva iz modela u gornjoj jednadžbi.
Skip-Gram model
Skip-Gram pristup se koristi za predviđanje rečenice na temelju ulazne riječi. Da bismo ga bolje razumjeli, nacrtajmo dijagram prikazan u donjem Word2vec primjeru.
Može se tretirati kao obrnuto od modela Kontinuirane vreće riječi, gdje je ulaz riječ, a model pruža kontekst ili niz. Također možemo zaključiti da se cilj dovodi na ulaz, a izlazni sloj se replicira više puta kako bi se prilagodio odabranom broju kontekstualnih riječi. Vektor pogreške iz svih izlaznih slojeva zbraja se kako bi se prilagodile težine metodom povratnog širenja.
Koji model odabrati?
CBOW je nekoliko puta brži od skip-grama i pruža bolju frekvenciju za česte riječi, dok skip-gram zahtijeva malu količinu podataka za učenje i predstavlja čak i rijetke riječi ili fraze. Tablica u nastavku uspoređuje obje arhitekture na prvi pogled.
| Aspekt | CBOW | Skip-Gram |
|---|---|---|
| Proricanje | Predviđa ciljanu riječ iz konteksta | Predviđa kontekst iz ciljane riječi |
| Brzina treninga | Brže | sporiji |
| Česte riječi | Veća točnost | Manja točnost |
| Rijetke riječi | Slabija zastupljenost | Jača zastupljenost |
| Podaci o treningu | Potrebno je više podataka | Radi s manje podataka |
Odnos između Word2veca i NLTK-a
NLTK je Prirodno Language Toolkit. Koristi se za predobradu teksta. Mogu se izvoditi različite operacije poput označavanja vrsta riječi, lematizacije, određivanja korijena, uklanjanja zaustavnih riječi i uklanjanja rijetkih ili najmanje korištenih riječi. Pomaže u čišćenju teksta, kao i u pripremi značajki iz učinkovitih riječi. S druge strane, Word2vec se koristi za semantičko (usko povezane stavke zajedno) i sintaktičko (slijed) podudaranje. Pomoću Word2veca mogu se pronaći slične riječi, različite riječi, dimenzionalna redukcija i mnoge druge. Još jedna važna značajka Word2veca je pretvaranje višedimenzionalne reprezentacije teksta u nižedimenzionalne vektore.
Gdje koristiti NLTK i Word2vec?
Ako se moraju obaviti neki zadaci opće namjene kao što je gore spomenuto, poput tokenizacije, POS označavanja i parsiranja, mora se koristiti NLTK, dok se za predviđanje riječi prema nekom kontekstu, modeliranju teme ili sličnosti dokumenata mora koristiti Word2vec.
Odnos NLTK-a i Word2veca uz pomoć koda
NLTK i Word2vec mogu se koristiti zajedno za pronalaženje sličnih reprezentacija riječi ili sintaktičkog podudaranja. NLTK alati mogu se koristiti za učitavanje mnogih paketa koji dolaze s NLTK-om, a model se može stvoriti pomoću Word2vec-a. Zatim se može testirati na riječima u stvarnom vremenu. Pogledajmo kombinaciju oba u sljedećem kodu. Prije daljnje obrade, pogledajte korpuse koje NLTK pruža. Možete ga preuzeti pomoću naredbe:
nltk(nltk.download('all'))
Molimo pogledajte snimku zaslona za kôd.
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)
Izlaz:
[('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)]
Objašnjenje Code
- Uvezena je nltk biblioteka, odakle možete preuzeti abc korpus koji ćemo koristiti u sljedećem koraku.
- Gensim je uvezen. Ako Gensim Word2vec nije instaliran, instalirajte ga pomoću naredbe „pip3 install gensim“. Pogledajte snimku zaslona u nastavku.
- Uvezite abc korpus, koji je preuzet pomoću nltk.download('abc').
- Proslijedite datoteke Word2vec modelu, koji je uvezen pomoću Gensima, kao rečenice.
- Vokabular se pohranjuje u obliku varijable.
- Model se testira na uzorku riječi znanost, budući da su te datoteke povezane sa znanošću.
- Ovdje model predviđa sličnu riječ „znanost“.
Aktivatori i Word2Vec
Aktivacijska funkcija neurona definira izlaz tog neurona s obzirom na skup ulaznih signala. Biološki je inspirirana aktivnošću u našem mozgu, gdje se različiti neuroni aktiviraju pomoću različitih podražaja. Razumijemo aktivacijsku funkciju kroz sljedeći dijagram.
Ovdje su x1, x2, ... x4 čvorovi neuronske mreže.
w1, w2, w3 su težine čvorova.
Zbrajanje (Σ) svih težina i vrijednosti čvorova funkcionira kao aktivacijska funkcija.
Zašto aktivacijska funkcija?
Ako se ne koristi aktivacijska funkcija, izlaz bi bio linearan, ali funkcionalnost linearne funkcije je ograničena. Da bi se postigla složena funkcionalnost kao što su detekcija objekata, klasifikacija slika, typing tekst pomoću glasa i mnogi drugi nelinearni izlazi, potrebna je aktivacijska funkcija.
Kako se aktivacijski sloj izračunava u ugradnji riječi (Word2vec)
Softmax sloj (normalizirana eksponencijalna funkcija) je funkcija izlaznog sloja koja aktivira ili pokreće svaki čvor. Drugi korišteni pristup je Hijerarhijski softmax, gdje se složenost izračunava pomoću O(log2V), dok je u softmaxu to O(V), gdje je V veličina vokabulara. Razlika između njih je smanjenje složenosti u hijerarhijskom softmax sloju. Da biste razumjeli njegovu funkcionalnost, pogledajte donji primjer ugradnje riječi:
Pretpostavimo da želimo izračunati vjerojatnost opažanja riječi ljubav s obzirom na određeni kontekst. Tok od korijena do listnog čvora prvo će se pomaknuti do čvora 2, a zatim do čvora 5. Dakle, ako imamo veličinu vokabulara od 8, potrebna su samo tri izračuna. To omogućuje dekompoziciju izračuna vjerojatnosti jedne riječi (ljubav).
Koje su druge opcije dostupne osim Hijerarhijskog Softmaxa?
U općem smislu, dostupne opcije ugrađivanja riječi su Differentiated Softmax, CNN-Softmax, Importance Sampling, Adaptive Importance Sampling, Noise Contrastive Estimation, Negativno uzorkovanje, Samonormalizacija i Rijetka normalizacija.
Govoreći konkretno o Word2vecu, imamo dostupne negativne uzorke.
Negativno uzorkovanje je način uzorkovanja podataka za učenje. Pomalo je slično stohastičkom gradijentnom spustu, ali s nekim razlikama. Negativno uzorkovanje traži samo negativne primjere učenja. Temelji se na kontrastivnoj procjeni šuma i nasumično uzorkuje riječi koje nisu u kontekstu. To je brza metoda učenja i nasumično bira kontekst. Ako se predviđena riječ pojavljuje u nasumično odabranom kontekstu, oba vektora su blizu jedan drugome.
Kakav se zaključak može izvući?
Aktivatori aktiviraju neurone baš kao što se naši neuroni aktiviraju pomoću vanjskih podražaja. Softmax sloj je jedna od funkcija izlaznog sloja koja aktivira neurone u slučaju ugrađivanja riječi. U Word2vec-u imamo opcije kao što su hijerarhijski softmax i negativno uzorkovanje. Pomoću aktivatora može se pretvoriti linearna funkcija u nelinearnu funkciju, a složeni algoritam strojnog učenja može se implementirati pomoću takvih funkcija.
Što je Gensim?
Gensim je alat otvorenog koda za modeliranje teme i obradu prirodnog jezika koji je implementiran u Python i Cython. Gensim alati omogućuju korisnicima uvoz Word2veca za modeliranje tema kako bi otkrili skrivenu strukturu u tijelu teksta. Gensim pruža ne samo implementaciju Word2veca već i Doc2vec i FastText.
Ovaj odjeljak je usmjeren na Word2vec, pa ćemo se držati trenutne teme.
Kako implementirati Word2vec koristeći Gensim
Do sada smo raspravljali o tome što je Word2vec, njegovim različitim arhitekturama, zašto dolazi do prelaska s vreće riječi na Word2vec, odnosu između Word2veca i NLTK-a s aktivnim kodom te aktivacijskim funkcijama.
U nastavku slijedi detaljan postupak implementacije Word2vec-a pomoću Gensima:
Korak 1) Prikupljanje podataka
Prvi korak u implementaciji bilo kojeg modela strojnog učenja ili implementaciji obrade prirodnog jezika je prikupljanje podataka.
Obratite pažnju na podatke kako biste izgradili inteligentni chatbot kao što je prikazano u donjem primjeru Gensim Word2vec.
[{"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"]
}
]
Evo što razumijemo iz podataka:
- Ovi podaci sadrže tri stvari: oznaku, uzorak i odgovore. Oznaka predstavlja namjeru (što je tema rasprave).
- Podaci su u JSON formatu.
- Uzorak je pitanje koje će korisnici postaviti botu.
- Odgovori su odgovori koje će chatbot dati na odgovarajuće pitanje/uzorak.
Korak 2) Predobrada podataka
Vrlo je važno obraditi neobrađene podatke. Ako se očišćeni podaci unesu u stroj, tada će model reagirati točnije i učinkovitije naučiti podatke.
Ovaj korak uključuje uklanjanje zaustavnih riječi, korijena, nepotrebnih riječi itd. Prije nego što nastavite, važno je učitati podatke i pretvoriti ih u okvir podataka. Za to pogledajte donji kod.
import json json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f)
Objašnjenje Code:
- Budući da su podaci u JSON formatu, uvozi se json.
- Datoteka je pohranjena u varijabli.
- Datoteka se otvara i učitava u varijablu podataka.
Podaci su sada uvezeni i vrijeme je za njihovo pretvaranje u okvir podataka. Za sljedeći korak pogledajte donji kod.
import pandas as pd df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join)
Objašnjenje Code:
1. Podaci se pretvaraju u okvir podataka pomoću pandas-a, koji je gore uvezen.
2. Pretvara popis u uzorcima stupaca u niz znakova.
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 Objašnjenje:
1. Engleske stop riječi uvoze se pomoću modula stop-word iz nltk alata.
2. Sve riječi teksta pretvaraju se u mala slova pomoću uvjeta for i lambda funkcije. A Lambda funkcija je anonimna funkcija.
3. Svi retci teksta u okviru podataka provjeravaju se na interpunkciju stringova i oni se filtriraju.
4. Znakovi poput brojeva ili točaka uklanjaju se pomoću regularnog izraza.
5. Digits se uklanjaju iz teksta.
6. Zaustavne riječi uklanjaju se u ovoj fazi.
7. Riječi su sada filtrirane, a različiti oblici iste riječi uklanjaju se lematizacijom. Time smo završili predobradu podataka.
Izlaz:
, 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
Korak 3) Izgradnja neuronske mreže pomoću programa Word2vec
Sada je vrijeme za izradu modela pomoću Gensim Word2vec modula. Moramo uvesti Word2vec iz Gensima. Učinimo to, a zatim ćemo ga izgraditi, a u završnoj fazi ćemo provjeriti model na podacima u stvarnom vremenu.
from gensim.models import Word2Vec
Sada možemo uspješno izraditi model pomoću Word2Vec-a. Pogledajte sljedeći redak koda kako biste saznali kako izraditi model pomoću Word2Vec-a. Tekst se modelu dostavlja u obliku popisa, pa ćemo tekst iz okvira podataka pretvoriti u popis pomoću donjeg koda.
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)
Objašnjenje Code:
1. Kreirana je bigger_list gdje se dodaje unutarnji popis. Ovo je format koji se unosi u model Word2Vec.
2. Implementirana je petlja i svaki unos stupca uzoraka okvira podataka se iterira.
3. Svaki element uzoraka stupaca je podijeljen i pohranjen u unutarnjoj listi li.
4. Unutarnji popis se dodaje vanjskom popisu.
5. Ovaj popis je dostavljen modelu Word2Vec. Razumijemo neke od ovdje navedenih parametara.
Min_count: Ignorira sve riječi s ukupnom frekvencijom nižom od ove.
Veličina pakiranja: Govori o dimenzionalnosti vektora riječi.
radnici: Ovo su niti za treniranje modela.
Postoje i druge opcije, a neke važne objašnjene su u nastavku.
Prozor: Maksimalna udaljenost između trenutne i predviđene riječi unutar rečenice.
Sg: To je algoritam za učenje: 1 za skip-gram i 0 za kontinuiranu vreću riječi. O tome smo detaljno raspravljali gore.
Hs: Ako je ovo 1, tada koristimo hijerarhijski softmax za treniranje, a ako je 0, tada se koristi negativno uzorkovanje.
Alfa: Početna stopa učenja.
Prikažimo konačni kod ispod:
# 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)
Korak 4) Spremanje modela
Model se može spremiti u obliku bin i datoteke modela. Bin je binarni format. Za spremanje modela pogledajte donje retke.
model.save("word2vec.model") model.save("model.bin")
Objašnjenje gornjeg koda
1. Model se sprema u obliku .model datoteke.
2. Model se sprema u obliku .bin datoteke.
Ovaj model ćemo koristiti za testiranje u stvarnom vremenu, kao što su slične riječi, različite riječi i najčešće riječi.
Korak 5) Učitavanje modela i izvođenje testiranja u stvarnom vremenu
Model se učitava pomoću sljedećeg koda:
model = Word2Vec.load('model.bin')
Ako želite ispisati vokabular iz njega, to se radi pomoću sljedeće naredbe:
vocab = list(model.wv.vocab)
Molimo pogledajte rezultat:
['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']
Korak 6) Provjera najsličnijih riječi
Praktično implementirajmo stvari:
similar_words = model.most_similar('thanks') print(similar_words)
Molimo pogledajte rezultat:
[('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)]
Korak 7) Ne odgovara riječi ni od ponuđenih riječi
dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split()) print(dissimlar_words)
Mi smo dostavili riječi 'Vidimo se kasnije, hvala na posjeti'Ovo ispisuje najrazličitiju riječ od ovih riječi. Pokrenimo ovaj kod i pronađimo rezultat.
Rezultat nakon izvršenja gornjeg koda:
Thanks
Korak 8) Pronalaženje sličnosti između dvije riječi
Ovo daje rezultat u smislu vjerojatnosti sličnosti između dvije riječi. Pogledajte donji kod o tome kako izvršiti ovaj odjeljak.
similarity_two_words = model.similarity('please', 'see') print("Please provide the similarity between these two words:") print(similarity_two_words)
Rezultat gornjeg koda je sljedeći:
0.13706
Slične riječi možete pronaći izvršavanjem sljedećeg koda:
similar = model.similar_by_word('kind') print(similar)
Izlaz gornjeg koda:
[('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)]


