maandag 23 mei 2016

01 - Helpdesk

Chatbots zijn 'in' dit jaar. En aangezien deze natuurlijk iets zinnigs te vertellen moeten hebben zouden die heel goed inzetbaar moeten zijn / worden als helpdesk. Reden om eens te kijken of ik een eenvoudige vorm daarvan aan de praat kan krijgen op basis van helpdesk tickets. Concreet wil ik eens kijken of er, op basis van de korte beschrijving, een bijpassend 'meest waarschijnlijk' antwoord kan worden gegenereerd.



Een interessante oefening (vind ik dan toch :-) om ook eens met Keras LSTM (Long Short Term Memory) te werken. De gedachte is dat woorden in een zin een volgorde hebben die relevant is voor de keuze van het resultaat. Ik heb al eens eerder met LSTMs geƫxperimenteerd zodat ik 'nieuwe verhalen' kon schrijven op basis van een bestand boek. Daar werd steeds het eerstvolgende woord (of letter) gegenereerd. Nu wil ik als eerste dat de index van de oplossing van de vaag wordt gegenereerd. Gelukkig heeft Keras een aardig en eenvoudig voorbeeld model:

model = Sequential() model.add(LSTM(32, return_sequences=True, input_shape=(timesteps, data_dim))) # returns a sequence of vectors of dimension 32 model.add(LSTM(32, return_sequences=True)) # returns a sequence of vectors of dimension 32 model.add(LSTM(32)) # return a single vector of dimension 32 model.add(Dense(10, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

Een gelaagd LSTM model met een uitkomst in dit geval van 10 vectoren.

De uitdaging voor mij is om de woorden in de korte omschrijvingen te 'vectoriseren' (gewoon een indexnummer toekennen). Ik overweeg nog even om een word2vec 'ertussen' te bouwen zodat er meer 'betekenis' in de vectoren komt maar dat komt later misschien nog wel een keer.

Er zijn 17207 tickets nadat ik die 'zonder aangegeven oplossing' eruit heb gehaald. Zoals al eerder is he eerst een uitdaging om de tekst schoon te krijgen. Er blijkt in de 'oplossingen' ook veel html-code te zitten. Die haal ik eruit met een bibliotheek die 're' heet:

import re
def cleanhtml(raw_html):
    cleanr =re.compile('<.*?>')
    cleantext = re.sub(cleanr,'', raw_html)

    return cleantext

Daarnaast zie ik ook een aantal Chinese karakters. Het is blijkbaar een unicode bestand. Het vertalen naar ascii vraagt om wat vreemde truckage: (De reload is blijkbaar noodzakelijk)

import sys
reload(sys)

sys.setdefaultencoding('utf8')

Intxt = Intxt.encode('ascii', errors='ignore')

Met nog wat vervangingen van wat codes en vrijwel alle tekens lukt het om de gewenste 'schone tekst' te krijgen.

Voor de indexering gebruik ik weer een eerder afgekeken enumerate in een 'dictionary'.

char_indices = dict((c, i) for i, c in enumerate(words))

indices_char = dict((i, c) for i, c in enumerate(words))

Ik splits de dataset na een 'shuffle' op in een 'train' gedeelte van 15486 en een validatie gedeelte van 1721 samples. Van de uitkomstwaarden (Y) maak ik een boolean array ter grootte van het aantal records. Dat is dus wel een uitdaging voor een NN! Van, zeg, gemiddeld een 10-tal woorden een keuze maken uit 17207 oplossingen! Hmmm misschien wat te hoog gegrepen.





 
  

     

Geen opmerkingen:

Een reactie posten