donderdag 10 december 2020

NLP nieuwe experimenten 01

Het is alweer even geleden dat ik met nlp heb geexperimenteerd. Nog wel wat zaken voor incident classificatie gedaan op basis van Bert maar eigen testjes hebben even stil gelegen. Toch borrelen er af en toe wat gedachten op die dan ook soms tot nieuwe programmeer experimentjes leiden. 


Een van die gedachten / overwegingen is de keuze bij Bert om woorden op te splitsen in woorddelen. In het char2word2vev verhaal ben ik ervan uitgegaan dat je , door van de karakters uit te gaan, in elk geval geen informatie verloren laat gaan van gelijkvormige woorden zoals 'school' en 'schoollokaal', 'schoolbank' etc . Uit deze woorden kan je afleiden, zelfs als je niet zou kunnen leen, dat er veel meer overeenkomst is tussen de woorden dan bijvoorbeeld 3 willekeurige andere. Zoals aangegeven hoopte ik deze betekenis te kunnen vasthouden tijdens de omzetting naar getallen (creatie van een vocabulary met indices). Dit leidt in pincipe tot een zeer beperkte / kleine 'vocab' van, zeg maar, 28 letters (eventueel het dubbele bij hoofdletters) , 10 cijfers en een setje symbolen. 

Dit kleine setje zou het gevoelsmatig makkelijker moeten maken om uit een reeks informatie te extraheren.  


Bij Bert is de vocab echter zo'n 30K groot en blijkbaar geeft dat heel goede resultaten. Neurale netwerken hebben dus niet heel veel moeite om met dergelijke grotere vocabulares om te gaan. De opdeling van woorden in woorddelen lijkt bij Bert echter wat willekeurig. Een goede tussen mogelijkheid is wellicht om woorden op te splitsen in lettergrepen. Daarbij blijft veel 'woordinformatie' behouden. Bijvoorbeeld 'school' uit bovenstaand voorbeeld wordt in alle drie de gevallen op dezelfde wijze gecodeerd. 

Ik vind al snel een aardige python lettergreep omzetter:

from hyphenate import hyphenate_word

Ik pak weer het 'movie sentiment bestand' en doe wat testen. Dit bestand bevat 100.000 reviews. Ik kijk hoe lang (aantal karakters) de reviews gemiddeld zijn (voor de aardigheid opgesplitst naar sentiment):

sentiment

negative    1294.0

neutral     1329.9

positive    1324.8

Het omzetten naar lettergrepen gaat niet allemaal zoals ik zou verwachten maar we komen een heel eind. Ik krijg 65.626 verschillende 'lettergrepen'. Hier een voorbeeld van de 10 meest voorkomende lettergrepen en de frequentie:

[('ing', 5072), ('i', 3462), ('ly', 3082), ('er', 2944), ('in', 2266), ('re', 1914), ('ed', 1766), ('tion', 1753), ('un', 1693), ('ter', 1495)]

Maar als ik de lettergrepen verwijder die maar 1x voorkomen hou ik er maar 14.543 over. De overige 'lettergrepen' moeten maar, net als bij Bert, met de letters zelf worden gecodeerd. Die moet ik dan, denk ik, nog wel toevoegen, voor zover ze nog niet in de huidige vocabulary beschikbaar zijn.  

Nu maar eens even een lettergreep codeer functie schrijven die woorden omzet in arrays met de indexen uit deze volledige vocabulary.

   

     

Geen opmerkingen:

Een reactie posten