我想用word2vec中最相似的词替换句子中的随机词,例如句子question = 'Can I specify which GPU to use?'
中的词。
我使用此递归方法是因为通过split函数,word2vecmodel中不包含某些单词(例如to
):
import gensim.models.keyedvectors as word2vec
import random as rd
model = word2vec.KeyedVectors.load_word2vec_format('/Users/nbeau/Desktop/Word2vec/model/GoogleNews-vectors-negative300.bin', binary=True)
def similar_word(sentence, size):
pos_to_replace = rd.randint(0, size-1)
try:
similarity = model.most_similar(positive = [sentence[pos_to_replace]])
similarity = similarity[0][0]
except KeyError:
similarity, pos_to_replace = test(sentence, size)
return similarity, pos_to_replace
return similarity, pos_to_replace
question = question.split()
size = len(question)
similarity, pos_to_replace = similar_word(question, size)
sentence[pos_to_replace] = similarity
我想知道是否有更好的方法来避免word2vec模型中没有的单词。
答案 0 :(得分:1)
一些想法:
如果kv_model
是您的KeyedVectors
模型,则可以执行'to' in kv_model
来测试单词是否存在,而不是先尝试然后抓住KeyError
。但是乐观和捕捉错误也是常见的习惯用法!
您的递归不一定会退出:如果提供的文本不包含任何已知单词,它将不断进行递归尝试(或达到某些调用深度实现限制时)。另外,它可能会多次尝试相同的单词。
我建议使用循环而不是递归,并建议使用Python的random.shuffle()
方法创建所有潜在索引的单个随机排列。然后,依次尝试每一个,如果可以更换,则尽快返回,如果无法更换,则指示失败。
保持相同方法的返回签名:
def similar_word(sentence):
indexes = range(len(sentence))
random.shuffle(indexes)
for i in indexes:
if sentence[i] in kv_model:
return model.most_similar(sentence[i], topn=1)[0][0], i
return None, -1 # no replacement was possible
(但与您的问题不同:如果在100%的时间内,该函数的结果用于执行替换,则只需将替换移入函数内部,使传入的sentence
发生变化该函数可以报告它进行了多少次替换:0
表示失败,1
表示通常情况-也许将来可以接受一个参数以请求多个替换。)