2016-11-20 53 views
1

我有一个包含品牌名称(可口可乐,百事可乐,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?我需要使用不同的算法吗?或者,也许为此测试指定不同的参数?我想添加一个包含我找到的所有'新'单词的词典,添加它们,然后我可以对每个单词进行比较,但后来我失去了脚本的粒度。

+1

对于错别字,会[levenshtein距离](https://en.wikipedia.org/wiki/Levenshtein_distance)工作吗? – Aufziehvogel

+0

也许“低=好”?无论如何,我个人更喜欢使用Levenshtein距离进行拼写检查。例如,“misplaed”与“misplaced”的LD是“2”。按照字长划分,它是2/9,这是“非常接近”。 – usr2564301

+0

在'NGRAM'中,您希望得分接近1,这意味着这些字符串是相同的。 我总的来说,你认为最好运行NGRAM算法,如果它没有找到任何匹配来尝试运行levenshtein距离或在这种情况下使用levenshtein距离? –

回答

1

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

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

  • 是否应将它们按正确的拼写进行分组,因此{'coka-cola': 3}?在这种情况下,你需要一个好的拼写纠正器。这里有几个选项,你可以看看autocorrect包,或者更多涉及的解决方案,NLTK包。另一个选择是使用Google。我认为Google没有支持API来拼写更正,因此在向Google发出请求时,您需要做一些调查以获得建议的结果。

+0

该算法的最终结果应该是所有的文本都被类似地分组在一起,例如:[[''coka-cola':2},{''coca-coca':1}]'因为第一个和第二个字符串是相似的,第三个不太相似。这有意义吗? –

+0

目前尚不清楚为什么你认为'可卡可乐'和'可乐可乐'最相似,而不是'可口可乐'。例如,如果您使用编辑距离,它们将全部为最多两次编辑,这是一个非常低的编辑阈值。 – yelsayed