拼写检查

时间:2017-12-19 22:39:59

标签: python spell-checking

有一个关于拼写检查的快速问题,但有一个扭曲。实际上,它比你的常规拼写检查器更模糊,因为它不是纠正你的单词,而是根据人们与单词的接近程度来判断你是多么正确。例如,如果一个字符串基于两个或更少或更少的字符而与另一个字符串不同,例如“你好,你好”,它将说“几乎在那里”。以下是我尝试过的下面编写的代码。

def spell_checker(correct, guess):
    if guess==correct:
        print("Correct")
    if guess!=correct:
        for g in guess:
        for f in correct:
            if g!=f:
                print("nearly there")
            else:
                print("Wrong")

显然我知道这是一个相当粗略的答案,因为它没有谈论错误的范围,但说实话,我找不到一种方法来整合一系列错误。即使我看到对nltk答案的回应,我也不知道从哪里开始。

应用“hello,hallo”示例时的答案输出如下

错误 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 错误 错误 几乎 几乎 几乎 错误 错误 几乎 几乎 几乎 几乎 几乎 错

我相信它几乎遍历每个角色,并说明一个角色是否与另一个角色相似。真的很感激任何帮助

1 个答案:

答案 0 :(得分:1)

您的代码的问题在于您将第一个单词中的每个字符与另一个单词中的每个其他字符进行比较。如果你只想比较相同位置的字符,那么非常非常简单的方法就是zip两个单词并计算不匹配的字符:

>>> a, b = "hello", "hallo"
>>> sum(x != y for x, y in zip(a, b))
1

但如果单词的长度不同,这当然会失败。此外,它不适用于缺少或多余的字符:

>>> a, b = "correct", "corect"
>>> sum(x != y for x, y in zip(a, b))
3

更好的方法是计算两个字符串之间的edit distance。如果您不想自己实施算法,可以例如使用difflib.ndiff

>>> list(difflib.ndiff(a, b))
['  c', '  o', '- r', '  r', '  e', '  c', '  t']
>>> sum(d[0] != " " for d in difflib.ndiff(a, b))
1

但请注意,这会将替换次数计算两次:一次用于删除的char,一次用于插入的char。你可以解决这个问题,例如如果您获得1后跟+或反之亦然,则不会添加-,这会留给感兴趣的读者练习。

任何方式,只计算不匹配字符的数量,如果该数字足够小,则打印"almost"

def spell_checker(correct, guess):
    if guess==correct:
        print("correct")
    elif sum(d[0] != " " for d in difflib.ndiff(correct, guess)) <= 2:
        print("almost")
    else:
        print("wrong")