web-dev-qa-db-fra.com

tokenizer.texts_to_sequences Keras Tokenizer donne presque tous les zéros

Je travaille pour créer un code de classification de texte mais j'ai des problèmes pour encoder des documents à l'aide du tokenizer.

1) J'ai commencé par installer un tokenizer sur mon document comme ici:

vocabulary_size = 20000
tokenizer = Tokenizer(num_words= vocabulary_size, filters='')
tokenizer.fit_on_texts(df['data'])

2) Ensuite, je voulais vérifier si mes données sont correctement ajustées, j'ai donc converti en séquence comme ici:

sequences = tokenizer.texts_to_sequences(df['data'])
data = pad_sequences(sequences, maxlen= num_words) 
print(data) 

ce qui m'a donné une belle sortie. c'est-à-dire des mots codés en nombres

[[ 9628  1743    29 ...   161    52   250]
 [14948     1    70 ...    31   108    78]
 [ 2207  1071   155 ... 37607 37608   215]
 ...
 [  145    74   947 ...     1    76    21]
 [   95 11045  1244 ...   693   693   144]
 [   11   133    61 ...    87    57    24]]

Maintenant, je voulais convertir un texte en une séquence en utilisant la même méthode. Comme ça:

sequences = tokenizer.texts_to_sequences("physics is Nice ")
text = pad_sequences(sequences, maxlen=num_words)
print(text)

ça m'a donné une sortie bizarre:

[[   0    0    0    0    0    0    0    0    0  394]
 [   0    0    0    0    0    0    0    0    0 3136]
 [   0    0    0    0    0    0    0    0    0 1383]
 [   0    0    0    0    0    0    0    0    0  507]
 [   0    0    0    0    0    0    0    0    0    1]
 [   0    0    0    0    0    0    0    0    0 1261]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0 1114]
 [   0    0    0    0    0    0    0    0    0    1]
 [   0    0    0    0    0    0    0    0    0 1261]
 [   0    0    0    0    0    0    0    0    0  753]]

Selon la documentation Keras ( Keras ):

textes_à_séquences (textes)

Arguments: textes: liste de textes à transformer en séquences.

Retour: liste des séquences (une par entrée de texte).

n'est-il pas censé coder chaque mot en son numéro correspondant? puis remplir le texte s'il est inférieur à 50 à 50? Où est l'erreur?

4
Wanderer

Je suppose que vous devriez appeler comme ceci:

sequences = tokenizer.texts_to_sequences(["physics is Nice "])
5
solve it

Vous devriez essayer d'appeler comme ceci:

sequences = tokenizer.texts_to_sequences(["physics is Nice"])

1
nag

L'erreur est l'endroit où vous remplissez les séquences. La valeur de maxlen doit être le nombre maximal de jetons que vous souhaitez, par exemple 50. Donc, changez les lignes en:

maxlen = 50
data = pad_sequences(sequences, maxlen=maxlen)
sequences = tokenizer.texts_to_sequences("physics is Nice ")
text = pad_sequences(sequences, maxlen=maxlen)

Cela réduira les séquences à 50 jetons et remplira le plus court de zéros. Attention à l'option padding. La valeur par défaut est pre ce qui signifie que si une phrase est plus courte que maxlen alors la séquence complétée commencera par des zéros pour la remplir. Si vous voulez que les zéros soient à la fin de la séquence, ajoutez à pad_sequences l'option padding='post'.

1
Aris F.

lorsque vous utilisez, Pads séquences à la même longueur, c'est-à-dire dans votre cas à num_words = vocabulary_size, c'est pourquoi vous obtenez la sortie, essayez simplement avec: tokenizer.texts_to_sequences, cela vous donnera une séquence de mots. en savoir plus sur le rembourrage, il est juste utilisé pour faire correspondre chaque ligne de vos données, les îlots prennent une extrême de 2 phrases. phrase 1 et phrase 2, sentanec1 a une longueur de 5, tandis que la phrase 2 a une longueur de 8. maintenant lorsque nous envoyons nos données pour la formation si nous ne remplissons pas la phrase1 avec 3, nous ne pouvons pas effectuer de formation Wiese par lots. J'espère que ça aide

0
Sujit Jena

Vous devez appeler la méthode comme ceci:

new_sample = ['A new sample to be classified']
seq = tokenizer.texts_to_sequences(new_sample )
padded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)
pred = model.predict(padded)
0
Wesam Na