【问题标题】:Best Algorithm to make correction typos in text在文本中纠正错别字的最佳算法
【发布时间】:2017-07-11 06:06:36
【问题描述】:

我有一个单词库列表和一个存在拼写错误(错别字)的文本,我想根据库列表将单词拼写错误纠正为正确

例如

在单词列表中:

listOfWord = [...,"halo","saya","sedangkan","semangat","cemooh"..];

这是我的字符串:

string = "haaallllllooo ssya sdngkan ceemoooh , smngat semoga menyenangkan"

我想把拼写错误改成正确的:

string = "halo saya sedangkan cemooh, semangat semoga menyenangkan"

检查列表中每个单词的最佳算法是什么,因为列表中有数百万个单词并且有很多可能性

【问题讨论】:

  • 为什么需要最好的算法?这可能是一个商业秘密并且极其复杂。您的解决方案需要多好?
  • 我只是想知道找到这个解决方案的最佳算法,我已经尝试过但花了很长时间,因为我使用了蛮力技术@PeterWood

标签: python string algorithm nlp pattern-matching


【解决方案1】:

这取决于您的数据的存储方式,但您可能希望使用Aho–Corasick 之类的模式匹配算法。当然,这假设您的输入数据结构是 Trie。 Trie 一个非常节省空间的存储容器,用于存储您可能也感兴趣的单词(同样,取决于您的环境。)

【讨论】:

    【解决方案2】:

    你可以使用difflib的get close match,虽然效率不高。

    words = ["halo","saya","sedangkan","semangat","cemooh"]
    def get_exact_words(input_str):
        exact_words = difflib.get_close_matches(input_str,words,n=1,cutoff=0.7)
        if len(exact_words)>0:
            return exact_words[0]
        else:
            return input_str
    
    string = "haaallllllooo ssya sdngkan ceemoooh , smngat semoga menyenangkan"
    string = string.split(' ')
    exact = [get_exact_words(word) for word in string]
    
    exact = ' '.join(exact)
    print(exact)
    

    输出: 与difflib

    haaallllllooo saya sealgkan cemooh , semangat semangat menyenangkan

    【讨论】:

    • 我认为有一种算法可以查找字符串堆栈,但是这个答案非常有帮助,我刚刚发现python中有一个这样的库:)
    • 这非常有效,因为您拥有大量正确词汇。也是纯python :-)
    【解决方案3】:

    我假设您正在为某种语言编写拼写检查器。

    您可能希望将句子标记为单词。

    然后将haaallllllooo 之类的单词缩短为haalloo。假设您所使用的语言中没有太多重复字母的单词。因为你有字典,所以很容易检查。

    那么你可以使用这个algorithm/implementation by Peter Norvig。您所要做的就是用您的字典替换他的正确单词字典。

    【讨论】:

    • 它仍然无法将 haalloo 更正为 halo,因为 Peter Norvig 的拼写检查器是硬编码的,只能查找 LD
    【解决方案4】:

    您可以使用散列技术来检查正确的模式,就像Rabin Karp Algorithm. 那样

    您知道列表中原始字符串的哈希值是多少。对于拼写更正,您可以在将它们与字典中存在的原始字符串匹配之前尝试组合那些给您相同哈希值的单词。无论如何,这将需要仅对拼写错误列表中的所有字符进行一次迭代。但这将是有效的。

    【讨论】:

      【解决方案5】:

      您可以使用 pyenchant 来检查您的单词列表的拼写。

      >>> import enchant
      >>> d = enchant.request_pwl_dict("mywords.txt")
      >>> d.check('helo')
      False
      >>> d.suggest("Helo")
      ['He lo', 'He-lo', 'Hello', 'Helot', 'Help', 'Halo', 'Hell', 'Held', 'Helm', 'Hero', "He'll"]
      

      您需要拆分您的单词并逐个检查,如果它是错误的,请选择第一个建议替换。 这里的教程中有更多高级功能。 http://pyenchant.readthedocs.io/en/latest/tutorial.html

      【讨论】:

      【解决方案6】:

      我认为你应该用一个词来应用字符串距离算法来找到最近的。您可以应用these 算法来查找最近的单词。这些主要是 O(n) 算法,所以最后你的句子替换最多会花费你 O(n)。

      【讨论】:

        猜你喜欢
        • 2020-03-13
        • 2017-05-10
        • 1970-01-01
        • 2021-09-24
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        相关资源
        最近更新 更多