web-dev-qa-db-ja.com

Keras Text Preprocessing-スコア付けのためにTokenizerオブジェクトをファイルに保存する

Kerasライブラリを使用して、以下の手順に従って(広く)感情分類子モデルをトレーニングしました。

  1. Tokenizerオブジェクト/クラスを使用してテキストコーパスをシーケンスに変換します
  2. Model.fit()メソッドを使用してモデルを構築します
  3. このモデルを評価する

このモデルを使用してスコアリングするために、モデルをファイルに保存し、ファイルからロードすることができました。ただし、Tokenizerオブジェクトをファイルに保存する方法が見つかりませんでした。これがなければ、一文でも採点する必要があるたびにコーパスを処理する必要があります。これを回避する方法はありますか?

最も一般的な方法は、 pickle または joblib を使用することです。 pickleを保存するためにTokenizerを使用する方法の例を示します。

import pickle

# saving
with open('tokenizer.pickle', 'wb') as handle:
    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

# loading
with open('tokenizer.pickle', 'rb') as handle:
    tokenizer = pickle.load(handle)
60
Marcin Możejko

受け入れられた答えは、トークナイザーの保存方法を明確に示しています。以下は、(一般的に)スコアリングの問題に関するコメントですafterフィッティングまたは保存。リストtextsが2つのリストTrain_textTest_textで構成されているとします。ここで、Test_textのトークンのセットはTrain_textのトークンのセットのサブセットです(楽観的仮定)。 fit_on_texts(Train_text)は、最初にtexts_to_sequences(Test_text)を呼び出してからfit_on_texts(texts)を呼び出す場合と比較して、text_to_sequences(Test_text)に対して異なる結果を返します。

具体例:

from keras.preprocessing.text import Tokenizer

docs = ["A heart that",
         "full up like",
         "a landfill",
        "no surprises",
        "and no alarms"
         "a job that slowly"
         "Bruises that",
         "You look so",
         "tired happy",
         "no alarms",
        "and no surprises"]
docs_train = docs[:7]
docs_test = docs[7:]
# EXPERIMENT 1: FIT  TOKENIZER ONLY ON TRAIN
T_1 = Tokenizer()
T_1.fit_on_texts(docs_train)  # only train set
encoded_train_1 = T_1.texts_to_sequences(docs_train)
encoded_test_1 = T_1.texts_to_sequences(docs_test)
print("result for test 1:\n%s" %(encoded_test_1,))

# EXPERIMENT 2: FIT TOKENIZER ON BOTH TRAIN + TEST
T_2 = Tokenizer()
T_2.fit_on_texts(docs)  # both train and test set
encoded_train_2 = T_2.texts_to_sequences(docs_train)
encoded_test_2 = T_2.texts_to_sequences(docs_test)
print("result for test 2:\n%s" %(encoded_test_2,))

結果:

result for test 1:
[[3], [10, 3, 9]]
result for test 2:
[[1, 19], [5, 1, 4]]

もちろん、上記の楽観的な仮定が満たされておらず、Test_textのトークンのセットがTrain_testのトークンの集合とは素である場合、テスト1は空のブラケットのリストになります[].

7
Quetzalcoatl

Tokenizerクラスには、日付をJSON形式に保存する機能があります。

tokenizer_json = tokenizer.to_json()
with io.open('tokenizer.json', 'w', encoding='utf-8') as f:
    f.write(json.dumps(tokenizer_json, ensure_ascii=False))

データは、tokenizer_from_jsonからkeras_preprocessing.text関数を使用してロードできます。

with open('tokenizer.json') as f:
    data = json.load(f)
    tokenizer = tokenizer_from_json(data)
4
Max

私は問題を作成しました https://github.com/keras-team/keras/issues/9289 kerasリポジトリで。 APIが変更されるまで、この問題には、トークナイザーが適合する元のドキュメントを持たずにトークナイザーを保存および復元する方法を示すコードを持つGistへのリンクがあります。私はすべてのモデル情報をJSONファイルに保存することを好みます(理由はありますが、主にJS/Python環境が混在しているため)。これにより、sort_keys = Trueでも可能

1
UserOneFourTwo