1

我在 pandas 中有两列包含一系列术语,我的目标是从 B 列中找到与 A 列中的条目最匹配的条目。我使用 TF-IDF 来查找两者之间的相似性两列,但这样做的问题是它会查找单个单词的出现,并且不会优先考虑组合在一起的单词。

我如何给一起出现的单词更多的权重?

例如,“The cat sat on the mat”应该更多地与带有短语“sat on the mat”的条目匹配,而不是与带有“cat horse sat dog on lion the pig mat”的条目匹配。

4

2 回答 2

0

您想要的是文档相似性。我对此进行了大量研究,根据我的经验,Word Mover 的距离是目前性能最好的算法。

最简单的方法:

  1. 下载官方的Google 新闻嵌入
  2. 使用该方法将它们加载到Gensim 的 Word2Vec模型中load_word2vec_format
  3. 使用该wmdistance方法计算文档相似度。
于 2017-05-18T12:03:44.123 回答
0

例如,您可以在列上迭代窗口大小。
如果您希望按组进行匹配,这表明您需要注意句子中的词序。
例如,以“猫坐在垫子上”和“坐在垫子上”这两个句子为例。
构建较短句子“坐在垫子上”的窗口大小,在两列上进行迭代,并在完成迭代后将窗口大小减小 1。
您可以获得每个窗口大小的匹配项,并且可以按照您喜欢的方式将它们考虑在内。

E:如果你想将更长的匹配排名更高,你需要查找匹配最多的句子。

E2:我不确定为什么这会被否决/您需要在句子上构建元组或窗口,当单词顺序很重要时,没有其他方法可以匹配。不幸的是,我没有足够的声誉将其放在评论部分。

E3:

def find_ngrams(input_list, n):
    return zip(*[input_list[i:] for i in range(n)])

sent_a = 'the cat sat on the mat'.split()
sent_b = 'sat on the mat'.split()
nga = find_ngrams(sent_a, len(sent_b))
ngb = find_ngrams(sent_b, len(sent_b))
ct = 0
for ngramone in nga:
    for ngramtwo in ngb:
        if ngramone == ngramtwo:
            ct += 1

In [30]: ct
Out[30]: 1

如果您希望找到所有匹配项,则 find_ngrams 的参数 'n' 必须在每次迭代中减少 1,直到达到 2 的值,您已经通过 TF-IDF 匹配了单个单词。
至于如何将它们考虑在内,提供的数据太少。如果您希望将它们排名高于 TF-DF 匹配,我最好的猜测是进行查找。

我不确定这是否以任何方式包含在 pandas 库中,但匹配本身非常简单,只需几行即可完成。

于 2017-05-18T11:18:53.977 回答