2017-10-11 59 views
1

我发现成功的权重主题为增加这似乎是一句比较在我的情况下工作的词矢量:是否可以使用文字嵌入搜索文本的一部分?

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嵌入,但在我的情况下(匹配与更大量的文本短的查询)我有不满意的结果。

+0

我认为你可以使用[Doc2Vec](https://radimrehurek.com/gensim/models/doc2vec.html)找出不同查询之间的相似性。 – Harman

+0

'vectorize_query()'做了什么?为什么最后的'vectorize_query()'调用会打印0.0到1.0范围内的单个数字,而以前的调用却没有? – gojomo

+0

@gojomo我用解释更新了这个问题 – Slowpoke

回答

1

如果您有兴趣在词类中引发相似性(例如,只对名词和名词短语感兴趣并且忽略形容词),您可能需要查看sense2vec,它将词类合并到模型中。 https://explosion.ai/blog/sense2vec-with-spacy ...之后,您可以在所有术语中执行点积的同时对单词类进行加权,从而有效地减少您认为的“噪音”。

+0

sense2vec看起来像是弃用软件。任何类似的积极举措? – user1712447

1

不清楚你的原始结果,当添加一堆单词时相似性降低,一般来说是“不好的”。一个更多的句子是一个非常不同的句子!

如果这个结果对于你的目的是特别糟糕的 - 你需要一个模型来捕获一个句子是否说“同一个,然后更多”,你需要找到/发明一些其他的技巧。特别是,你可能需要一个非对称的“含有类似”的措施 - 这样较长的句子仍然与较短的句子匹配得很好,但是不是,反之亦然。

该真实由字矢量供给将可能有很难与单字逆转-的-含义,例如任何浅,非语法敏感嵌入之间的差:

After all considerations, including the relevant measures of economic, cultural, and foreign-policy progress, historians should conclude that Nixon was one of the very *worst* Presidents

After all considerations, including the relevant measures of economic, cultural, and foreign-policy progress, historians should conclude that Nixon was one of the very *best* Presidents

“最差”和“最好”这两个词已经非常相似了,因为它们具有相同的功能性,并且出现在相同的上下文中,并且可能只是在完整维空间。然后他们的影响可能会在所有其他词汇的影响下淹没。只有更复杂的分析才能突出其作用,即扭转句子的整体输入。

尽管它还不是gensim中的一个选项,但在完成所有简单的成对意义测量后,还有其他方法可用于计算“字移动器的距离”,报告无法比拟的“余数”。虽然我不知道任何先前的分析或代码能够满足您的需求,或证明其价值,但我有一种预测,这种分析可能有助于更好地发现“相同或更多”,或“说大多数都是一样的,但是在几个字/方面有逆转“。

+0

非常感谢您的回答!希望我不需要像你的例子那样精确。我正在搜索由某些人编写的文本信息,以便了解谁在这个主题中更有能力提供了一句话查询。这就是为什么我想找到一种方式来与整个大量文本中的一部分进行比较,这是最接近的可能匹配,对于查询可以由多个含义部分组成的帐户来说,例如, “建立核融合器需要物理学,而且在卷绕卷轴和烙铁方面也有很好的技巧”。 – Slowpoke

+0

仅仅搜索关键字被证明效率低下,特别是对于那些与他们有很多关联的文本的人。在你的例子中,我可以得出结论,源语与尼克松是“熟悉的”,以某种方式很好地满足查询(经济,文化,包括历史学家)。 – Slowpoke

+0

你也可以把它当作一种搜索深度隐藏剽窃的方法。 – Slowpoke

相关问题