【发布时间】:2018-07-04 01:52:18
【问题描述】:
我目前正在使用 Keras Tokenizer 创建一个词索引,然后将该词索引与导入的 GloVe 字典匹配以创建一个嵌入矩阵。但是,我遇到的问题是,这似乎破坏了使用词向量嵌入的优势之一,因为当使用训练模型进行预测时,如果它遇到一个不在标记器的词索引中的新词,它会将其从序列中删除.
#fit the tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
word_index = tokenizer.word_index
#load glove embedding into a dict
embeddings_index = {}
dims = 100
glove_data = 'glove.6B.'+str(dims)+'d.txt'
f = open(glove_data)
for line in f:
values = line.split()
word = values[0]
value = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = value
f.close()
#create embedding matrix
embedding_matrix = np.zeros((len(word_index) + 1, dims))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector[:dims]
#Embedding layer:
embedding_layer = Embedding(embedding_matrix.shape[0],
embedding_matrix.shape[1],
weights=[embedding_matrix],
input_length=12)
#then to make a prediction
sequence = tokenizer.texts_to_sequences(["Test sentence"])
model.predict(sequence)
那么有没有办法我仍然可以使用标记器将句子转换为数组,并且仍然尽可能多地使用 GloVe 字典中的单词,而不仅仅是训练文本中出现的单词?
编辑:经过进一步考虑,我想一种选择是向标记器适合的文本添加一个或多个文本,其中包括手套字典中的键列表。虽然如果我想使用 tf-idf 可能会弄乱一些统计数据。是否有更好的方法或其他更好的方法?
【问题讨论】:
-
这是基于词的分词的常见问题。一种方法是忽略这些词,因为它正在发生。有时,一个更可取的选择是有一个表示“看不见的词”的标记。此外,还有一些方法可以说明如何从已见词中组合未见词的嵌入(查看“词汇外嵌入”)。最后,有些人使用字符 n-gram 的嵌入而不是词嵌入来实际解决该问题(尤其是在诸如 Twitter 等具有大量且不断变化的词汇表的场景中)。
-
嗨@JARS,您能否提供一些链接或示例,说明您所说的“最后,有些人使用嵌入字符n-gram...”?我没有发现任何更清楚的信息可以提供帮助。
标签: python machine-learning nlp deep-learning keras