我有一个包含品牌名称(可口可乐,百事可乐,7Up等)的文本列表。我编写了一个python脚本,对所有内容相同的单元格进行排序和计数(完全相同的文本,小写全部文本后),并按每个文本的计数对列表重新排序,以使出现最多的文本为首位,因为我认为大多数人会正确地写出品牌名称。 例如,如果我有以下列表:比较字符串以匹配品牌名称并删除拼写错误
texts = ['Coca-Cola', 'Pepsi', 'Coca-Cola', 'Coca-Cola', 'Pepsi', 'Pespi', 'Pepsi', '7Up', '7up', 'Cola', 'Pepsi']
的第一步后,名单将是:
ordered_text = [
{'text': 'Pepsi', count: 4},
{'text': 'Coca-Cola', count: 3},
{'text': '7Up', count: 2},
{'text': 'Cola', count: 1},
{'text': 'Pespi', count: 1},
]
在第二步中,我使用的是ngram包,试图接近匹配文本来纠正拼写错误。 重要说明:我的关键要求之一是要有一个与语言无关的解决方案。
我的问题是NGRAM在长文本上效果很好,但在短文本上表现不佳。例如在运行时:
ngram.NGram.compare('Pepsi', 'Pespi')
的结果将是:
0.2727272727272727
这是一个非常低的“得分”,但你可以看到字符串是真的很近,并且只有1一封信是错位的。
我能做些什么来改善我的relust?我需要使用不同的算法吗?或者,也许为此测试指定不同的参数?我想添加一个包含我找到的所有'新'单词的词典,添加它们,然后我可以对每个单词进行比较,但后来我失去了脚本的粒度。
对于错别字,会[levenshtein距离](https://en.wikipedia.org/wiki/Levenshtein_distance)工作吗? – Aufziehvogel
也许“低=好”?无论如何,我个人更喜欢使用Levenshtein距离进行拼写检查。例如,“misplaed”与“misplaced”的LD是“2”。按照字长划分,它是2/9,这是“非常接近”。 – usr2564301
在'NGRAM'中,您希望得分接近1,这意味着这些字符串是相同的。 我总的来说,你认为最好运行NGRAM算法,如果它没有找到任何匹配来尝试运行levenshtein距离或在这种情况下使用levenshtein距离? –