web-dev-qa-db-ja.com

tokenizer.texts_to_sequences Keras Tokenizerはほとんどすべてゼロを与える

テキスト分類コードの作成に取り組んでいますが、トークナイザーを使用したドキュメントのエンコードに問題があります。

1)私は次のようにドキュメントにトークナイザーを取り付けることから始めました:

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

2)次に、データが正しくフィットしているかどうかを確認したかったので、次のようにシーケンスに変換しました。

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

それは私に素晴らしい出力を与えました。つまり、単語を数値にエンコードします

[[ 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]]

ここで、同じ方法を使用してテキストをシーケンスに変換したいと思いました。このような:

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

それは私に奇妙な出力を与えました:

[[   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]]

Kerasのドキュメントによると( Keras ):

texts_to_sequences(texts)

引数:テキスト:シーケンスに変換するテキストのリスト。

戻り値:シーケンスのリスト(テキスト入力ごとに1つ)。

各Wordを対応する番号にエンコードすることは想定されていませんか?次に、テキストが50〜50未満の場合は、テキストを埋めますか間違いはどこですか?

4
Wanderer

あなたはこのように呼ぶべきだと思います:

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

次のように呼び出してみてください:

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

1
nag

エラーは、シーケンスを埋め込む場所です。 maxlenの値は、必要な最大トークンにする必要があります。 50.したがって、行を次のように変更します。

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

これにより、シーケンスが50トークンにカットされ、短い方がゼロで埋められます。 paddingオプションに注意してください。デフォルトはpreです。つまり、文がmaxlenより短い場合、パディングされたシーケンスはゼロで始まり、埋められます。シーケンスの最後までゼロが必要な場合は、pad_sequencesオプションpadding='post'を追加します。

1
Aris F.

使用すると、Padシーケンスが同じ長さ、つまりnum_words = vocabulary_sizeの場合にパディングされます。これが出力を取得する理由です。ただ、:tokenizer.texts_to_sequencesで試してください。これにより、単語のシーケンスが得られます。パディングについての詳細を読んでください。これは、データのすべての行を照合するために使用されるだけであり、膵島は2つの文を極端に使用します。センテンス1とセンテンス2、sentanec1の長さは5、センテンス2の長さは8です。トレーニングのためにデータを送信するときに、sentence1に3を埋め込まない場合、バッチWieseトレーニングを実行できません。それが役に立てば幸い

0
Sujit Jena

次のようにメソッドを呼び出す必要があります。

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