与gensim word2vec匹配的句子:手动填充的模型不起作用

时间:2017-09-12 05:00:48

标签: python nlp gensim word2vec

我正在尝试使用简单的方法来总结单词向量并比较结果来解决句子比较的问题。我的目标是按兴趣匹配人,因此数据集由描述其爱好的名称和短句组成。批次相当小,几百人,所以我想在深入研究doc2vec之前试一试。

我通过完全清理数据,删除停用词,标记化和词形化来准备数据。我使用预先训练的单词向量模型,当找到某些测试单词的相似性时返回足够的结果。还尝试总结句子单词以找到原始模型中的相似之处 - 匹配确实有意义。相似之处在于这句话的一般意义。

对于句子匹配,我正在尝试以下方法:创建一个空模型

b = gs.models.Word2Vec(min_count=1, size=300, sample=0, hs=0)

用名字(或人名)建立词汇,无需培训

#first create vocab with an empty vector
test = [['test']]
b.build_vocab(test)
b.wv.syn0[b.wv.vocab['test'].index] = b.wv.syn0[b.wv.vocab['test'].index]*0

#populate vocab from an array
b.build_vocab([personIds], update=True)

将每个句子的单词向量相加并将结果存储到模型中以获得相应的id

#sentences are pulled from pandas dataset df. 'a' is a pre-trained model i use to get vectors for each word

def summ(phrase, start_model):
    '''
    vector addition function
    '''
    #starting with a vector of 0's
    sum_vec = start_model.word_vec("cat_NOUN")*0
    for word in phrase:
        sum_vec += start_model.word_vec(word)
    return sum_vec

for i, row in df.iterrows():
    try:
        personId = row["ID"]
        summVec = summ(df.iloc[i,1],a)
        #updating syn0 for each name/id in vocabulary
        b.wv.syn0[b.wv.vocab[personId].index] = summVec
    except:
        pass

据我所知,我不应该期待这么精确,但是t-SNE打印不显示任何聚类。寻找相似性方法也未能找到匹配(基本上对于所有事物而言<&lt; 0.2相似性系数)。 []plot of the entire model[1]

想知道是否有人知道我哪里出错了?我的方法有效吗?

1 个答案:

答案 0 :(得分:0)

如图所示,您的代码既没有train()个单词向量(使用您的本地文本),也没有从其他地方预加载任何向量。因此,任何存在的向量 - 由build_vocab()调用创建 - 仍然只是在它们随机初始化的起始位置,并且对于任何语义目的都是无用的。

建议:

  • 要么(a)从你的文本中训练你自己的向量,如果你有大量的文本就有意义;或(b)从其他地方载入载体。但不要试图做到这两点。 (或者,在上面代码的情况下,都没有。)
  • update=True的{​​{1}}选项应被视为专家,实验性选项 - 如果您已经在简单模式下工作,并且您确定你需要它并理解所有的含义。
  • 正常使用无法明确地将新值重新分配到build_vocab()模型的Word2Vec属性中 - 这些属性由班级的培训例程管理,因此你永远不需要将它们归零或修改它们。您应该根据您自己的数据结构中模型外部的单词向量计算自己的文本摘要向量。