我有一个包含品牌名称的文本列表(可口可乐,百事可乐,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
这是一个非常低的'得分',但你可以看到字符串非常接近,只有一个字母错位。
为了改善我的嗜好,我该怎么办?我需要使用不同的算法吗?或者可以为此测试指定不同的参数?我想添加一个字典,其中包含我找到的所有“新”单词,添加它们,然后我可以将每个单词与它进行比较,但后来我失去了脚本的粒度。
答案 0 :(得分:1)
如果您想拼写检查输入的正确性,或者您只是想对它们进行分组,那么您的问题并不明显。例如,如果您的输入看起来像['coka-cola', 'coak-cola', 'coca-coca']
,您的算法应该做什么?
它应该将它们全部归为{'coka-cola': 3}
吗?意义总是将输入与第一次出现进行比较?在这种情况下,编辑距离是有意义的,你可以很容易地找到许多python实现。
是否应该按照正确的拼写对它们进行分组,{'coka-cola': 3}
?在这种情况下,你需要一个好的拼写纠正器。这里有几个选项,您可以查看autocorrect包,或者更复杂的解决方案NLTK包。另一种选择是使用谷歌。我不认为Google支持的API支持拼写错误,因此您在向Google发出请求时必须进行一些抓取以获取建议的结果。