<目次>
(1) KerasのTokenizerの使い方(具体例付き)
KerasのTokenizerとは?
主な機能とインスタンス生成
(1-1) fit_on_texts の使い方
(1-2) texts_to_sequences の使い方
(1-3) texts_to_matrix(One-hot)の使い方
(1-4) KerasのTokenizerの挙動確認(Python)
(1) KerasのTokenizerの使い方(具体例付き)
KerasのTokenizerとは?
・データ(文章など)をトークン化(悪用可能な意味や値を持たない非機密値)する処理。
・これが文章の統計分析やDeep Learningにも使える。
主な機能とインスタンス生成
KerasのTokenizerの主な機能は以下の通りです。
- fit_on_texts:複数の文(sentences)を入力にして「辞書」を作成します。
- texts_to_sequences:「辞書」とテキストを突合して各単語のインデックス列へ変換します。
- texts_to_matrix:突合結果を行列へ変換します(One-hotなど)。
インスタンス生成時の主な引数例は以下です(num_words は「word_index」の序列の何番目の単語まで保持するかを指定)。
⇒詳しくは Tokenizer(Keras API) を参照。
(図123)

(図124)7⇒5にすると「’you’: 6」や「’daughter’: 7」は処理「texts_to_sequences」の対象外になる。

(1-1) fit_on_texts の使い方
STEP1-1:サンプル文から辞書を作成
メソッド「fit_on_texts」
・複数の文(sentences)を入力にして「辞書」を作ります。
(入力例)
sentences = [
'i love my wife',
'I, love my son',
'You love my daughter!'
]
(処理例)
・内部的には登場回数の集計や、それに応じたインデックス付与(word_index)も行っています。
・それらの情報はTokenizerのメンバーである「word_index」や「word_docs」で取得可能
(出力例)
tk.word_index
⇒{'love': 1, 'my': 2, 'i': 3, 'wife': 4, 'son': 5, 'you': 6, 'daughter': 7}
tk.word\_docs
⇒defaultdict(\, {'love': 3, 'my': 3, 'wife': 1, 'i': 2, 'son': 1, 'you': 1, 'daughter': 1})
(図121)

(1-2) texts_to_sequences の使い方
メソッド「texts_to_sequences」
・「辞書」と「テストデータ」を突合するメソッドです。
・基本的には「fit_on_texts」で作った辞書を入力にして使います。
・注意点として、引数は「リスト」形式のため [XXXXX] のように渡します。
(入力例)
・「fit_on_texts」の結果
・sentences = ['i love my wife', 'I, love my son', 'You love my daughter!']
(処理例)
・各文(sentence)ごとに辞書のindexと突合したマップを作成
(図122)

(出力例)
tk.texts_to_sequences(sentences) ⇒[[3, 1, 2, 4], [3, 1, 2, 5], [6, 1, 2]]
(1-3) texts_to_matrix(One-hot)の使い方
メソッド「texts_to_matrix」
・基本的には「fit_on_texts」で作った辞書を入力にして使います。
・突合結果として出来るマトリクスを「One-hot encoding」と呼びます。
・注意点として、引数は「リスト」形式のため [XXXXX] のように渡します。
(入力例)
・「fit_on_texts」の結果
・sentences = ['i love my wife', 'I, love my son', 'You love my daughter!']
(処理例)
・各文(sentence)ごとに辞書のindexと突合したマップを作成
(図126)

(出力例)
tk.texts_to_matrix(sentences) ⇒[[0. 1. 1. 1. 1. 0. 0.]
(図125)(参考)公式ページの図はこんな感じ

(1-4) KerasのTokenizerの挙動確認(Python)
from keras.preprocessing.text import Tokenizer
def main():
sentences = [
'i love my wife',
'I, love my son',
'You love my daughter!'
]
# Tokenizerクラスのインスタンス生成
tk = Tokenizer(num_words=7,
filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{"}~\t\n',
lower=True,
char_level=False,
split=' ')
print("==処理前== tk.document_count: ", tk.document_count)
print("==処理前== tk.num_words: ", tk.num_words)
print("==処理前== tk.word_index: ", tk.word_index)
print("==処理前== tk.word_docs: ", tk.word_docs)
# 複数の文(sentences)を入力にして「辞書」を作ります。
tk.fit_on_texts(sentences)
print("--------------------------------")
print("==処理後== tk.document_count: ", tk.document_count)
print("==処理後== tk.num_words: ", tk.num_words)
print("==処理後== tk.word_index: ", tk.word_index)
print("==処理後== tk.word_docs: ", tk.word_docs)
# 「辞書」と「テストデータ」を突合するメソッドです。
print("====== texts_to_sequences: ", tk.texts_to_sequences(sentences))
print("====== texts_to_matrix: ", tk.texts_to_matrix(sentences))
if __name__ == "__main__":
main()
(出力例)
==処理前== tk.document_count: 0
==処理前== tk.num_words: 7
==処理前== tk.word_index: {}
==処理前== tk.word_docs: defaultdict(<class 'int'>, {})
--------------------------------
==処理後== tk.document_count: 3
==処理後== tk.num_words: 7
==処理後== tk.word_index: {'love': 1, 'my': 2, 'i': 3, 'wife': 4, 'son': 5, 'you': 6, 'daughter': 7}
==処理後== tk.word_docs: defaultdict(<class 'int'>, {'wife': 1, 'i': 2, 'my': 3, 'love': 3, 'son': 1, 'you': 1, 'daughter': 1})
====== texts_to_sequences: [[3, 1, 2, 4], [3, 1, 2, 5], [6, 1, 2]]