tokenizer.texts_to_sequences Keras令牌生成器几乎提供所有零

时间:2018-08-05 23:28:33

标签: python keras nlp deep-learning tokenize

我正在努力创建文本分类代码,但是在使用标记器对文档进行编码时遇到了问题。

1)我首先在文档中安装了一个分词器,如下所示:

vocabulary_size = 20000
tokenizer = Tokenizer(num_words= vocabulary_size, filters='')
tokenizer.fit_on_texts(df['data'])

2)然后,我想检查我的数据是否正确拟合,因此我按如下所示转换为序列:

sequences = tokenizer.texts_to_sequences(df['data'])
data = pad_sequences(sequences, maxlen= num_words) 
print(data) 

这给了我很好的输出。即将单词编码成数字

[[ 9628  1743    29 ...   161    52   250]
 [14948     1    70 ...    31   108    78]
 [ 2207  1071   155 ... 37607 37608   215]
 ...
 [  145    74   947 ...     1    76    21]
 [   95 11045  1244 ...   693   693   144]
 [   11   133    61 ...    87    57    24]]

现在,我想使用相同的方法将文本转换为序列。 像这样:

sequences = tokenizer.texts_to_sequences("physics is nice ")
text = pad_sequences(sequences, maxlen=num_words)
print(text)

它给了我奇怪的输出:

[[   0    0    0    0    0    0    0    0    0  394]
 [   0    0    0    0    0    0    0    0    0 3136]
 [   0    0    0    0    0    0    0    0    0 1383]
 [   0    0    0    0    0    0    0    0    0  507]
 [   0    0    0    0    0    0    0    0    0    1]
 [   0    0    0    0    0    0    0    0    0 1261]
 [   0    0    0    0    0    0    0    0    0    0]
 [   0    0    0    0    0    0    0    0    0 1114]
 [   0    0    0    0    0    0    0    0    0    1]
 [   0    0    0    0    0    0    0    0    0 1261]
 [   0    0    0    0    0    0    0    0    0  753]]

根据Keras文档(Keras):

  

texts_to_sequences(文本)

     

参数:文本:转换为序列的文本列表。

     

返回:列表   序列(每个文本输入一个)。

是否不应该将每个单词编码为相应的数字?如果文本短于50到50,则填充文本? 错误在哪里?

6 个答案:

答案 0 :(得分:1)

您应该尝试这样拨打电话:

sequences = tokenizer.texts_to_sequences(["physics is nice"])

答案 1 :(得分:0)

错误是您填充序列的地方。 maxlen的值应为所需的最大令牌数,例如50.因此,将行更改为:

maxlen = 50
data = pad_sequences(sequences, maxlen=maxlen)
sequences = tokenizer.texts_to_sequences("physics is nice ")
text = pad_sequences(sequences, maxlen=maxlen)

这会将序列切割为50个令牌,并用零填充较短的令牌。请注意padding选项。默认值为pre,这意味着如果句子短于maxlen,则填充序列将从零开始填充。如果希望零在序列的末尾添加到pad_sequences选项padding='post'

答案 2 :(得分:0)

我想你应该这样打:

sequences = tokenizer.texts_to_sequences(["physics is nice "])

答案 3 :(得分:0)

使用时,请按相同的长度填充序列,即您的情况下为num_words = vocabulary_size,这就是为什么要获得输出的原因, 只需尝试:tokenizer.texts_to_sequences,这将为您提供单词序列。 阅读有关填充的更多信息,它仅用于匹配数据的每一行,而胰岛则需要2句话。 句子1和句子2 sentanec1的长度为5,而句子2的长度为8。 现在,如果我们不将句子1填充3,则确实将数据发送给训练时,就无法执行批量Wiese训练。 希望对您有帮助

答案 4 :(得分:0)

您应该这样调用方法:

new_sample = ['A new sample to be classified']
seq = tokenizer.texts_to_sequences(new_sample )
padded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)
pred = model.predict(padded)

答案 5 :(得分:0)

您可以像下面那样传递以获取输出。

twt = ['He is a lazy person.']
twt = tokenizer.texts_to_sequences(twt)
print (twt)

twt = tokenizer.texts_to_sequences(['He is a lazy person.'])
print (twt)
相关问题