【问题标题】:Is it possible to search for part the of text using word embeddings?是否可以使用词嵌入搜索部分文本?
【发布时间】:2017-10-11 21:02:23
【问题描述】:

我发现添加词向量的成功加权主题在我的情况下似乎适用于句子比较:

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). 但是这种方法没有考虑到形容词可以显着改变名词的含义等等 - 这是更多或更少包含在矢量模型中。形容词“好”、“坏”、“好”等词在那里成为噪音,因为它们在两个文本中匹配并且贡献为零或低距离,从而减少句子和文本之间的距离。

我玩了一下 doc2vec 模型,似乎是 gensim doc2vec 实现和 skip-thoughts 嵌入,但就我而言(将短查询与大量文本匹配)我的结果并不令人满意。

【问题讨论】:

  • 我认为您可以使用Doc2Vec 来查找不同查询之间的相似之处。
  • vectorize_query() 是做什么的?为什么最后的 vectorize_query() 调用会打印 0.0 到 1.0 范围内的单个数字,而之前的调用没有?
  • @gojomo 我用解释更新了问题
  • @Harman 我用解释更新了问题
  • 如果你对词性触发相似性感兴趣(例如只对名词和名词短语感兴趣而忽略形容词),你可能想看看 sense2vec,它将词类合并到模型中. explosion.ai/blog/sense2vec-with-spacy ...之后,您可以在对所有术语执行点积的同时对词类进行加权,从而有效地降低您认为的“噪音”。

标签: gensim word2vec word-embedding doc2vec


【解决方案1】:

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

【讨论】:

  • sense2vec 看起来像废弃软件。有没有类似的积极举措?
【解决方案2】:

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

如果该结果对您的目的特别不利 - 您需要一个模型来捕捉句子是否说“相同,然后更多”,您需要找到/发明一些其他技巧。特别是,您可能需要一种非对称的“包含相似”度量——这样较长的句子仍然可以很好地匹配较短的句子,但反之亦然。

任何由词向量提供的浅层、非语法敏感的嵌入都可能难以处理单个词的含义反转,例如:

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 中还不是一个选项,但在所有简单的成对意义测量完成后,有其他方法可以计算“Word Mover 的距离”,报告不匹配的“余数”。虽然我不知道任何先前的分析或代码可以根据您的需要充实这个想法,或者证明它的价值,但我有一种预感,这样的分析可能有助于更好地发现“说得一样多”或“说的大致相同,但在几个词/方面有逆转”。

【讨论】:

  • 非常感谢您的回答!希望我不需要像您的示例中那样精确。我正在通过某些人编写的文本信息进行搜索,以了解谁在该主题中更胜任提供了一句话查询。这就是为什么我想找到一种方法来与整个大量文本中的某个部分进行比较,这可能是最接近的匹配,考虑到查询可以包含多个含义部分,例如“要构建核聚变器,您需要物理学,还需要良好的绕线盘和烙铁技能”。
  • 仅仅搜索关键字被证明是低效的,尤其是对于那些有大量文本与之相关联的人。在您的示例中,我可能会得出结论,来源在某种程度上非常“熟悉”尼克松,这很好地满足了查询(经济、文化,包括历史学家)。
  • 您也可以将其视为一种搜索深度隐藏抄袭的方式。
  • 关键字距离的问题在于,对于拥有大量相关数据的人来说,它们总是较低,我想以某种方式保留查询主题之间的关系,然后搜索语料库。
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2020-01-13
  • 2010-10-30
  • 2020-04-10
  • 2020-12-27
相关资源
最近更新 更多