【发布时间】: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