Um die Liste der Worte eines Textes zu erstellen gibt es in Keras einen Tokenizer
#!/usr/bin/env python
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
sentences = [
'Die Katze fliegt nicht.',
'Der Hund kann Katzen nicht leiden.',
]
tokenizer = Tokenizer(num_words = 100, oov_token='<OOV>')
tokenizer.fit_on_texts(sentences)
word_index = tokenizer_word_index
sequences = tokenizer.texts_to_sequences(sentences)
print(word_index)
print(sequences)
print(tokenizer.texts_to_sequences(['Der Esel fliegt auch nicht']))
padded = pad_sequences(sequences, padding='post', truncating='post', maxlen=6)
print(padded)
In diesem Beispiel wird im Tokenizer-Konstruktor ein optionales Argument oov_token (out-of-vocabulary) mitgegeben. Wozu das gut ist wird weiter unten klar werden.
Durch tokenizer.tokenizer_fit_on_texts(sentences) wird intern eine Liste aller vorkommenden Wort aufgebaut. <OOV> wird weiter unten geklärt.
Auf die Liste der Worte kann mit tokenizer.word_index zugegriffen werden.
{'<OOV>': 1, 'nicht': 2, 'die': 3, 'katze': 4, 'fliegt': 5, 'der': 6, 'hund': 7, 'kann': 8, 'katzen': 9, 'leiden': 10}
Sobald die Liste aller Worte aufgebaut wurde, können beliebige Sätze in Index-Sequenzen umgewandelt werden.
[[3, 4, 5, 2], [6, 7, 8, 9, 2, 10]]
Im Tokenizer-Konstruktor wird noch ein Argument out-of-vocabulary mitgegeben. Dadurch wird im Wortindex ein Platzhalter für unbekannte Worte erstellt. Immer wenn tokenizer.text_to_sequence ein unbekanntes Wort sieht, wird dies durch den Index des Wortes <OOV> ersetzt. Im Beispielsatz sind Esel und auch unbekannte Worte und deshalb steht der Index 1 an den entsprechenden Positionen.
[[6, 1, 5, 1, 2]]
Damit die Sequenzen in einem LSTM oder GRU gelernt werden können, müssen sie gleiche Längen haben. Das wird durch pad_sequences() erreicht.
[[ 3 4 5 2 0 0]
[ 6 7 8 9 2 10]]