用word2vec用相似性替换随机词

时间:2019-04-29 11:04:33

标签: python-3.x word2vec

我想用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模型中没有的单词。

1 个答案:

答案 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表示通常情况-也许将来可以接受一个参数以请求多个替换。)