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 个字母放错了位置。

我可以做些什么来改善我的欲望?我需要使用不同的算法吗?或者也许为此测试指定不同的参数?我考虑过添加一个字典,其中包含我找到的所有“新”单词,添加它们,然后我可以将每个单词与之进行比较,但是我失去了脚本的粒度。

4

1 回答 1

1

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

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

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

于 2016-11-20T11:27:59.583 回答