Word2Vec implementeren met Gensim Bibliotheek in Python

Inleiding

Mensen hebben een natuurlijk vermogen om te begrijpen wat andere mensen zeggen en wat ze als reactie daarop moeten zeggen. Dit vermogen wordt ontwikkeld door de consequente omgang met andere mensen en de samenleving gedurende vele jaren. De taal speelt een zeer belangrijke rol in de manier waarop mensen met elkaar omgaan. Talen die mensen gebruiken voor interactie worden natuurlijke talen genoemd.

De regels van verschillende natuurlijke talen zijn verschillend. Er is echter één ding dat natuurlijke talen gemeen hebben: flexibiliteit en evolutie.

Natuurlijke talen zijn zeer flexibel. Stel, je rijdt in een auto en je vriend zegt een van deze drie uitingen: “Aan de kant”, “Stop de auto”, “Halt”. Je begrijpt onmiddellijk dat hij je vraagt om de auto te stoppen. Dit komt omdat natuurlijke talen uiterst flexibel zijn. Er zijn meerdere manieren om één ding te zeggen.

Een ander belangrijk aspect van natuurlijke talen is het feit dat ze voortdurend evolueren. Een paar jaar geleden bestond er bijvoorbeeld nog geen term als “Google it”, waarmee het zoeken naar iets op de Google-zoekmachine wordt bedoeld. Natuurlijke talen evolueren voortdurend.

In computertalen daarentegen volgt men een strikte syntaxis. Als je een computer wilt vertellen iets op het scherm af te drukken, is daar een speciaal commando voor. De taak van Natural Language Processing is om computers menselijke taal te laten begrijpen en genereren op een manier die vergelijkbaar is met de mens.

Dit is een enorme taak en er zitten veel haken en ogen aan. Deze video lezing van de Universiteit van Michigan bevat een zeer goede uitleg waarom NLP zo moeilijk is.

In dit artikel zullen we de Word2Vec woord inbedding techniek implementeren die wordt gebruikt voor het creëren van woordvectoren met Python’s Gensim bibliotheek. Maar voordat we direct naar het coderingsgedeelte springen, zullen we eerst kort enkele van de meest gebruikte woordinbeddingstechnieken bespreken, samen met hun voor- en nadelen.

Word Embedding Approaches

Eén van de redenen dat Natural Language Processing een moeilijk probleem is om op te lossen, is het feit dat computers, in tegenstelling tot mensen, alleen getallen kunnen begrijpen. We moeten woorden weergeven in een numeriek formaat dat begrijpelijk is voor de computers. Woord inbedding verwijst naar de numerieke representaties van woorden.

Er bestaan momenteel verschillende benaderingen van woord inbedding en ze hebben allemaal hun voors en tegens. We zullen er hier drie bespreken:

  1. Bag of Words
  2. TF-IDF Scheme
  3. Word2Vec

Bag of Words

De bag of words-benadering is een van de eenvoudigste benaderingen van woordinbedding. Hieronder volgen de stappen voor het genereren van woordindelingen met behulp van de bag of words-benadering.

We zullen de woordindelingen die met de bag of words-benadering worden gegenereerd aan de hand van een voorbeeld bekijken. Stel je hebt een corpus met drie zinnen.

  • S1 = Ik hou van regen
  • S2 = regen regen ga weg
  • S3 = Ik ben weg

Om bovenstaande zinnen om te zetten in hun overeenkomstige woord inbedding representaties met behulp van de zak van woorden aanpak, moeten we de volgende stappen uit te voeren:

Merk op dat we voor S2 2 hebben toegevoegd in de plaats van “rain” in het woordenboek; dit komt omdat S2 tweemaal “rain” bevat.

Voor- en nadelen van Bag of Words

De Bag of Words aanpak heeft zowel voor- als nadelen. Het belangrijkste voordeel van de bag of words-benadering is dat je geen enorm corpus van woorden nodig hebt om goede resultaten te krijgen. U ziet dat we een heel basaal bag of words model bouwen met drie zinnen. Een bag of words model is rekenkundig niet erg complex.

Een groot nadeel van de bag of words benadering is het feit dat we enorme vectoren met lege ruimtes moeten maken om een getal weer te geven (sparse matrix), wat geheugen en ruimte kost. In het vorige voorbeeld hadden we slechts 3 zinnen. Toch zie je drie nullen in elke vector.

Stel je een corpus voor met duizenden artikelen. In zo’n geval kan het aantal unieke woorden in een woordenboek duizenden bedragen. Als één document 10% van de unieke woorden bevat, zal de overeenkomstige inbeddingsvector nog 90% nullen bevatten.

Een ander groot probleem met de “bag of words”-benadering is het feit dat deze geen contextinformatie bijhoudt. Het geeft niet om de volgorde waarin de woorden in een zin voorkomen. Bijvoorbeeld, het behandelt de zinnen “Fles is in de auto” en “Auto is in de fles” gelijk, die totaal verschillende zinnen zijn.

Een type zak van woorden benadering, bekend als n-grammen, kan helpen om de relatie tussen woorden te handhaven. N-gram verwijst naar een aaneengesloten opeenvolging van n woorden. Bijvoorbeeld, 2-grammen voor de zin “Je bent niet gelukkig”, zijn “Je bent”, “bent niet” en “niet gelukkig”. Hoewel de n-grammen aanpak in staat is om relaties tussen woorden vast te leggen, groeit de grootte van de feature set exponentieel met te veel n-grammen.

TF-IDF Scheme

Het TF-IDF schema is een soort bag words aanpak waarbij in plaats van nullen en enen in de inbeddingsvector toe te voegen, u drijvende getallen toevoegt die meer nuttige informatie bevatten in vergelijking met nullen en enen. Het idee achter TF-IDF schema is het feit dat woorden met een hoge frequentie van voorkomen in één document, en een lagere frequentie van voorkomen in alle andere documenten, meer cruciaal zijn voor classificatie.

TF-IDF is een product van twee waarden: Term Frequency (TF) en Inverse Document Frequency (IDF).

Term frequency verwijst naar het aantal keren dat een woord in het document voorkomt en kan worden berekend als:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

Als we bijvoorbeeld kijken naar zin S1 uit de vorige paragraaf, d.w.z. “I love rain”, komt elk woord in de zin één keer voor en heeft daarom een frequentie van 1. Daarentegen, voor S2 d.w.z. “rain rain go away”, is de frequentie van “rain” twee, terwijl die voor de rest van de woorden 1 is.

IDF verwijst naar de log van het totale aantal documenten gedeeld door het aantal documenten waarin het woord voorkomt, en kan worden berekend als:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

Bij voorbeeld, de IDF-waarde voor het woord “rain” is 0,1760, aangezien het totale aantal documenten 3 is en regen in 2 daarvan voorkomt, dus log(3/2) is 0,1760. Aan de andere kant, als je kijkt naar het woord “liefde” in de eerste zin, het verschijnt in een van de drie documenten en dus de IDF waarde is log(3), dat is 0.4771.

Voors en tegens van TF-IDF

Hoewel TF-IDF is een verbetering ten opzichte van de eenvoudige zak van woorden aanpak en levert betere resultaten voor gemeenschappelijke NLP taken, de algemene voors en tegens blijven hetzelfde. We moeten nog steeds een enorme sparse matrix maken, wat ook veel meer rekenwerk kost dan de eenvoudige bag of words-benadering.

Word2Vec

De <a target=”_blank rel=”nofollow”” href=”https://en.wikipedia.org/wiki/Word2vec”>Word2Vec inbeddingsbenadering, ontwikkeld door Tomas Mikolov, wordt beschouwd als de state of the art. Word2Vec aanpak maakt gebruik van deep learning en neurale netwerken gebaseerde technieken om woorden om te zetten in overeenkomstige vectoren op een zodanige wijze dat de semantisch vergelijkbare vectoren dicht bij elkaar liggen in N-dimensionale ruimte, waarbij N verwijst naar de dimensies van de vector.

Word2Vec geeft een aantal verbazingwekkende resultaten. Het vermogen van Word2Vec om semantische relaties te onderhouden blijkt uit een klassiek voorbeeld: als je een vector hebt voor het woord “Koning” en je verwijdert de vector die wordt vertegenwoordigd door het woord “Man” uit de “Koning” en voegt er “Vrouwen” aan toe, dan krijg je een vector die dicht bij de vector “Koningin” ligt. Deze relatie wordt gewoonlijk voorgesteld als:

King - Man + Women = Queen

Word2Vec model komt in twee smaken: Skip Gram Model en Continuous Bag of Words Model (CBOW).

In het Skip Gram model, worden de context woorden voorspeld met behulp van het basiswoord. Bijvoorbeeld, gegeven een zin “Ik hou van dansen in de regen”, zal het Skip Gram-model “liefde” en “dans” voorspellen, gegeven het woord “to” als input.

Integendeel, het CBOW-model zal “to” voorspellen, als de contextwoorden “love” en “dance” worden toegevoerd als input aan het model. Het model leert deze relaties met behulp van diepe neurale netwerken.

Voordelen en nadelen van Word2Vec

Word2Vec heeft verschillende voordelen ten opzichte van bag of words en IF-IDF schema. Word2Vec behoudt de semantische betekenis van verschillende woorden in een document. De contextinformatie gaat niet verloren. Een ander groot voordeel van Word2Vec is dat de grootte van de inbeddingsvector zeer klein is. Elke dimensie in de inbeddingsvector bevat informatie over één aspect van het woord. We hebben geen enorme sparse vectoren nodig, in tegenstelling tot de bag of words en TF-IDF benaderingen.

Note: De wiskundige details van hoe Word2Vec werkt impliceren een uitleg van neurale netwerken en softmax waarschijnlijkheid, die buiten het bestek van dit artikel valt. Als u de wiskundige grondslagen van Word2Vec wilt begrijpen, lees dan dit artikel: https://arxiv.org/abs/1301.3781

Word2Vec in Python met Gensim-bibliotheek

In dit gedeelte zullen we het Word2Vec-model implementeren met behulp van de Gensim-bibliotheek van Python. Volg deze stappen:

Creëren van Corpus

We hebben eerder besproken dat om een Word2Vec model te maken, we een corpus nodig hebben. In real-life toepassingen, Word2Vec modellen worden gemaakt met behulp van miljarden documenten. Bijvoorbeeld Google’s Word2Vec model is getraind met behulp van 3 miljoen woorden en zinnen. Echter, om het eenvoudig te houden, zullen we een Word2Vec model maken met behulp van een enkel Wikipedia artikel. Ons model zal niet zo goed zijn als dat van Google. Hoewel, het is goed genoeg om uit te leggen hoe Word2Vec model kan worden uitgevoerd met behulp van de Gensim library.

Voordat we Wikipedia artikelen kunnen samenvatten, moeten we ze ophalen. Om dit te doen zullen we gebruik maken van een aantal bibliotheken. De eerste bibliotheek die we moeten downloaden is de Beautiful Soup bibliotheek, dat is een zeer nuttig Python hulpprogramma voor web scraping. Voer het volgende commando uit op de opdrachtprompt om het hulpprogramma Beautiful Soup te downloaden.

$ pip install beautifulsoup4

Een andere belangrijke bibliotheek die we nodig hebben om XML en HTML te parsen is de lxml-bibliotheek. Voer het volgende commando uit op de opdrachtprompt om lxml te downloaden:

$ pip install lxml

Het artikel dat we gaan schrapen is het Wikipedia-artikel over Kunstmatige Intelligentie. Laten we een Python Script schrijven om het artikel van Wikipedia te schrapen:

In het bovenstaande script downloaden we eerst het Wikipedia artikel met behulp van de urlopen methode van de request klasse van de urllib bibliotheek. Vervolgens lezen we de inhoud van het artikel en parsen het met behulp van een object van de BeautifulSoup klasse. Wikipedia slaat de tekst inhoud van het artikel op in p tags. We gebruiken de find_all functie van het BeautifulSoup object om alle inhoud van de paragraaf tags van het artikel op te halen.

Ten slotte voegen we alle paragrafen samen en slaan het geschraapte artikel op in article_text variabele voor later gebruik.

Voorbewerking

Op dit punt hebben we nu het artikel geïmporteerd. De volgende stap is het voorbewerken van de inhoud voor het Word2Vec model. Het volgende script bewerkt de tekst voor:

In het bovenstaande script zetten we alle tekst om in kleine letters en verwijderen we vervolgens alle cijfers, speciale tekens en extra spaties uit de tekst. Na het voorbewerken houden we alleen de woorden over.

Het Word2Vec-model wordt getraind op een verzameling woorden. Eerst moeten we ons artikel omzetten in zinnen. We gebruiken nltk.sent_tokenize om ons artikel om te zetten in zinnen. Om zinnen om te zetten in woorden, gebruiken we nltk.word_tokenize. Als laatste voorbewerkingsstap verwijderen we alle stopwoorden uit de tekst.

Nadat het script is uitgevoerd, bevat het all_words object de lijst van alle woorden in het artikel. We zullen deze lijst gebruiken om ons Word2Vec model te maken met de Gensim bibliotheek.

Maken van Word2Vec Model

Met Gensim, is het uiterst eenvoudig om Word2Vec model te maken. De woordenlijst wordt doorgegeven aan de Word2Vec klasse van het gensim.models pakket. We moeten de waarde voor de parameter min_count opgeven. Een waarde van 2 voor min_count specificeert om alleen die woorden in het Word2Vec-model op te nemen die ten minste twee keer voorkomen in het corpus. Het volgende script maakt Word2Vec model met behulp van het Wikipedia-artikel dat we geschraapt.

from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)

Om het woordenboek van unieke woorden die ten minste twee keer voorkomen in het corpus te zien, voert u het volgende script uit:

vocabulary = word2vec.wv.vocabprint(vocabulary)

Wanneer het bovenstaande script wordt uitgevoerd, ziet u een lijst van alle unieke woorden die ten minste twee keer voorkomen.

Model Analyse

We hebben met succes ons Word2Vec model gemaakt in de laatste sectie. Nu is het tijd om te onderzoeken wat we hebben gemaakt.

Vectoren vinden voor een woord

We weten dat het Word2Vec model woorden omzet in hun overeenkomstige vectoren. Laten we eens kijken hoe we de vectorrepresentatie van een bepaald woord kunnen bekijken.

v1 = word2vec.wv

De vector v1 bevat de vectorrepresentatie voor het woord “artificial”. Standaard wordt een vector van honderd dimensies gemaakt door Gensim Word2Vec. Dit is een veel, veel kleinere vector in vergelijking met wat zou zijn geproduceerd door bag of words. Als we de bag of words aanpak gebruiken voor het inbedden van het artikel, zal de lengte van de vector voor elk 1206 zijn omdat er 1206 unieke woorden zijn met een minimum frequentie van 2. Als de minimum frequentie van voorkomen op 1 wordt gezet, zal de grootte van de bag of words vector verder toenemen. Aan de andere kant worden vectoren die met Word2Vec worden gegenereerd niet beïnvloed door de grootte van de woordenschat.

Gelijkende woorden vinden

Eerder hebben we gezegd dat de contextuele informatie van de woorden niet verloren gaat met de Word2Vec aanpak. We kunnen dit verifiëren door alle woorden te vinden die lijken op het woord “intelligentie”.

Kijk eens naar het volgende script:

sim_words = word2vec.wv.most_similar('intelligence')

Als u de variabele sim_words naar de console afdrukt, ziet u de woorden die het meest lijken op “intelligentie”, zoals hieronder getoond:

Van de uitvoer kunt u de woorden zien die lijken op “intelligentie”, samen met hun gelijksoortigheidsindex. Het woord “ai” is het meest gelijkende woord op “intelligence” volgens het model, wat eigenlijk wel logisch is. Ook woorden als “menselijk” en “kunstmatig” komen vaak samen voor met het woord “intelligentie”. Ons model heeft met succes deze relaties vastgelegd met behulp van slechts een enkel Wikipedia-artikel.

Conclusie

In dit artikel hebben we een Word2Vec woord inbeddingsmodel geïmplementeerd met Python’s Gensim Bibliotheek. We hebben dit gedaan door een Wikipedia-artikel te schrapen en ons Word2Vec-model te bouwen met het artikel als corpus. We hebben ook kort de meest gebruikte woord inbedding benaderingen besproken, samen met hun voor-en nadelen als een vergelijking met Word2Vec.

Ik zou u aanraden om een Word2Vec model van uw eigen te maken met de hulp van een tekst corpus en zien of je betere resultaten kunt krijgen in vergelijking met de zak van woorden aanpak.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.