web-dev-qa-db-fra.com

Que fait exactement la méthode Keras Tokenizer?

À l'occasion, les circonstances nous obligent à procéder comme suit:

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

Puis, invariablement, nous chantons ce mantra:

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

Bien que je comprenne (plus ou moins) quel est l'effet total, je ne peux pas comprendre ce que chacun fait séparément, indépendamment de la quantité de recherches que je fais (y compris, évidemment, la documentation). Je ne pense pas avoir jamais vu l'un sans l'autre.

Alors, que fait chacun? Y a-t-il des circonstances où vous utiliseriez l'un sans l'autre? Sinon, pourquoi ne sont-ils pas simplement combinés en quelque chose comme:

sequences = tokenizer.fit_on_texts_to_sequences(text)

Toutes mes excuses si je manque quelque chose d'évident, mais je suis assez nouveau dans ce domaine.

44
Jack Fleeting

Du code source :

  1. fit_on_texts Met à jour le vocabulaire interne basé sur une liste de textes. Cette méthode crée l'index de vocabulaire basé sur la fréquence des mots. Donc, si vous lui donnez quelque chose comme, "Le chat était assis sur le tapis." Il va créer un dictionnaire s.t. Word_index["the"] = 1; Word_index["cat"] = 2 c'est Word -> dictionnaire d'index donc chaque mot obtient une valeur entière unique. 0 est réservé au remplissage. Un entier inférieur signifie donc un mot plus fréquent (souvent les premiers sont des mots vides car ils apparaissent beaucoup).
  2. texts_to_sequences Transforme chaque texte des textes en une séquence d'entiers. Donc, il prend essentiellement chaque mot dans le texte et le remplace par sa valeur entière correspondante à partir de Word_index dictionnaire. Rien de plus, rien de moins, certainement pas de magie impliquée.

Pourquoi ne pas les combiner? Parce que vous ajustez presque toujours une fois et convertissez en séquences plusieurs fois . Vous vous adapterez à votre corpus d'entraînement une fois et utiliserez exactement le même Word_index dictionnaire au moment du train/de l'évaluation/du test/de la prédiction pour convertir le texte réel en séquences afin de les transmettre au réseau. Il est donc logique de garder ces méthodes séparées.

70
nuric

Ajouter plus aux réponses ci-dessus avec des exemples aidera à mieux comprendre:

exemple 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}

exemple 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}
25
AJ.S

Voyons ce que fait cette ligne de code.

tokenizer.fit_on_texts (texte)

Par exemple, considérons la phrase "La terre est un endroit génial en direct"

tokenizer.fit_on_texts("The earth is an awesome place live") correspond à [[1,2,3,4,5,6,7]] où 3 -> "est", 6 -> "place", etc.

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

renvoie [[1,2,3,4,6,7]].

Vous voyez ce qui s'est passé ici. Le mot "grand" ne convient pas au départ, il ne reconnaît donc pas le mot "grand". Cela signifie que fit_on_text peut être utilisé indépendamment sur les données du train, puis l'index de vocabulaire ajusté peut être utilisé pour représenter un tout nouvel ensemble de séquences de mots. Ce sont deux processus différents. D'où les deux lignes de code.

7
Sundarraj N