我发现成功的权重主题为增加这似乎是一句比较在我的情况下工作的词矢量:是否可以使用文字嵌入搜索文本的一部分?
query1 = vectorize_query("human cat interaction")
query2 = vectorize_query("people and cats talk")
query3 = vectorize_query("monks predicted frost")
query4 = vectorize_query("man found his feline in the woods")
>>> print(1 - spatial.distance.cosine(query1, query2))
>>> 0.7154500319
>>> print(1 - spatial.distance.cosine(query1, query3))
>>> 0.415183904078
>>> print(1 - spatial.distance.cosine(query1, query4))
>>> 0.690741014142
当我以它作为噪音的句子添加额外的信息,我得到减少:
>>> query4 = vectorize_query("man found his feline in the dark woods while picking white mushrooms and watching unicorns")
>>> print(1 - spatial.distance.cosine(query1, query4))
>>> 0.618269123349
比较使用单词向量时,有什么方法可以处理额外的信息吗?当我知道文本的某些子集可以提供更好的匹配。
UPD:编辑上面的代码,使其更加清晰。
vectorize_query
在我的情况下,所谓的平滑反频率加权,当来自GloVe模型的词向量(也可以是word2vec等)加上权重a/(a+w)
,其中w应该是词频率。我使用这个词的逆tfidf得分,即w = 1/tfidf(word)
。在这种方法中,系数a
通常取1e-3。只是tfidf得分作为体重而不是那个分数给出了几乎相似的结果,我也玩过标准化等等。
但是我想在我的例子中只是使用“向量化句子”来不重载问题,因为我认为它不依赖于如何使用加权主题添加单词向量 - 问题只是当句子具有大致相同数量的含义单词时,比较效果最佳。
我知道另一种方法,当句子和文本之间的距离是使用最小成对词距离的总和或平均值计算时,例如, “奥巴马对伊利诺斯州的媒体说话”< - >“总统在芝加哥迎接新闻界”我们有dist = d(Obama, president) + d(speaks, greets) + d(media, press) + d(Chicago, Illinois).
但这种方法没有考虑到形容词可以显着改变名词的含义等 - 这是更多或较少纳入矢量模型。形容词'good','bad','nice'等词语在那里成为噪音,因为它们在两个文本中匹配并且贡献为零或低距离,因此减少了句子和文本之间的距离。
我玩了一下doc2vec模型,它似乎是gensim doc2vec实现和skip-thoughts
嵌入,但在我的情况下(匹配与更大量的文本短的查询)我有不满意的结果。
我认为你可以使用[Doc2Vec](https://radimrehurek.com/gensim/models/doc2vec.html)找出不同查询之间的相似性。 – Harman
'vectorize_query()'做了什么?为什么最后的'vectorize_query()'调用会打印0.0到1.0范围内的单个数字,而以前的调用却没有? – gojomo
@gojomo我用解释更新了这个问题 – Slowpoke