Was genau macht die Keras Tokenizer-Methode?

74

Gelegentlich erfordern die Umstände Folgendes:

from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=my_max)

Dann singen wir immer dieses Mantra:

tokenizer.fit_on_texts(text) 
sequences = tokenizer.texts_to_sequences(text)

Obwohl ich (mehr oder weniger) verstehe, was der Gesamteffekt ist, kann ich nicht herausfinden, was jeder einzeln tut, unabhängig davon, wie viel Forschung ich mache (einschließlich natürlich der Dokumentation). Ich glaube nicht, dass ich jemals einen ohne den anderen gesehen habe.

Was macht jeder? Gibt es Umstände, unter denen Sie eines ohne das andere verwenden würden? Wenn nicht, warum werden sie nicht einfach zu etwas kombiniert wie:

sequences = tokenizer.fit_on_texts_to_sequences(text)

Entschuldigung, wenn mir etwas Offensichtliches fehlt, aber ich bin ziemlich neu darin.

Jack flüchtig
quelle
1
Was ich als kontraintuitiv empfinde, ist, dass die Ausgabe des Tokenizers eher eine Folge von ganzen Zahlen wie Wortindizes als eine Liste einzelner Token ist. Tatsächlich könnte es tokenisierten Text (Liste der Token für jeden Inhalt) verwenden und die Folge von Ganzzahlen ausgeben tensorflow.org/api_docs/python/tf/keras/preprocessing/text/… .
flow2k

Antworten:

117

Aus dem Quellcode :

  1. fit_on_texts Aktualisiert den internen Wortschatz anhand einer Liste von Texten. Diese Methode erstellt den Vokabularindex basierend auf der Worthäufigkeit. Also, wenn Sie es so etwas wie "Die Katze saß auf der Matte." Es wird ein Wörterbuch erstellt. word_index["the"] = 1; word_index["cat"] = 2Es ist ein Wort -> Indexwörterbuch, sodass jedes Wort einen eindeutigen ganzzahligen Wert erhält. 0 ist zum Auffüllen reserviert. Eine niedrigere Ganzzahl bedeutet also häufigeres Wort (oft sind die ersten paar Stoppwörter, weil sie häufig vorkommen).
  2. texts_to_sequences Wandelt jeden Text in Texte in eine Folge von ganzen Zahlen um. Im Grunde genommen nimmt es jedes Wort im Text und ersetzt es durch den entsprechenden ganzzahligen Wert aus dem word_indexWörterbuch. Nicht mehr und nicht weniger, schon gar keine Magie.

Warum kombinieren Sie sie nicht? Weil Sie fast immer einmal passen und viele Male in Sequenzen konvertieren . Sie werden einmal in Ihr Trainingskorpus passen und genau dasselbe word_indexWörterbuch zum Zeitpunkt des Zuges / der Bewertung / des Testens / der Vorhersage verwenden, um den tatsächlichen Text in Sequenzen umzuwandeln, um sie dem Netzwerk zuzuführen. Daher ist es sinnvoll, diese Methoden getrennt zu halten.

Krankenpflege
quelle
1
Das war also alles im Quellcode! Ich glaube, ich habe nicht genau genug ausgesehen ... Und jetzt verstehe ich: fit - einmal, Sequenz - viele! Lebe und lerne wie immer. Vielen Dank.
Jack Fleeting
@nuric danke für die antwort. Ein paar Anmerkungen jedoch. Laut offiziellen Dokumenten ist " 0ein reservierter Index, der keinem Wort zugewiesen wird". In Ihrem Beispiel wäre der erste Wortindex also 1 keras.io/preprocessing/text. Ein weiterer Punkt ist, dass der Standardfilter die meisten Interpunktionssymbole entfernt, daher sind diese nur dann am häufigsten im Vokabular, wenn Sie Interpunktionen aus dem Filter entfernen.
Nikita
1
@Nikita danke für den Hinweis, ich habe die Antwort aktualisiert, um das zu beheben.
Nuric
49

Das Hinzufügen weiterer Antworten zu den obigen Antworten mit Beispielen hilft beim besseren Verständnis:

Beispiel 1 :

t  = Tokenizer()
fit_text = "The earth is an awesome place live"
t.fit_on_texts(fit_text)
test_text = "The earth is an great place live"
sequences = t.texts_to_sequences(test_text)

print("sequences : ",sequences,'\n')

print("word_index : ",t.word_index)
#[] specifies : 1. space b/w the words in the test_text    2. letters that have not occured in fit_text

Output :

       sequences :  [[3], [4], [1], [], [1], [2], [8], [3], [4], [], [5], [6], [], [2], [9], [], [], [8], [1], [2], [3], [], [13], [7], [2], [14], [1], [], [7], [5], [15], [1]] 

       word_index :  {'e': 1, 'a': 2, 't': 3, 'h': 4, 'i': 5, 's': 6, 'l': 7, 'r': 8, 'n': 9, 'w': 10, 'o': 11, 'm': 12, 'p': 13, 'c': 14, 'v': 15}

Beispiel 2 :

t  = Tokenizer()
fit_text = ["The earth is an awesome place live"]
t.fit_on_texts(fit_text)

#fit_on_texts fits on sentences when list of sentences is passed to fit_on_texts() function. 
#ie - fit_on_texts( [ sent1, sent2, sent3,....sentN ] )

#Similarly, list of sentences/single sentence in a list must be passed into texts_to_sequences.
test_text1 = "The earth is an great place live"
test_text2 = "The is my program"
sequences = t.texts_to_sequences([test_text1, test_text2])

print('sequences : ',sequences,'\n')

print('word_index : ',t.word_index)
#texts_to_sequences() returns list of list. ie - [ [] ]

Output:

        sequences :  [[1, 2, 3, 4, 6, 7], [1, 3]] 

        word_index :  {'the': 1, 'earth': 2, 'is': 3, 'an': 4, 'awesome': 5, 'place': 6, 'live': 7}
ajaysinghnegi
quelle
4
Beispiele lügen nie! Danke für die tolle Antwort.
Chintan
Ich habe einen Trainingsdatensatz und einen Testdatensatz, die beide zwei Spalten haben: einen Index und den bereits bereinigten Text. Ich frage mich, ob es in Ordnung ist, ein append () zwischen beiden Datenrahmen und dann Tokenizer.fit_on_text () für das angehängte Set auszuführen, anstatt es nur für das Training zu tun. Ich denke, wenn ich nur Text in einen Ganzzahlvektor konvertieren möchte, wobei jede Ganzzahl ein Wort aus dem gesamten verwendeten Vokabular darstellt, wäre es besser, zuerst ein append () auszuführen, da die Vektoren im Testsatz mehr Elemente enthalten, wenn ich text_to_sequence ausführe ().
Nachengue
9

Mal sehen, was diese Codezeile macht.

tokenizer.fit_on_texts (Text)

Betrachten Sie zum Beispiel den Satz "Die Erde ist ein großartiger Ort zum Leben".

tokenizer.fit_on_texts("The earth is an awesome place live") passt [[1,2,3,4,5,6,7]] wobei 3 -> "ist", 6 -> "Ort" usw.

sequences = tokenizer.texts_to_sequences("The earth is an great place live")

gibt [[1,2,3,4,6,7]] zurück.

Sie sehen, was hier passiert ist. Das Wort "großartig" passt anfangs nicht, daher erkennt es das Wort "großartig" nicht. Das heißt, fit_on_text kann unabhängig für Zugdaten verwendet werden, und dann kann der angepasste Vokabularindex verwendet werden, um einen völlig neuen Satz von Wortfolgen darzustellen. Dies sind zwei verschiedene Prozesse. Daher die beiden Codezeilen.

Sundarraj N.
quelle
Guter Fang über das fehlende Wort "großartig". Aber wie können wir mit solchen Wörtern umgehen, die nicht im Wortschatz enthalten sind?
Kkgarg