web-dev-qa-db-ja.com

Keras Tokenizerメソッドは正確に何をしますか?

状況によっては、次のことを行う必要があります。

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

次に、必ずこのマントラを唱えます。

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

私は(多かれ少なかれ)全体の効果を理解していますが、どれだけの研究(明らかにドキュメントを含む)に関係なく、それぞれが個別に何をしているのか理解できません。私は、他の人なしでこれまで見たことがないと思います。

それで、それぞれは何をしますか?どちらか一方をもう一方なしで使用する状況はありますか?そうでない場合、なぜそれらは単に次のようなものに結合されないのですか?

sequences = tokenizer.fit_on_texts_to_sequences(text)

明らかなものがない場合はお詫びしますが、これはかなり新しいです。

44
Jack Fleeting

ソースコード から:

  1. _fit_on_texts_テキストのリストに基づいて内部語彙を更新します。このメソッドは、Wordの頻度に基づいて語彙インデックスを作成します。つまり、「猫はマットの上に座った」のようなものを与えると、辞書s.tを作成します。 _Word_index["the"] = 1; Word_index["cat"] = 2_これはWord->索引辞書なので、すべてのWordは一意の整数値を取得します。 0はパディング用に予約されています。したがって、整数が小さいほどWordの頻度が高くなります(多くの場合、最初のいくつかはストップワードです)。
  2. _texts_to_sequences_テキスト内の各テキストを整数のシーケンスに変換します。基本的に、テキスト内の各Wordを取得して、_Word_index_辞書。それ以上でも、それ以下でも、確かに魔法は必要ありません。

それらを組み合わせないのはなぜですか?ほとんど常に1回に当てはまり、シーケンス何度も。トレーニングコーパスに一度はめ込み、train/eval/Testing /予測時にまったく同じ_Word_index_辞書を使用して、実際のテキストをシーケンスに変換し、ネットワークにフィードします。したがって、これらのメソッドを分離しておくことは理にかなっています。

70
nuric

上記の回答に例を追加すると、理解が深まります。

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

例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

このコード行が何をするか見てみましょう。

tokenizer.fit_on_texts(テキスト)

たとえば、「地球は生きている素晴らしい場所です」という文を考えてみましょう。

tokenizer.fit_on_texts("The earth is an awesome place live") fits [[1,2,3,4,5,6,7]] where 3-> "is"、6-> "place"など。

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

[[1,2,3,4,6,7]]を返します。

ここで何が起こったかがわかります。 「素晴らしい」という言葉は最初は適合しないので、「素晴らしい」という言葉を認識しません。つまり、fit_on_textはトレインデータに対して個別に使用でき、その後、適合した語彙インデックスを使用して、まったく新しいWordシーケンスのセットを表すことができます。これらは2つの異なるプロセスです。したがって、2行のコードです。

7
Sundarraj N