Tot nu toe maak ik, net als feitelijk alle voorbeelden, een conversie van woorden naar tokens. Oftewel elk woord krijgt zijn eigen nummer omdat nn's nou eenmaal niet met de woorden zelf aan de slag kunnen.
Het gevolg is dat de woorden tabel enorm groot kan worden. Zeker ook met allerlei woordvariaties, mis-spellingen of bijvoorbeeld allerlei nummers.
Ik wil al lang eens een keer experimenteren met de conversie vanuit letters/tekens. Althans een nummerieke versie daarvan.
Door de hoofdletters en kleine een vergelijkbare waarde te geven hoop ik dat een nn eenvoudiger kan leren dat woorden met of zonder hoofdletter een vergelijkbare betekenis hebben.
Ik kies deze 'sequence':
letters = ' AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890.,;:?!<>@#$^&()_+-*/%\\{}||~`"' + "'"
Ook de tekens die in vergelijkbare situaties worden gebruikt staan hier zoveel mogelijk gegroepeerd.
Het model hou ik vergelijkbaar ana het woord - token model:
def Model_attention_conv():
model = Sequential()
model.add(Embedding(vocab_size, 256, input_length=input_length))
model.add(SpatialDropout1D(0.3))
model.add(Conv1D(512, 7, activation='relu'))
model.add(Dropout(.5))
model.add(MaxPooling1D())
model.add(SeqSelfAttention(attention_activation='sigmoid'))
model.add(Flatten())
model.add(Dense(labels_max, activation='sigmoid'))
return model
De resultaten bij een volledige run zijn al veelbelovend:
F1 score : 0.724246135574413 3rd try - letter_training full data ... best val_acc : 0.9407742806943601