1. Programmering Big Data Data Science Gebruik AI voor sentimentanalyse

Door John Paul Mueller, Luca Mueller

Sentimentanalyse is computationeel afgeleid van een geschreven tekst met behulp van de houding van de schrijver (positief, negatief of neutraal) ten opzichte van het tekstonderwerp. Dit soort analyses blijkt nuttig voor mensen die in marketing en communicatie werken, omdat het hen helpt te begrijpen wat klanten en consumenten van een product of dienst vinden en dus op de juiste manier handelen (bijvoorbeeld proberen ontevreden klanten te vinden of een andere verkoopstrategie te gebruiken) ). Iedereen voert sentimentanalyse uit. Bij het lezen van tekst proberen mensen bijvoorbeeld natuurlijk het sentiment te bepalen dat de persoon die het heeft geschreven heeft bewogen. Wanneer het aantal te lezen en te begrijpen teksten echter te groot is en de tekst zich voortdurend ophoopt, zoals in sociale media en e-mails van klanten, is het automatiseren van sentimentanalyse belangrijk.

AI sentiment analyse

Het komende voorbeeld is een testrun van RNN's met Keras en TensorFlow waarmee een sentimentanalyse-algoritme wordt gebouwd dat in staat is de attitudes te classificeren die in een filmrecensie worden uitgedrukt. De gegevens zijn een voorbeeld van de IMDb-gegevensset met 50.000 beoordelingen (in tweeën gedeeld tussen trein en testsets) van films vergezeld van een label dat het sentiment van de beoordeling uitdrukt (0 = negatief, 1 = positief). IMDb is een grote online database met informatie over films, tv-series en videogames. Oorspronkelijk beheerd door een fanbase, wordt het nu gerund door een dochteronderneming van Amazon. Op IMDb vinden mensen de informatie die ze nodig hebben over hun favoriete programma, plaatsen hun opmerkingen of schrijven een recensie voor andere bezoekers om te lezen.

Keras biedt een downloadbare wrapper voor IMDb-gegevens. Je bereidt, shuffle en rangschikt deze gegevens in een trein en een testset. In het bijzonder worden de IMDb-tekstgegevens die door Keras worden aangeboden gereinigd van interpunctie, genormaliseerd in kleine letters en omgezet in numerieke waarden. Elk woord is gecodeerd in een nummer dat zijn rangorde in frequentie vertegenwoordigt. De meest voorkomende woorden hebben een laag aantal; minder frequente woorden hebben hogere getallen.

Als startpunt importeert de code de imdb-functie uit Keras en gebruikt deze om de gegevens van internet op te halen (ongeveer een download van 17,5 MB). De parameters die in het voorbeeld worden gebruikt, omvatten alleen de top 10.000 woorden en Keras moet de gegevens in willekeurige volgorde plaatsen. (Als je de seed kent, kun je de shuffle zo nodig reproduceren.) De functie retourneert twee trein- en testsets, beide gemaakt van tekstreeksen en de uitkomst van het sentiment.

van keras.datasets import imdb
top_words = 10000
((x_train, y_train),
(x_test, y_test)) = imdb.load_data (num_words = top_words,
zaad = 21)

Nadat de vorige code is voltooid, kunt u het aantal voorbeelden controleren met behulp van de volgende code:

print ("Trainingsvoorbeelden:% i"% len (x_train))
print ("Testvoorbeelden:% i"% len (x_test))

Na navraag naar het aantal beschikbare gevallen voor gebruik in de training- en testfase van het neurale netwerk, geeft de code een antwoord van 25.000 voorbeelden voor elke fase. (Deze dataset is relatief klein voor een taalprobleem; het is duidelijk dat de dataset voornamelijk voor demonstratiedoeleinden is.) Bovendien bepaalt de code of de dataset evenwichtig is, wat betekent dat het een vrijwel gelijk aantal positieve en negatieve sentimentvoorbeelden heeft.

import numpy als np
print (np.unique (y_train, return_counts = True))

Het resultaat, array ([12500, 12500]), bevestigt dat de dataset gelijkmatig is verdeeld tussen positieve en negatieve resultaten. Een dergelijk evenwicht tussen de antwoordklassen is uitsluitend vanwege het demonstratieve karakter van de gegevensset. In de echte wereld vindt u zelden uitgebalanceerde gegevenssets. De volgende stap maakt enkele Python-woordenboeken die kunnen converteren tussen de code die in de gegevensset wordt gebruikt en de echte woorden. De gegevensset die in dit voorbeeld wordt gebruikt, is in feite voorverwerkt en biedt reeksen getallen die de woorden vertegenwoordigen, niet de woorden zelf. (LSTM- en GRU-algoritmen die u in Keras vindt, verwachten reeksen getallen als getallen.)

word_to_id = {w: i ​​+ 3 voor w, i in imdb.get_word_index (). items ()}
id_to_word = {0 '', 1 '', 2 ''}
id_to_word.update ({i + 3: w voor w, i in imdb.get_word_index (). items ()})
def convert_to_text (sequence):
return '' .join ([id_to_word [s] voor s na elkaar als s> = 3])
afdrukken (convert_to_text (x_train [8]))

Het vorige codefragment definieert twee conversiewoordenboeken (van woorden naar numerieke codes en vice versa) en een functie die de gegevenssetvoorbeelden vertaalt naar leesbare tekst. Als voorbeeld drukt de code het negende voorbeeld af: "deze film was als een slecht treinwrak, zo verschrikkelijk als het was ...". Uit dit fragment kunt u gemakkelijk verwachten dat het sentiment voor deze film niet positief is. Woorden als slecht, wrak en vreselijk brengen een sterk negatief gevoel over, en dat maakt het raden van het juiste gevoel gemakkelijk.

In dit voorbeeld ontvangt u de numerieke reeksen en zet u deze terug in woorden, maar het tegenovergestelde is gebruikelijk. Meestal krijg je zinnen die uit woorden bestaan ​​en verander je ze in reeksen gehele getallen om naar een laag RNN's te voeren. Keras biedt een gespecialiseerde functie, Tokenizer, die dat voor u kan doen. Het maakt gebruik van de methoden fit_on_text, om te leren hoe woorden te koppelen aan gehele getallen uit trainingsgegevens, en teksten_ naar_matrix, om tekst in een reeks te transformeren.

In andere zinnen vindt u dergelijke onthullende woorden echter mogelijk niet voor de sentimentanalyse. Het gevoel wordt op een subtielere of indirectere manier uitgedrukt, en het begrijpen van het gevoel vroeg in de tekst is misschien niet mogelijk omdat onthullende zinnen en woorden veel later in het discours kunnen verschijnen. Om deze reden moet u ook beslissen hoeveel van de zin u wilt analyseren.

Gewoonlijk neemt u een eerste deel van de tekst en gebruikt u deze als representatief voor de hele recensie. Soms heb je gewoon een paar beginwoorden nodig - bijvoorbeeld de eerste 50 woorden - om de zin te begrijpen; soms heb je meer nodig. Vooral lange teksten onthullen hun oriëntatie niet vroeg. Het is daarom aan u om het type tekst te begrijpen waarmee u werkt en te beslissen hoeveel woorden u wilt analyseren met behulp van diep leren. Dit voorbeeld beschouwt alleen de eerste 200 woorden, wat voldoende zou moeten zijn.

Je hebt gemerkt dat de code code begint te geven aan woorden die beginnen met nummer 3, waardoor codes van 0 tot 2 achterblijven. Lagere nummers worden gebruikt voor speciale tags, zoals het begin van de zin signaleren, lege spaties vullen om de reeks te laten vastleggen op een bepaalde lengte en markeert de woorden die zijn uitgesloten omdat ze niet frequent genoeg zijn. In dit voorbeeld worden alleen de meest voorkomende 10.000 woorden weergegeven. Het gebruik van tags om begin-, eind- en opvallende situaties aan te duiden is een truc die werkt met RNN's, vooral voor machinevertaling.

van keras.preprocessing.sequence import pad_sequences
max_pad = 200
x_train = pad_sequences (x_train,
maxlen = max_pad)
x_test = pad_sequences (x_test,
maxlen = max_pad)
afdruk (x_train [0])

Door de pad_sequences-functie van Keras te gebruiken met max_pad ingesteld op 200, neemt de code de eerste tweehonderd woorden van elke beoordeling. In het geval dat de beoordeling minder dan tweehonderd woorden bevat, gaan zoveel nulwaarden als nodig vooraf aan de reeks om het vereiste aantal reekselementen te bereiken. Het inkorten van de reeksen tot een bepaalde lengte en het vullen van de holtes met nulwaarden wordt invoeropvulling genoemd, een belangrijke verwerkingsactiviteit bij het gebruik van RNN's zoals diepe leeralgoritmen. Nu ontwerpt de code de architectuur:

van keras.models import Sequential
van keras.layers importeren bidirectioneel, dicht, dropout
van keras.layers importeren GlobalMaxPool1D, LSTM
van keras.layers.embeddings import Inbedden
embedding_vector_length = 32
model = Sequentieel ()
model.add (Embedding (top_words,
embedding_vector_length,
input_length = max_pad))
model.add (Bidirectioneel (LSTM (64, return_sequences = True)))
model.add (GlobalMaxPool1D ())
model.add (Dense (16, activering = "relu"))
model.add (Dense (1, activering = "sigmoïde"))
model.compile (verlies = 'binary_crossentropy,
optimizer = adam,
metrics = [ 'nauwkeurigheid'])
afdrukken (model.summary ())

Het vorige codefragment definieert de vorm van het deep learning-model, waar het een paar gespecialiseerde lagen gebruikt voor natuurlijke taalverwerking vanuit Keras. Het voorbeeld vereiste ook een samenvatting van het model (opdracht model.summary ()) om te bepalen wat er gebeurt met architectuur door verschillende neurale lagen te gebruiken.

U hebt de insluitingslaag, die de numerieke reeksen omzet in een insluiting van dichte woorden. Dat type woordinsluiting is geschikter om te worden geleerd door een laag RNN's. Keras biedt een insluitingslaag, die, behalve dat dit de eerste laag van het netwerk moet zijn, twee taken kan uitvoeren:

  • Vooraf ingesloten woordinsluitingen (zoals Word2vec of GloVe) toepassen op de reeksingang. U hoeft alleen de matrix met de inbedding door te geven aan de parametergewichten. Opnieuw een woord insluiten, gebaseerd op de ingevoerde gegevens.

In dit tweede geval moet Embedding alleen weten:

  • input_dim: de grootte van de vocabulaire die van gegevens wordt verwacht output_dim: de grootte van de inbeddende ruimte die zal worden geproduceerd (de zogenaamde dimensies) input_length: de te verwachten reeksgrootte

Nadat u de parameters hebt bepaald, vindt Inbedden de betere gewichten om de reeksen tijdens de training om te zetten in een dichte matrix. De dichte matrixgrootte wordt gegeven door de lengte van sequenties en de dimensionaliteit van de inbedding.

Als u de inbeddinglaag van Keras gebruikt, moet u onthouden dat de functie alleen een gewichtsmatrix biedt met de grootte van de woordenschat volgens de dimensie van de gewenste inbedding. Het wijst de woorden toe aan de kolommen van de matrix en stemt vervolgens de matrixgewichten af ​​op de gegeven voorbeelden. Deze oplossing, hoewel praktisch voor niet-standaard taalproblemen, is niet analoog aan de eerder besproken woordbeddingen, die op een andere manier en op miljoenen voorbeelden zijn getraind.

Het voorbeeld maakt gebruik van bidirectionele verpakking - een LSTM-laag van 64 cellen. Bidirectioneel transformeert een normale LSTM-laag door deze te verdubbelen: Aan de eerste kant past het de normale reeks ingangen toe die u verstrekt; op het tweede passeert het het omgekeerde van de reeks. U gebruikt deze benadering omdat u soms woorden in een andere volgorde gebruikt en het bouwen van een bidirectionele laag elk woordpatroon opvangt, ongeacht de volgorde. De Keras-implementatie is inderdaad eenvoudig: u past het gewoon toe als een functie op de laag die u bidirectioneel wilt weergeven.

De bidirectionele LSTM is ingesteld om reeksen te retourneren (return_sequences = True); dat wil zeggen dat het voor elke cel het geleverde resultaat retourneert nadat elk element van de reeks is bekeken. Het resultaat voor elke reeks is een uitvoermatrix van 200 x 128, waarbij 200 het aantal reekselementen is en 128 het aantal LSTM-cellen is dat in de laag wordt gebruikt. Deze techniek voorkomt dat de RNN het laatste resultaat van elke LSTM-cel neemt. Tips over het sentiment van de tekst kunnen eigenlijk overal in de ingesloten woordenreeks verschijnen.

Kortom, het is belangrijk om niet het laatste resultaat van elke cel te nemen, maar eerder het beste resultaat ervan. De code vertrouwt daarom op de volgende laag, GlobalMaxPool1D, om elke reeks resultaten van elke LSTM-cel te controleren en alleen het maximale resultaat te behouden. Dat zou ervoor moeten zorgen dat het voorbeeld het sterkste signaal uit elke LSTM-cel kiest, die hopelijk door zijn training is gespecialiseerd in het kiezen van enkele betekenisvolle signalen.

Nadat de neurale signalen zijn gefilterd, heeft het voorbeeld een laag van 128 uitgangen, één voor elke LSTM-cel. De code vermindert en mengt de signalen met behulp van een opeenvolgende dichte laag van 16 neuronen met ReLU-activering (waardoor alleen positieve signalen passeren). De architectuur eindigt met een laatste knooppunt met behulp van sigmoïde activering, die de resultaten in het bereik van 0-1 zal drukken en ze eruit laten zien als kansen.

Nadat u de architectuur hebt gedefinieerd, kunt u nu het netwerk trainen om sentimentanalyse uit te voeren. Drie tijdvakken (de gegevens driemaal door het netwerk laten gaan om de patronen te leren kennen) volstaan. De code gebruikt batches van 256 beoordelingen elke keer, waardoor het netwerk elke keer voldoende variëteit aan woorden en sentimenten kan zien voordat het zijn gewichten met behulp van backpropagation bijwerkt. Ten slotte richt de code zich op de resultaten van de validatiegegevens (die geen deel uitmaken van de trainingsgegevens). Het verkrijgen van een goed resultaat van de validatiegegevens betekent dat het neurale net de invoer correct verwerkt. De code rapporteert over validatiegegevens net nadat elk tijdperk is voltooid.

history = model.fit (x_train, y_train,
validation_data = (x_test, y_test),
epochs = 3, batch_size = 256)

Het verkrijgen van de resultaten duurt een tijdje, maar als je een GPU gebruikt, is het voltooid in de tijd die je nodig hebt om een ​​kopje koffie te drinken. Op dit punt kunt u de resultaten evalueren, opnieuw met behulp van de validatiegegevens. (De resultaten mogen geen verrassingen of verschillen hebben met wat de code tijdens de training meldde.)

loss, metric = model.evaluate (x_test, y_test, verbose = 0)
print ("Testnauwkeurigheid:% 0.3f"% metrisch)

De uiteindelijke nauwkeurigheid, het percentage juiste antwoorden van het diepe neurale netwerk, zal een waarde hebben van ongeveer 85-86 procent. Het resultaat zal elke keer dat u het experiment uitvoert, enigszins veranderen vanwege randomisatie bij het opbouwen van uw neurale netwerk. Dat is volkomen normaal gezien de kleine omvang van de gegevens waarmee u werkt. Als je met de juiste geluksgewichten begint, wordt het leren gemakkelijker in zo'n korte trainingssessie.

Uiteindelijk is uw netwerk een sentimentanalysator die het sentiment in een filmrecensie ongeveer 85 procent van de tijd correct kan raden. Met nog meer trainingsgegevens en meer geavanceerde neurale architecturen kunt u nog indrukwekkender resultaten behalen. In marketing wordt een soortgelijk hulpmiddel gebruikt om veel processen te automatiseren waarvoor tekst moet worden gelezen en actie moet worden ondernomen. Nogmaals, je zou een netwerk als dit kunnen koppelen aan een neuraal netwerk dat naar een stem luistert en deze in tekst omzet. (Dit is een andere toepassing van RNN's, die nu Alexa, Siri, Google Voice en vele andere persoonlijke assistenten aanstuurt.) De overgang stelt de toepassing in staat om het gevoel te begrijpen, zelfs in vocale uitdrukkingen, zoals een telefoontje van een klant.

Zie ook

Hoe vul je je Fantasy Football-rooster inSymptomen en remedies voor Keto FluKeto Dessert Recept: Romig Koekjesdeeg MousseKeto Ontbijt Recept: Avocado Cloud ToastKeto One-Pot Maaltijd Recept: Biefstuk Ossenhaas met Krokante Boerenkool Recept: Krokant Gebakken Uienringen Keto Recept: Bloemkool Mash en Browned ButterIntermittent Vasten en de KetoCryptocurrency-mijnbouw en Proof of Stake-algoritmenHoe beschermt u de privacy van uw MacBook Ontmoet de vervanging voor iTunes: de nieuwe muziek- en tv-apps in macOS CatalinaWat is er nieuw bij macOS Catalina? Snelle tips voor het instellen van macOS Catalina en het registreren van uw MacBookMacBook voor spiekbriefjes verschillen tussen de MacBook Air en MacBook Pro Accounts op uw Mac Test de microfoon op uw Windows-pcH Bestanden herstellen vanuit Bestandsgeschiedenis in Windows 10 Een netwerkstation op uw Windows 10-pc toewijzenHoe uw remleidingen te controleren Hoe te springen Start een auto Hoe weet u of uw voertuig moet worden afgesteldHoe problemen met katalytische converters oplossenHoe vaak moet u uw olie vervangen? Hoe moet u het oliepeil van uw voertuig controleren? Hoe kunt u het koelsysteem van uw voertuig doorspoelen? Een band vervangen Hoe een bougie te installeren Hoe oude bougies te verwijderen Hoe schijfremmen te controleren Hoe uw remvloeistof te wijzigen Hoe de hoofdcilinder van uw remsysteem te controleren Hoe de remvloeistof van een voertuig te controleren Waarom is mijn auto oververhit en wat kan ik doen? Uw voertuig omhoog controleren Hoe uw remleidingen controleren