【问题标题】:Compare string to match brand name and remove spelling mistakes比较字符串以匹配品牌名称并消除拼写错误
【发布时间】:2017-04-03 20:22:27
【问题描述】:

我有一个包含品牌名称(可口可乐、百事可乐、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 个字母放错了位置。

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

【问题讨论】:

  • 对于拼写错误,levenshtein distance 是否有效?
  • 也许“低=好”?无论如何,我个人更喜欢使用 Levenshtein 距离进行拼写检查。例如,“missplaed”与“misplaced”的 LD 是2。除以字长,是2/9,“非常接近”。
  • 在“NGRAM”中,您希望分数接近 1,这意味着字符串是相同的。我一般,您认为最好运行 NGRAM 算法,如果它没有找到任何匹配项来尝试运行 levenshtein 距离,或者在这种情况下只使用 levenshtein 距离?

标签: python string-comparison spell-checking spelling


【解决方案1】:

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

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

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

【讨论】:

  • 算法的最终结果应该是所有相似地组合在一起的文本,例如:[{'coka-cola': 2}, {''coca-coca': 1}],因为第一个和第二个字符串相似,而第三个字符串不太相似。这有意义吗?
  • 不清楚为什么你认为'coka-cola'和'coak-cola'比'coca-coca'更相似。例如,如果您使用编辑距离,它们将彼此最多进行两次编辑,这是一个非常低的编辑阈值。
猜你喜欢
  • 1970-01-01
  • 2016-07-07
  • 2021-03-08
  • 1970-01-01
  • 2012-08-29
  • 2015-07-31
  • 2022-03-30
  • 2020-12-06
  • 2021-12-20
相关资源
最近更新 更多