我在 pandas 中有两列包含一系列术语,我的目标是从 B 列中找到与 A 列中的条目最匹配的条目。我使用 TF-IDF 来查找两者之间的相似性两列,但这样做的问题是它会查找单个单词的出现,并且不会优先考虑组合在一起的单词。
我如何给一起出现的单词更多的权重?
例如,“The cat sat on the mat”应该更多地与带有短语“sat on the mat”的条目匹配,而不是与带有“cat horse sat dog on lion the pig mat”的条目匹配。
我在 pandas 中有两列包含一系列术语,我的目标是从 B 列中找到与 A 列中的条目最匹配的条目。我使用 TF-IDF 来查找两者之间的相似性两列,但这样做的问题是它会查找单个单词的出现,并且不会优先考虑组合在一起的单词。
我如何给一起出现的单词更多的权重?
例如,“The cat sat on the mat”应该更多地与带有短语“sat on the mat”的条目匹配,而不是与带有“cat horse sat dog on lion the pig mat”的条目匹配。
您想要的是文档相似性。我对此进行了大量研究,根据我的经验,Word Mover 的距离是目前性能最好的算法。
最简单的方法:
load_word2vec_format
。wmdistance
方法计算文档相似度。例如,您可以在列上迭代窗口大小。
如果您希望按组进行匹配,这表明您需要注意句子中的词序。
例如,以“猫坐在垫子上”和“坐在垫子上”这两个句子为例。
构建较短句子“坐在垫子上”的窗口大小,在两列上进行迭代,并在完成迭代后将窗口大小减小 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 库中,但匹配本身非常简单,只需几行即可完成。