Python 比较字符串以匹配品牌名称并删除拼写错误

Python 比较字符串以匹配品牌名称并删除拼写错误,python,string-comparison,spell-checking,spelling,Python,String Comparison,Spell Checking,Spelling,我有一个包含品牌名称的文本列表(可口可乐、百事可乐、7Up等)。我编写了一个python脚本,对具有相同内容的所有单元格(完全相同的文本,在小写所有文本之后)进行排序和计数,并根据每个文本的计数对列表进行重新排序,以便显示最多的文本将排在第一位,因为我假设大多数人都会正确地书写品牌名称。 例如,如果我有以下列表: texts = ['Coca-Cola', 'Pepsi', 'Coca-Cola', 'Coca-Cola', 'Pepsi', 'Pespi', 'Pepsi', '7Up', '

我有一个包含品牌名称的文本列表(可口可乐、百事可乐、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},
]  
0.2727272727272727
在第二步中,我将使用该软件包尝试匹配更接近的文本,以纠正拼写错误。 重要提示:我的一个关键要求是提供一个与语言无关的解决方案

我的问题是NGRAM在长文本上运行得很好,但在短文本上运行得很差。例如,在运行时:

ngram.NGram.compare('Pepsi', 'Pespi')
结果将是:

ordered_text = [
   {'text': 'Pepsi', count: 4},
   {'text': 'Coca-Cola', count: 3},
   {'text': '7Up', count: 2},
   {'text': 'Cola', count: 1},
   {'text': 'Pespi', count: 1},
]  
0.2727272727272727
这是一个非常低的“分数”,但正如您所看到的,字符串非常接近,只有一个字母放错了位置


我能做些什么来改善我的不信任?我需要使用不同的算法吗?或者为该测试指定不同的参数?我想添加一本包含我发现的所有“新”单词的词典,添加它们,然后我可以将每个单词与之进行比较,但随后我就失去了脚本的粒度。

从您的问题来看,如果您想检查输入的拼写是否正确,或者只想对它们进行分组,这并不明显。例如,如果您的输入看起来像
['coka-cola','coak-cola','coak-cola','coca-coca']
,那么您的算法应该做什么

  • 它是否应该将它们全部归为
    {'coka-cola':3}
    ?是否总是将输入值与第一次出现的值进行比较?在这种情况下,编辑距离是有意义的,您可以很容易地找到许多用于此目的的python实现

  • 它是否应该根据正确的拼写对它们进行分组,以便
    {'coka-cola':3}
    ?在这种情况下,你需要一个好的拼写更正。这里有几个选项,您可以查看包,或者更复杂的解决方案,包。另一个选择是使用谷歌。我认为Google没有支持拼写正确的API,所以在向Google发出请求时,您必须进行一些刮取以获得建议的结果


对于拼写错误,是否可行?也许“低=好”?无论如何,就我个人而言,我更喜欢使用Levenshtein距离进行拼写检查。例如,“拼错”与“放错”的LD为
2
。除以单词长度,它是2/9,相当接近。在“NGRAM”中,你希望分数接近1,这意味着字符串是相同的。一般来说,你认为最好运行NGRAM算法,如果它没有找到任何匹配项,那么就尝试运行levenshtein距离,或者在这种情况下只使用levenshtein距离?算法的最终结果应该是所有类似地分组在一起的文本,在你的例子中:
[{'coka-cola':2},{'coca-coca':1}]
因为第一个和第二个字符串相似,而第三个字符串不太相似。这有意义吗?不清楚为什么你认为“可口可乐”和“可口可乐”彼此最相似,而不是“可口可乐”。例如,如果使用“编辑距离”,则它们彼此之间最多只能进行两次编辑,这是一个非常低的编辑阈值。