我有一个带文本列的数据框。我把它们分为x_trainx_test
我的问题是,对整个数据集执行keras的Tokenizer.fit_on_text()更好,还是只执行x
这样地:

tokenizer = Tokenizer()
tokenizer.fit_on_texts(x_data)


tokenizer.fit_on_texts(x_train)        # <- fixed typo
tokenizer.texts_to_sequences(x_train)

有关系吗?我也必须稍后再标记x_train,所以我能不能使用同样的记号器?

最佳答案

虽然this question中的信息是好的,但确实有更重要的事情需要注意:
在训练和测试数据中必须使用相同的记录器。
否则,每个数据集将有不同的标记。每个标记赋予器都有一个用fit_on_texts创建的内部字典。
不能保证火车和测试数据具有相同的频率相同的单词,因此每个数据集将创建一个不同的字典,并且所有来自测试数据的结果都是错误的。
这也意味着您不能fit_on_texts,训练然后再次fit_on_texts:这将更改内部字典。
有可能符合全部数据。但是,最好为“未知”单词(oov_token=True)保留一个标记,以便在您发现新的测试数据时使用您的模型从未见过的单词(这要求您也用此标记替换训练数据中的罕见单词)。
使用未知单词测试标记器:
下面的测试表明,未设置oov_token时,标记器完全忽略未知单词。这可能不是个好主意。未知词可能是句子中的关键词,简单地忽略它们可能比知道有未知的东西更糟糕。

import numpy as np
from keras.layers import *
from keras.models import Model
from keras.preprocessing.text import Tokenizer

training = ['hey you there', 'how are you', 'i am fine thanks', 'hello there']
test = ['he is fine', 'i am fine too']

tokenizer = Tokenizer()
tokenizer.fit_on_texts(training)

print(tokenizer.texts_to_sequences(training))
print(tokenizer.texts_to_sequences(test))

输出:
[[3, 1, 2], [4, 5, 1], [6, 7, 8, 9], [10, 2]]
[[8], [6, 7, 8]]

现在,这表明标记器将索引1赋给所有未知单词:
tokenizer2 = Tokenizer(oov_token = True)
tokenizer2.fit_on_texts(training)
print(tokenizer2.texts_to_sequences(training))
print(tokenizer2.texts_to_sequences(test))

输出:
[[4, 2, 3], [5, 6, 2], [7, 8, 9, 10], [11, 3]]
[[1, 1, 9], [7, 8, 9, 1]]

但是在训练数据中用1替换一组罕见的单词可能会很有趣,因此您的模型有一个如何处理未知单词的概念。

关于python - 在整个x_data上还是仅在train_data上对Keras fit_to_text更好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54891464/

10-11 15:36