Word-inbedding en Word2Vec-model met voorbeeld
Wat is woordinsluiting?
Woord insluiten is een woordrepresentatietype waarmee machine learning-algoritmen woorden met vergelijkbare betekenissen kunnen begrijpen. Het is een taalmodellerings- en feature learning-techniek om woorden in vectoren van reële getallen te mappen met behulp van neurale netwerken, probabilistische modellen of dimensiereductie op de woordco-occurrencematrix. Enkele woord-embeddingmodellen zijn Word2vec (Google), Glove (Stanford) en faster (Facebook).
Word Embedding wordt ook wel gedistribueerd semantisch model of gedistribueerd weergegeven of semantische vectorruimte of vectorruimtemodel genoemd. Terwijl u deze namen leest, komt u het woord semantisch tegen, wat betekent dat u soortgelijke woorden samen categoriseert. Fruit zoals appel, mango en banaan moeten bijvoorbeeld dichtbij worden geplaatst, terwijl boeken ver weg zijn van deze woorden. In bredere zin zal het inbedden van woorden de vector van vruchten creëren die ver weg zal worden geplaatst van de vectorrepresentatie van boeken.
Waar wordt Word-insluiting gebruikt?
Word embedding helpt bij feature generation, document clustering, text classification en natural language processing-taken. Laten we ze opnoemen en een discussie voeren over elk van deze applicaties.
- Bereken soortgelijke woorden: Woordinbedding wordt gebruikt om soortgelijke woorden te suggereren als het woord dat aan het voorspellingsmodel wordt onderworpen. Daarnaast suggereert het ook ongelijksoortige woorden, evenals de meest voorkomende woorden.
- Maak een groep verwante woorden: Het wordt gebruikt voor semantische groepering, waarbij dingen met een soortgelijk kenmerk bij elkaar worden gegroepeerd en die ver weg van elkaar verschillen.
- Functie voor tekstclassificatie: Tekst wordt in kaart gebracht in reeksen vectoren die aan het model worden toegevoerd voor zowel training als voorspelling. Op tekst gebaseerde classificatiemodellen kunnen niet op de string worden getraind, dus hierdoor wordt de tekst omgezet in een machinaal trainbare vorm. Verder de kenmerken van het bouwen van semantische hulp bij op tekst gebaseerde classificatie.
- Documentclustering: is een andere applicatie waarbij Word Embedding Word2vec veel wordt gebruikt
- Natuurlijke taalverwerking: Er zijn veel toepassingen waarbij het insluiten van woorden nuttig is en de extractiefasen van kenmerken wint, zoals het taggen van delen van spraak, sentimentele analyse en syntactische analyse. Nu hebben we enige kennis van het insluiten van woorden. Er wordt ook enig licht geworpen op verschillende modellen om woordinbedding te implementeren. Deze hele Word Embedding-tutorial is gericht op een van de modellen (Word2vec).
Wat is Word2vec?
Woord2vec is een techniek/model om woordinbedding te produceren voor een betere woordrepresentatie. Het is een natuurlijke taalverwerkingsmethode die een groot aantal precieze syntactische en semantische woordrelaties vastlegt. Het is een ondiep, uit twee lagen bestaand neuraal netwerk dat synonieme woorden kan detecteren en aanvullende woorden voor gedeeltelijke zinnen kan voorstellen zodra het is getraind.
Voordat u verder gaat in deze Word2vec-tutorial, bekijkt u eerst het verschil tussen een ondiep en een diep neuraal netwerk, zoals weergegeven in het onderstaande voorbeelddiagram voor het insluiten van Word:
Het ondiepe neurale netwerk bestaat uit de enige verborgen laag tussen invoer en uitvoer, terwijl het diepe neurale netwerk meerdere verborgen lagen tussen invoer en uitvoer bevat. Invoer wordt onderworpen aan knooppunten, terwijl de verborgen laag, evenals de uitvoerlaag, neuronen bevat.
Word2vec is een tweelaags netwerk waarbij er sprake is van invoer, één verborgen laag en uitvoer.
Word2vec is ontwikkeld door een groep onderzoekers onder leiding van Tomas Mikolov van Google. Word2vec is beter en efficiënter dan het latente semantische analysemodel.
Waarom Word2vec?
Word2vec representeert woorden in vectorruimte-representatie. Woorden worden gerepresenteerd in de vorm van vectoren en plaatsing gebeurt op zo'n manier dat woorden met een vergelijkbare betekenis samen verschijnen en woorden met een verschillende betekenis ver uit elkaar liggen. Dit wordt ook wel een semantische relatie genoemd. Neurale netwerken begrijpen geen tekst, maar alleen getallen. Word Embedding biedt een manier om tekst om te zetten in een numerieke vector.
Word2vec reconstrueert de taalkundige context van woorden. Voordat we verder gaan, moeten we eerst begrijpen wat de taalkundige context is? In het algemene levensscenario waarin we spreken of schrijven om te communiceren, proberen andere mensen erachter te komen wat het doel van de zin is. Bijvoorbeeld: "Wat is de temperatuur van India", hier is de context dat de gebruiker de "temperatuur van India" wil weten, wat context is. Kortom, het hoofddoel van een zin is context. Woord of zin rond gesproken of geschreven taal (onthulling) helpt bij het bepalen van de betekenis van context. Word2vec leert vectorrepresentaties van woorden via de contexten.
Wat Word2vec doet?
Vóór het insluiten van woorden
Het is belangrijk om te weten welke aanpak wordt gebruikt vóór het insluiten van woorden en wat de nadelen zijn. Vervolgens gaan we over op het onderwerp hoe minpunten worden overwonnen door het insluiten van Word met behulp van de Word2vec-aanpak. Ten slotte zullen we uitleggen hoe Word2vec werkt, omdat het belangrijk is om te begrijpen hoe het werkt.
Aanpak voor latente semantische analyse
Dit is de aanpak die werd gebruikt vóór het insluiten van woorden. Het gebruikte het concept van de Zak met woorden, waarbij woorden worden weergegeven in de vorm van gecodeerde vectoren. Het is een schaarse vectorrepresentatie waarbij de dimensie gelijk is aan de grootte van de woordenschat. Als het woord in het woordenboek voorkomt, wordt het meegeteld, anders niet. Voor meer informatie kunt u het onderstaande programma raadplegen.
Word2vec-voorbeeld
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())
Output:
[[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 Uitleg
- CountVectorizer is de module die wordt gebruikt om de woordenschat op te slaan op basis van het passen van de woorden erin. Dit wordt geïmporteerd uit de sklearn.
- Maak het object met behulp van de klasse CountVectorizer.
- Schrijf de gegevens in de lijst die in de CountVectorizer moet worden gepast.
- Gegevens passen in het object dat is gemaakt op basis van de klasse CountVectorizer.
- Pas een 'zak met woorden'-benadering toe om woorden in de gegevens te tellen met behulp van woordenschat. Als een woord of token niet beschikbaar is in het vocabulaire, wordt deze indexpositie op nul gezet.
- Variabele in regel 5, namelijk x, wordt geconverteerd naar een array (methode beschikbaar voor x). Dit geeft het aantal van elk token in de zin of lijst in regel 3.
- Dit toont de kenmerken die deel uitmaken van de woordenschat wanneer deze wordt aangepast met behulp van de gegevens in regel 4.
Bij de latent-semantische benadering vertegenwoordigt de rij unieke woorden, terwijl de kolom het aantal keren vertegenwoordigt dat dat woord in het document voorkomt. Het is een weergave van woorden in de vorm van de documentmatrix. Term-Frequentie inverse documentfrequentie (TFIDF) wordt gebruikt om de frequentie van woorden in het document te tellen. Dit is de frequentie van de term in het document/frequentie van de term in het gehele corpus.
Tekortkoming van de Bag of Words-methode
- Het negeert de volgorde van het woord, bijvoorbeeld: dit is slecht = slecht is dit.
- Het negeert de context van woorden. Stel dat ik de zin schrijf: 'Hij hield van boeken. Onderwijs kun je het beste vinden in boeken.” Er zouden twee vectoren ontstaan: één voor ‘Hij hield van boeken’ en de andere voor ‘Onderwijs kun je het beste vinden in boeken’. Het zou ze allebei orthogonaal behandelen, waardoor ze onafhankelijk zijn, maar in werkelijkheid zijn ze aan elkaar gerelateerd
Om deze beperking te overwinnen is woordinbedding ontwikkeld en Word2vec is een benadering om dit te implementeren.
Hoe werkt Word2vec?
Word2vec leert woorden door de omringende context te voorspellen. Laten we bijvoorbeeld het woord ‘Hij’ nemen houdt Voetbal."
We willen de Word2vec berekenen voor het woord: liefdes.
Veronderstellen
loves = Vin. P(Vout / Vin) is calculated where, Vin is the input word. P is the probability of likelihood. Vout is the output word.
Woord houdt beweegt over elk woord in het corpus. Zowel de syntactische als de semantische relatie tussen woorden wordt gecodeerd. Dit helpt bij het vinden van soortgelijke woorden en analogieën.
Allemaal willekeurige kenmerken van het woord houdt berekend. Deze functies worden gewijzigd of bijgewerkt met betrekking tot buur- of contextwoorden met behulp van a Terug Voortplanting methode.
Een andere manier om te leren is dat als de context van twee woorden vergelijkbaar is of als twee woorden vergelijkbare kenmerken hebben, deze woorden verwant zijn.
Woord2vec Architectuur
Word2vec gebruikt twee architecturen:
- Doorlopende zak met woorden (CBOW)
- Gram overslaan
Voordat we verdergaan in deze Word2vec-tutorial, bespreken we waarom deze architecturen of modellen belangrijk zijn vanuit het oogpunt van woordrepresentatie. Het leren van woordrepresentatie is in wezen ongesuperviseerd, maar er zijn doelen/labels nodig om het model te trainen. Skip-gram en CBOW converteren ongesuperviseerde representatie naar gesuperviseerde vorm voor modeltraining.
In CBOW wordt het huidige woord voorspeld met behulp van het venster van de omliggende contextvensters. Bijvoorbeeld, als wi-1,wi-2,wik + 1,wik + 2woorden of context krijgen, zal dit model wi
Skip-Gram presteert het tegenovergestelde van CBOW, wat impliceert dat het de gegeven volgorde of context van het woord voorspelt. Je kunt het voorbeeld omdraaien om het te begrijpen. Als wi is gegeven, zal dit de context voorspellen of wi-1,wi-2,wik + 1,wik+2.
Word2vec biedt een optie om te kiezen tussen CBOW (continuous Bag of words) en skim-gram. Dergelijke parameters worden verstrekt tijdens de training van het model. Men kan de optie hebben om negatieve bemonstering of hiërarchische softmax-laag te gebruiken.
Doorlopende zak met woorden
Laten we een eenvoudig Word2vec-voorbeelddiagram tekenen om de continue woordstructuur te begrijpen.
Laten we de vergelijkingen wiskundig berekenen. Stel dat V de grootte van de woordenschat is en N de grootte van de verborgen laag. Invoer wordt gedefinieerd als { xi-1, xik-2, xik+1, xik + 2}. We verkrijgen de gewichtsmatrix door V * N te vermenigvuldigen. Een andere matrix wordt verkregen door de invoervector te vermenigvuldigen met de gewichtsmatrix. Dit kan ook worden begrepen door de volgende vergelijking.
h=xitW
waar xit? W zijn respectievelijk de invoervector en de gewichtsmatrix,
Raadpleeg de onderstaande vergelijking om de overeenkomst tussen de context en het volgende woord te berekenen
u=voorspelde representatie*h
waarbij de voorspelde representatie wordt verkregen van model?h in de bovenstaande vergelijking.
Skip-Gram-model
Skip-Gram-aanpak wordt gebruikt om een zin te voorspellen op basis van een invoerwoord. Laten we, om het beter te begrijpen, het diagram tekenen zoals weergegeven in het onderstaande Word2vec-voorbeeld.
Je kunt het beschouwen als het omgekeerde van het Continuous Bag of Word-model, waarbij de invoer het woord is en het model de context of de volgorde biedt. We kunnen ook concluderen dat het doel naar de invoer- en uitvoerlaag wordt gevoerd en meerdere keren wordt gerepliceerd om plaats te bieden aan het gekozen aantal contextwoorden. De foutvector van de gehele uitvoerlaag wordt opgeteld om de gewichten aan te passen via een backpropagation-methode.
Welk model te kiezen?
CBOW is meerdere malen sneller dan grammen overslaan en biedt een betere frequentie voor veel voorkomende woorden, terwijl grammen overslaan een kleine hoeveelheid trainingsgegevens nodig heeft en zelfs zeldzame woorden of zinnen vertegenwoordigt.
De relatie tussen Word2vec en NLTK
NLTK is een natuurlijke taaltoolkit. Het wordt gebruikt voor het voorbewerken van de tekst. Men kan verschillende bewerkingen uitvoeren, zoals het taggen van woordsoorten, lemmatiseren, stemmingen maken, stopwoorden verwijderen, zeldzame woorden of minst gebruikte woorden verwijderen. Het helpt bij het opschonen van de tekst en helpt bij het voorbereiden van de kenmerken van de effectieve woorden. Aan de andere kant wordt Word2vec gebruikt voor semantische (nauw verwante items samen) en syntactische (sequentie) matching. Met Word2vec kan men vergelijkbare woorden, ongelijksoortige woorden, dimensionale reductie en vele anderen vinden. Een andere belangrijke functie van Word2vec is het omzetten van de hogere dimensionale representatie van de tekst in lagere dimensionale vectoren.
Waar NLTK en Word2vec gebruiken?
Als je een aantal algemene taken moet uitvoeren, zoals hierboven vermeld, zoals tokenisatie, POS-tagging en parsing, moet je NLTK gebruiken, terwijl je voor het voorspellen van woorden op basis van een bepaalde context, onderwerpmodellering of documentovereenkomst Word2vec moet gebruiken.
Relatie van NLTK en Word2vec met behulp van code
NLTK en Word2vec kunnen samen worden gebruikt om soortgelijke woordrepresentaties of syntactische overeenkomsten te vinden. NLTK toolkit kan worden gebruikt om veel pakketten te laden die met NLTK worden geleverd en het model kan worden gemaakt met Word2vec. Het kan vervolgens worden getest op de realtime woorden. Laten we de combinatie van beide bekijken in de volgende code. Voordat u verder gaat met verwerken, kijk dan even naar de corpora die NLTK biedt. U kunt downloaden met de opdracht
nltk(nltk.download('all'))
Zie de schermafbeelding voor de code.
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)
Output:
[('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)]
Verklaring van code
- nltk-bibliotheek wordt geïmporteerd, van waaruit u het abc-corpus kunt downloaden dat we in de volgende stap zullen gebruiken.
- Gensim wordt geïmporteerd. Als Gensim Word2vec niet is geïnstalleerd, installeer het dan met de opdracht "pip3 install gensim". Zie de onderstaande schermafbeelding.
- importeer het corpus abc dat is gedownload met nltk.download('abc').
- Geef de bestanden door aan het model Word2vec dat met Gensim als zinnen wordt geïmporteerd.
- De woordenschat wordt opgeslagen in de vorm van de variabele.
- Het model is getest op voorbeeldwoordwetenschap, omdat deze bestanden verband houden met wetenschap.
- Hier wordt het soortgelijke woord ‘wetenschap’ voorspeld door het model.
Activators en Word2Vec
De activeringsfunctie van het neuron definieert de output van dat neuron gegeven een set inputs. Biologisch geïnspireerd door een activiteit in onze hersenen waarbij verschillende neuronen worden geactiveerd met behulp van verschillende stimuli. Laten we de activeringsfunctie begrijpen via het volgende diagram.
Hier is x1,x2,..x4 het knooppunt van het neurale netwerk.
w1, w2, w3 is het gewicht van het knooppunt,
? is de som van alle gewichts- en knooppuntwaarden die als activeringsfunctie werken.
Waarom activeringsfunctie?
Als er geen activeringsfunctie wordt gebruikt, zou de uitvoer lineair zijn, maar de functionaliteit van de lineaire functie is beperkt. Om complexe functionaliteit te bereiken, zoals objectdetectie, beeldclassificatie, tekst typen met spraak en vele andere niet-lineaire uitvoer, is nodig die wordt bereikt met behulp van de activeringsfunctie.
Hoe de activeringslaag wordt berekend in de woordinbedding (Word2vec)
Softmax Layer (genormaliseerde exponentiële functie) is de output layer-functie die elk knooppunt activeert of afvuurt. Een andere gebruikte benadering is Hierarchical softmax waarbij de complexiteit wordt berekend door O(log2V) waarbij de softmax O(V) is, waarbij V de omvang van de woordenschat is. Het verschil tussen deze twee is de vermindering van de complexiteit in de hiërarchische softmax-laag. Om de functionaliteit (hiërarchische softmax) te begrijpen, kijk dan naar het onderstaande Word-embeddingvoorbeeld:
Stel dat we de waarschijnlijkheid willen berekenen dat we het woord waarnemen liefde gegeven een bepaalde context. De stroom van de wortel naar het bladknooppunt zal de eerste beweging zijn naar knooppunt 2 en vervolgens naar knooppunt 5. Dus als we de woordenschatgrootte van 8 hebben gehad, zijn er slechts drie berekeningen nodig. Het maakt dus ontbinding mogelijk, berekening van de waarschijnlijkheid van één woord (liefde).
Welke andere opties zijn er naast Hiërarchische Softmax?
Als u in algemene zin spreekt, zijn de beschikbare opties voor het insluiten van woorden gedifferentieerde Softmax, CNN-Softmax, Importance Sampling, Adaptive Importance sampling, Noise Contrastive Estimations, Negative Sampling, Self-Normalization en infrequent Normalization.
Als we specifiek over Word2vec spreken, hebben we negatieve steekproeven beschikbaar.
Negatieve bemonstering is een manier om de trainingsgegevens te bemonsteren. Het lijkt een beetje op stochastische gradiëntafdaling, maar met enig verschil. Negatieve steekproeven kijken alleen naar negatieve trainingsvoorbeelden. Het is gebaseerd op een contrastieve schatting van ruis en bemonstert willekeurig woorden, niet in de context. Het is een snelle trainingsmethode en kiest de context willekeurig. Als het voorspelde woord in de willekeurig gekozen context verschijnt, liggen beide vectoren dicht bij elkaar.
Welke conclusie kan worden getrokken?
Activators vuren de neuronen af, net zoals onze neuronen worden afgevuurd met behulp van externe stimuli. Softmax-laag is een van de output-laagfuncties die de neuronen afvuurt in het geval van woord-embeddings. In Word2vec hebben we opties zoals hiërarchische softmax en negatieve bemonstering. Met behulp van activators kan men de lineaire functie omzetten in de niet-lineaire functie, en een complex machine learning-algoritme kan worden geïmplementeerd met behulp van dergelijke.
Wat is Gensim?
gensim is een open-source toolkit voor onderwerpmodellering en natuurlijke taalverwerking die is geïmplementeerd in Python en Cython. Met de Gensim-toolkit kunnen gebruikers Word2vec importeren voor onderwerpmodellering om verborgen structuur in de tekst te ontdekken. Gensim levert niet alleen een implementatie van Word2vec maar ook voor Doc2vec en FastText.
Deze tutorial gaat helemaal over Word2vec, dus we blijven bij het huidige onderwerp.
Hoe Word2vec te implementeren met Gensim
Tot nu toe hebben we besproken wat Word2vec is, de verschillende architecturen, waarom er een verschuiving plaatsvindt van een 'bag of words' naar Word2vec, de relatie tussen Word2vec en NLTK met live code en activeringsfuncties.
Hieronder vindt u de stapsgewijze methode om Word2vec te implementeren met Gensim:
Stap 1) Gegevensverzameling
De eerste stap bij het implementeren van een machine learning-model of het implementeren van natuurlijke taalverwerking is het verzamelen van gegevens
Bekijk de gegevens om een intelligente chatbot te bouwen, zoals weergegeven in het onderstaande Gensim Word2vec-voorbeeld.
[{"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"] } ]
Dit is wat we uit de gegevens begrijpen
- Deze gegevens bevatten drie dingen: tag, patroon en reacties. De tag is de bedoeling (wat is het onderwerp van discussie).
- De gegevens zijn in JSON-formaat.
- Een patroon is een vraag die gebruikers aan de bot zullen stellen
- Reacties zijn het antwoord dat de chatbot geeft op de bijbehorende vraag/het bijbehorende patroon.
Stap 2) Voorverwerking van gegevens
Het is van groot belang om de ruwe data te verwerken. Als opgeschoonde gegevens naar de machine worden gevoerd, reageert het model nauwkeuriger en leert het de gegevens efficiënter.
Deze stap omvat het verwijderen van stopwoorden, stammen, onnodige woorden, enz. Voordat u verder gaat, is het belangrijk om gegevens te laden en deze om te zetten in een dataframe. Zie de onderstaande code hiervoor
import json json_file =’intents.json' with open('intents.json','r') as f: data = json.load(f)
Verklaring van code:
- Omdat gegevens de vorm hebben van een json-indeling, wordt json geïmporteerd
- Het bestand wordt opgeslagen in de variabele
- Bestand is geopend en geladen in gegevensvariabele
Nu worden gegevens geïmporteerd en is het tijd om gegevens om te zetten in een dataframe. Zie de onderstaande code om de volgende stap te zien
import pandas as pd df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join)
Verklaring van code:
1. Gegevens worden omgezet in een gegevensframe met behulp van panda's die hierboven zijn geïmporteerd.
2. Het converteert de lijst in kolompatronen naar tekenreeksen.
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't']= 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 not x in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
Code Verklaring:
1. Engelse stopwoorden worden geïmporteerd met behulp van de stopwoordmodule uit de nltk-toolkit
2. Alle woorden van de tekst worden omgezet in kleine letters met behulp van de voorwaarde en de lambda-functie. Lambda-functie is een anonieme functie.
3. Alle tekstregels in het dataframe worden gecontroleerd op leestekens en deze worden gefilterd.
4. Tekens zoals cijfers of punten worden verwijderd met behulp van een reguliere expressie.
5. Digits worden uit de tekst verwijderd.
6. Stopwoorden worden in dit stadium verwijderd.
7. Woorden worden nu gefilterd en verschillende vormen van hetzelfde woord worden verwijderd met behulp van lemmatisering. Hiermee hebben we de voorbewerking van de gegevens afgerond.
Output:
, 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 don’t worry']",payments
Stap 3) Neuraal netwerk opbouwen met Word2vec
Nu is het tijd om een model te bouwen met behulp van de Gensim Word2vec-module. We moeten Word2vec importeren van Gensim. Laten we dit doen, en dan gaan we bouwen en in de laatste fase zullen we het model controleren op realtime gegevens.
from gensim.models import Word2Vec
In deze Gensim Word2vec-tutorial kunnen we het model met succes bouwen met Word2Vec. Raadpleeg de volgende coderegel om te leren hoe u het model kunt maken met Word2Vec. Tekst wordt aan het model geleverd in de vorm van een lijst, dus we zullen de tekst van dataframe naar lijst converteren met behulp van de onderstaande code
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)
Verklaring van code:
1. Maak de grotere_lijst waaraan de binnenste lijst is toegevoegd. Dit is het formaat dat wordt ingevoerd in het model Word2Vec.
2. De lus wordt geïmplementeerd en elke invoer van de patroonkolom van het dataframe wordt herhaald.
3. Elk element van de kolompatronen wordt gesplitst en opgeslagen in de binnenste lijst li
4. De binnenste lijst wordt toegevoegd aan de buitenste lijst.
5. Deze lijst wordt geleverd aan het Word2Vec-model. Laten we enkele van de hier verstrekte parameters begrijpen
Min_count: Het negeert alle woorden met een totale frequentie die lager is dan dit.
Afmetingen: Het vertelt de dimensionaliteit van de woordvectoren.
Werknemers: Dit zijn de draden om het model te trainen
Er zijn ook andere opties beschikbaar, en enkele belangrijke worden hieronder uitgelegd
venster: Maximale afstand tussen het huidige en voorspelde woord binnen een zin.
Sg: Het is een trainingsalgoritme en 1 voor skip-gram en 0 voor een continue zak met woorden. We hebben deze hierboven in detail besproken.
Hs: Als dit 1 is, gebruiken we hiërarchische softmax voor de training. Als dit 0 is, wordt negatieve bemonstering gebruikt.
Alpha: Initiële leersnelheid
Laten we de uiteindelijke code hieronder weergeven:
#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) # print(df['patterns']) #print(df['patterns']) #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 not x 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) #print(model)
Stap 4) Model opslaan
Model kan worden opgeslagen in de vorm van bak en modelformulier. Bin is het binaire formaat. Zie de onderstaande regels om het model op te slaan
model.save("word2vec.model") model.save("model.bin")
Uitleg van de bovenstaande code
1. Model wordt opgeslagen in de vorm van een .model-bestand.
2. model wordt opgeslagen in de vorm van een .bin-bestand
We zullen dit model gebruiken om realtime tests uit te voeren, zoals soortgelijke woorden, ongelijke woorden en meest voorkomende woorden.
Stap 5) Model laden en realtime testen uitvoeren
Model wordt geladen met behulp van onderstaande code:
model = Word2Vec.load('model.bin')
Als u de woordenschat ervan wilt afdrukken, gebruikt u het onderstaande commando:
vocab = list(model.wv.vocab)
Zie het resultaat:
['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']
Stap 6) Controle van de meeste vergelijkbare woorden
Laten we de dingen praktisch implementeren:
similar_words = model.most_similar('thanks') print(similar_words)
Zie het resultaat:
[('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)]
Stap 7) Komt niet overeen met het woord en de opgegeven woorden
dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split()) print(dissimlar_words)
Wij hebben de woorden geleverd 'Tot ziens, bedankt voor je bezoek'. Dit zal druk de meest ongelijke woorden uit deze woorden af. Laten we deze code uitvoeren en het resultaat vinden
Het resultaat na uitvoering van bovenstaande code:
Thanks
Stap 8) De gelijkenis tussen twee woorden vinden
Dit zal resulteren in de waarschijnlijkheid van gelijkenis tussen twee woorden. Zie de onderstaande code voor het uitvoeren van deze sectie.
similarity_two_words = model.similarity('please','see') print("Please provide the similarity between these two words:") print(similarity_two_words)
Het resultaat van de bovenstaande code is zoals hieronder
0.13706
U kunt soortgelijke woorden verder vinden door de onderstaande code uit te voeren
similar = model.similar_by_word('kind') print(similar)
Uitvoer van bovenstaande code:
[('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)]
Conclusie
- Word Embedding is een type woordrepresentatie waarmee woorden met een vergelijkbare betekenis door machine learning-algoritmen kunnen worden begrepen.
- Word Embedding wordt gebruikt om vergelijkbare woorden te berekenen, een groep verwante woorden te creëren, functie voor tekstclassificatie, documentclustering, natuurlijke taalverwerking
- Word2vec uitgelegd: Word2vec is een ondiep tweelaags neuraal netwerkmodel om woordinsluitingen te produceren voor een betere woordrepresentatie
- Word2vec vertegenwoordigt woorden in vectorruimterepresentatie. Woorden worden weergegeven in de vorm van vectoren en de plaatsing gebeurt op een zodanige manier dat woorden met dezelfde betekenis samen verschijnen en ongelijksoortige woorden ver weg liggen
- Het Word2vec-algoritme gebruikt 2 architecturen: Continuous Bag of Words (CBOW) en Skip Gram
- CBOW is meerdere malen sneller dan grammen overslaan en biedt een betere frequentie voor veel voorkomende woorden, terwijl grammen overslaan een kleine hoeveelheid trainingsgegevens nodig heeft en zelfs zeldzame woorden of zinnen vertegenwoordigt.
- NLTK en Word2vec kunnen samen worden gebruikt om krachtige applicaties te creëren
- De activeringsfunctie van het neuron definieert de output van dat neuron, gegeven een reeks inputs. In Word2vec. Softmax Layer (genormaliseerde exponentiële functie) is de uitvoerlaagfunctie die elk knooppunt activeert of vuurt. Word2vec heeft ook negatieve steekproeven beschikbaar
- Gensim is een toolkit voor onderwerpmodellering die is geïmplementeerd in Python