【发布时间】:2018-03-11 06:55:58
【问题描述】:
我试图使用 nltk.metrics.distance 中内置的 Jaccard 距离度量函数 jaccard_distance() 完成 NLP 分配,但我注意到它的结果在我期望的上下文中没有意义。
当我检查 online source 中 jaccard_distance() 的实现时,我注意到它与 Jaccard 索引的 mathematical definition 不一致。
具体来说,nltk中的实现是:
return (len(label1.union(label2)) - len(label1.intersection(label2)))/len(label1.union(label2))
但根据定义,分子项应该只涉及两个集合的交集,这意味着正确的实现应该是:
return len(label1.intersection(label2))/len(label1.union(label2))
当我使用后者编写自己的函数时,我确实得到了正确答案。例如,我的任务是为拼写错误的单词 cormulent 推荐一个正确的拼写建议,该建议来自一个综合的单词语料库(内置于nltk),对单词的三元组使用 Jaccard 距离。
当我使用来自nltk 的jaccard_distance() 时,我反而获得了如此多的完美匹配(距离函数的结果是1.0),这远非正确。
当我使用我自己的函数进行后一种实现时,我能够在与 cormulent 的 Jaccard 距离为 0.4 处获得 corpulent 的拼写推荐,这是一个不错的推荐.
jaccard_distance() 在nltk 中会不会有错误?
【问题讨论】:
-
感谢大家的帮助!我现在也理解了
jaccard_distance()的nltk实现中的分子项,它来自执行 1 - Jaccard Similarity。
标签: python nlp nltk distance metric