微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对任意文本之间的单词相似度进行评分

如何解决对任意文本之间的单词相似度进行评分

我有一个包含 500 多个非常重要但任意的字符串的列表。它们看起来像:

list_important_codes = ['xido9','uaid3','frps09','ggix21']

我所知道的 *大小写并不重要,但所有其他字符必须完全匹配。 *每个字符串以 4 个字母字符开头,以一或两个数字字符结尾。 *我有一个包含大约 100,000 个字符串的列表,list_recorded_codes 是手动输入的,应该与 list_important_codes 完全匹配,但其中大约 10,000 个不匹配。因为这些字符串是手动输入的,所以错误的字符串通常只有大约 1 个字符。 (错误例如:*增加了空格,*换了两个字母,*有“01”而不是“1”等)

我需要做什么 我需要遍历 list_recorded_codes 并在 list_important_codes 中找到它们的所有完美匹配。

我的尝试 我花了大约 10 个小时试图手动编写一种方法来修复每个单词,但这似乎不切实际且非常乏味。更不用说,当我的列表在以后增加一倍时,我将不得不再次手动执行该过程。

我认为我需要的解决方案以及预期的输出

我希望 Python 的 NLTK 可以有效地对这些任意术语进行“评分”以找到“最佳分数”。例如,如果所讨论的单词是 inputword = "gdix88",并且该单词与 score(inputword,"gdox89")=.84score(inputword,"sudh88")=.21 进行比较。我的预期输出highscore=.84,highscoreword='gdox89'

for manually_entered_text in ['xido9','frp09','ggix21']:
--get_highest_score_from_important_words()  #returns word_with_highest_score
--manually_entered_text = word_with_highest_score

如果需要,我也愿意使用一组不同的工具来解决这个问题。而且,越简单越好!谢谢!

解决方法

您要查找的“分数”称为编辑距离。有很多可用的文献和算法 - 很容易找到,但只有在您知道正确的术语之后:)

查看相应的 wikipedia article

nltk 包提供了所谓的 Levenshtein 编辑距离的实现:

from nltk.metrics.distance import edit_distance

if __name__ == '__main__':
    print(edit_distance("xido9","xido9 "))
    print(edit_distance("xido9","xido8"))
    print(edit_distance("xido9","xido9xxx"))
    print(edit_distance("xido9","xido9"))

在这种情况下,结果是 1、1、3 和 0。

这里是对应 nltk module

的文档

考虑到各种打字错误的频率,该分数有更专业的版本(例如,“e”而不是“r”可能会经常出现,因为在 qwert 键盘上按键彼此相邻)。

但如果我开始,经典的 Levenshtein 会是。

,

您可以对这个问题应用动态规划方法。获得评分矩阵、alignment_matrix 以及局部和全局对齐函数后,您可以遍历 list_important_codes 并在 list_recorded_codes 中找到得分最高的对齐。这是我为 DNA 序列比对所做的一个项目:DNA alignment。您可以轻松地使其适应您的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。