Keras文本预处理 - 将Tokenizer对象保存到文件以进行评分

时间:2017-08-17 12:25:33

标签: machine-learning neural-network nlp deep-learning keras

我已经按照以下步骤(广泛地)使用Keras库训练了一个情绪分类器模型。

  1. 使用Tokenizer对象/类
  2. 将文本语料库转换为序列
  3. 使用model.fit()方法构建模型
  4. 评估此模型
  5. 现在,使用此模型进行评分,我能够将模型保存到文件并从文件加载。但是我没有找到将Tokenizer对象保存到文件的方法。如果没有这个,我每次需要得到一个句子时都必须处理语料库。有办法解决这个问题吗?

5 个答案:

答案 0 :(得分:53)

最常见的方法是使用picklejoblib。这里有一个示例,说明如何使用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)

答案 1 :(得分:7)

已接受的答案清楚地说明了如何保存令牌生成器。以下是对(通常)在拟合或保存后对评分的问题的注释。假设列表texts由两个列表Train_textTest_text组成,其中Test_text中的令牌集是{{1}中的令牌集的子集}(乐观假设)。与首先调用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,))

当然,如果不满足上述乐观假设,并且Test_text中的标记集与Train_test的标记集不相交,则测试1会得到一个空括号result for test 1: [[3], [10, 3, 9]] result for test 2: [[1, 19], [5, 1, 4]]

的列表

答案 2 :(得分:3)

Tokenizer类具有将日期保存为JSON格式的功能:

{
    "userId": 0,
    "id": 0,
    "title": null
}

可以使用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

答案 3 :(得分:1)

我在keras Repo中创建了问题https://github.com/keras-team/keras/issues/9289。在更改API之前,该问题有一个指向gist的链接,该gist具有代码,用于演示如何保存和恢复标记生成器,而无需使用标记生成器所适用的原始文档。我更喜欢将所有模型信息存储在JSON文件中(因为原因,但主要是混合JS / Python环境),这样就可以实现,即使使用sort_keys = True

答案 4 :(得分:0)

我在 link 的以下 @thusv89 处找到了以下片段。

保存对象:

import pickle

with open('data_objects.pickle', 'wb') as handle:
    pickle.dump(
        {'input_tensor': input_tensor, 
         'target_tensor': target_tensor, 
         'inp_lang': inp_lang,
         'targ_lang': targ_lang,
        }, handle, protocol=pickle.HIGHEST_PROTOCOL)

加载对象:

with open("dataset_fr_en.pickle", 'rb') as f:
    data = pickle.load(f)
    input_tensor = data['input_tensor']
    target_tensor = data['target_tensor']
    inp_lang = data['inp_lang']
    targ_lang = data['targ_lang']