テキスト分類コードの作成に取り組んでいますが、トークナイザーを使用したドキュメントのエンコードに問題があります。
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未満の場合は、テキストを埋めますか間違いはどこですか?
あなたはこのように呼ぶべきだと思います:
sequences = tokenizer.texts_to_sequences(["physics is Nice "])
次のように呼び出してみてください:
sequences = tokenizer.texts_to_sequences(["physics is Nice"])
エラーは、シーケンスを埋め込む場所です。 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'
を追加します。
使用すると、Padシーケンスが同じ長さ、つまりnum_words = vocabulary_sizeの場合にパディングされます。これが出力を取得する理由です。ただ、:tokenizer.texts_to_sequencesで試してください。これにより、単語のシーケンスが得られます。パディングについての詳細を読んでください。これは、データのすべての行を照合するために使用されるだけであり、膵島は2つの文を極端に使用します。センテンス1とセンテンス2、sentanec1の長さは5、センテンス2の長さは8です。トレーニングのためにデータを送信するときに、sentence1に3を埋め込まない場合、バッチWieseトレーニングを実行できません。それが役に立てば幸い
次のようにメソッドを呼び出す必要があります。
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)