Nic*_*ade 14 python nlp machine-learning deep-learning keras
我目前正在使用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)
Run Code Online (Sandbox Code Playgroud)
那么有没有一种方法我仍然可以使用标记生成器将句子转换为数组,并且仍然使用尽可能多的单词GloVe字典,而不仅仅是那些出现在我的训练文本中的单词?
编辑:经过进一步思考,我想一个选项是在令牌器适合的文本中添加一个或多个文本,其中包括手套词典中的键列表.如果我想使用tf-idf,那可能会弄乱一些统计数据.有没有更好的方法来做这个或更好的方法?
ton*_*ian 10
在Keras Tokenizer 中,您有oov_token参数。只需选择您的标记,未知单词就会有那个标记。
tokenizer_a = Tokenizer(oov_token=1)
tokenizer_b = Tokenizer()
tokenizer_a.fit_on_texts(["Hello world"])
tokenizer_b.fit_on_texts(["Hello world"])
Run Code Online (Sandbox Code Playgroud)
输出
In [26]: tokenizer_a.texts_to_sequences(["Hello cruel world"])
Out[26]: [[2, 1, 3]]
In [27]: tokenizer_b.texts_to_sequences(["Hello cruel world"])
Out[27]: [[1, 2]]
Run Code Online (Sandbox Code Playgroud)
我会尝试不同的方法。主要问题是你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()
word_index = {w: i for i, w in enumerate(embeddings_index.keys(), 1)}
#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]
Run Code Online (Sandbox Code Playgroud)
现在您embedding_matrix包含所有 GloVe 作品。
要标记您的文本,您可以使用以下内容:
from keras.preprocessing.text import text_to_word_sequence
def texts_to_sequences(texts, word_index):
for text in texts:
tokens = text_to_word_sequence(text)
yield [word_index.get(w) for w in tokens if w in word_index]
sequence = texts_to_sequences(['Test sentence'], word_index)
Run Code Online (Sandbox Code Playgroud)