Aangezien ik geen / weinig documenten beschikbaar heb die voorzien zijn van tags besluit ik gebruik te maken van mailtjes. Voor de tags gebruik ik dan de woorden uit het 'subject'. Ik doe een proef met een export naar csv van mijn eigen mail archief. Het is 40,2 mB groot en bestaat uit 4465 mailtjes. Een redelijk aantal voor een nn zou ik zeggen.
Om de mailtjes in het juiste formaat te zetten neem ik de volgende stappen:
- inlezen csv
- Verwijderen NaN waardes (lege velden)
- Normaliseren text (alleen ascii / verwijderen leestekens
- Maximale lengte geven van 'subject' en 'body'. Ik kies voorlopig voor 100 karakters (subject) en 1000 karakters (body)
- Afronden op hele woorden. Om te voorkomen dat de vorige actie afgebroken woorden geeft.
- Verzamelen van alle woorden in 1 set. Het blijkt op dit moment uit te komen op 19126 verschillende woorden.
- Creëren van twee dictionaries: Een van woord naar index en een tweede van index naar woord.
- Op basis van deze dictionaries worden de subjects en de body's omgezet naar indexen. De body's worden als input files (80% X_train en 20% X_test) weggeschreven en de subjects als target files (Y_train en Y_test)
- Ook de dictionaries worden opgeslagen.
Nu in het 2e programma komt het leuke werk. Deep learning!
Ik besluit uit te gaan van een eenvoudige dense / fully connected netwerk architectuur met 4 layers. Uiteraard op basis van Keras:
model = Sequential()
model.add(Dense(32, input_shape=(body_len,), activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(subject_len, activation='relu'))
# Fully connected
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
print('calculating model ...')
hist_pn=model.fit(X_train, Y_train,
batch_size=32, epochs=1000, verbose=1)
score_pn = model.evaluate(X_test, Y_test, verbose=1)
y_eval = model.predict(X_test, batch_size=None, verbose=1, steps=None)
Maar eerst nog wat voorbereiding met de data.
- Binnenlezen bestanden
- Vaste lengte arrays maken. Voor subject kies ik 21 'woorden' en voor de body 226. Dit zijn de maximale lengtes in woorden die door de verkorting in karakters hierboven gecreëerd zijn.
- Ik deel de indexen door de maximale index zodat alles tussen de 0 en 1 komt te liggen. Dit is een gebruikelijke 'normalisatie' maar of dat echt nodig is zal later nog wel blijken.
- Omzetten naar type float32
Omdat het netwerk ontzettend snel is laat ik het 1000 epochs doorlopen.
En ik krijg dit resultaat.
Evaluation score ['0.0544239418986051', '0.24347826061041458']
De gevonden woorden lijken in eerste instantie nog weinig belovend. Maar de evaluatie score .24 is ook nog niet zo best. Het is laat. Morgen weer verder kijken.
Geen opmerkingen:
Een reactie posten