与gensim word2vec匹配的句子:手动填充的模型不起作用
Sentence matching with gensim word2vec: manually populated model doesn't work
我正在尝试使用总结词向量并比较结果的朴素方法来解决句子比较问题。我的目标是根据兴趣匹配人,因此数据集由名称和描述他们爱好的短句组成。批次很小,只有几百人,所以我想在深入研究 doc2vec 之前试一试。
我通过彻底清理数据、删除停用词、标记化和词形还原来准备数据。我对词向量使用预训练模型,在为某些测试词找到相似性时,returns 得到了足够的结果。还尝试总结句子中的单词以找到原始模型中的相似之处 - 匹配确实有意义。相似之处在于该短语的一般含义。
对于句子匹配,我正在尝试以下操作:创建一个空模型
b = gs.models.Word2Vec(min_count=1, size=300, sample=0, hs=0)
根据姓名(或人员 ID)构建词汇表,无需培训
#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 打印没有显示任何聚类。查找相似性方法也无法找到匹配项(<0.2 相似性系数基本上适用于所有事物)。 [
想知道是否有人知道我哪里出错了?我的方法是否有效?
如图所示,您的代码既没有任何 train()
词向量(使用您的本地文本),也没有预加载来自其他地方的任何向量。因此,任何确实存在的向量——由 build_vocab()
调用创建——仍然只是在它们随机初始化的起始位置,并且对于任何语义目的都是无用的。
建议:
- 要么 (a) 从您的文本中训练您自己的向量,如果您有大量文本,这很有意义; (b) 从别处加载向量。但不要试图两者都做。 (或者,对于上面的代码,两者都不是。)
build_vocab()
的 update=True
选项应该被认为是一个专家级的、实验性的选项——只有当您已经在更简单的模式下工作并且您确定自己需要时才值得尝试它并理解所有的含义。
- 正常使用永远不会明确地将新值重新分配给
Word2Vec
模型的 syn0
属性 - 这些由 class 的训练例程管理,因此您永远不需要将它们归零或修改它们。你应该在你自己的数据结构中的模型之外,基于词向量来计算你自己的文本摘要向量。
我正在尝试使用总结词向量并比较结果的朴素方法来解决句子比较问题。我的目标是根据兴趣匹配人,因此数据集由名称和描述他们爱好的短句组成。批次很小,只有几百人,所以我想在深入研究 doc2vec 之前试一试。
我通过彻底清理数据、删除停用词、标记化和词形还原来准备数据。我对词向量使用预训练模型,在为某些测试词找到相似性时,returns 得到了足够的结果。还尝试总结句子中的单词以找到原始模型中的相似之处 - 匹配确实有意义。相似之处在于该短语的一般含义。
对于句子匹配,我正在尝试以下操作:创建一个空模型
b = gs.models.Word2Vec(min_count=1, size=300, sample=0, hs=0)
根据姓名(或人员 ID)构建词汇表,无需培训
#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 打印没有显示任何聚类。查找相似性方法也无法找到匹配项(<0.2 相似性系数基本上适用于所有事物)。 [
想知道是否有人知道我哪里出错了?我的方法是否有效?
如图所示,您的代码既没有任何 train()
词向量(使用您的本地文本),也没有预加载来自其他地方的任何向量。因此,任何确实存在的向量——由 build_vocab()
调用创建——仍然只是在它们随机初始化的起始位置,并且对于任何语义目的都是无用的。
建议:
- 要么 (a) 从您的文本中训练您自己的向量,如果您有大量文本,这很有意义; (b) 从别处加载向量。但不要试图两者都做。 (或者,对于上面的代码,两者都不是。)
build_vocab()
的update=True
选项应该被认为是一个专家级的、实验性的选项——只有当您已经在更简单的模式下工作并且您确定自己需要时才值得尝试它并理解所有的含义。- 正常使用永远不会明确地将新值重新分配给
Word2Vec
模型的syn0
属性 - 这些由 class 的训练例程管理,因此您永远不需要将它们归零或修改它们。你应该在你自己的数据结构中的模型之外,基于词向量来计算你自己的文本摘要向量。