带twis的拼写检查器

2024-04-16 20:41:07 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个快速的问题,关于拼写检查,但有一个扭曲。实际上,它比你的常规拼写检查更模糊,因为它不是纠正你的单词,而是根据你与单词的接近程度来判断你的正确程度。例如,如果一个字符串与另一个基于两个或更少字符的字符串不同,例如“hello and hallo”,它将声明“neary there”。下面是我尝试编写的代码。你知道吗

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")

显然,我意识到这是一个相当粗糙的答案,因为它没有谈到错误的范围,但老实说,我找不到一种方法,把错误的范围纳入word。即使当我看到对nltk答案的回应时,我也不知道从何说起。你知道吗

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

错 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 错 错 几乎 几乎 几乎 错 错 几乎 几乎 几乎 几乎 几乎 错

我相信它几乎贯穿每一个字符,并说明是否一个字符是相似的另一个。如果你能帮上忙我会很感激的


Tags: 字符串答案inhelloforif错误字符
1条回答
网友
1楼 · 发布于 2024-04-16 20:41:07

代码的问题是,您将第一个单词中的每个字符与另一个单词中的每个字符进行比较。如果只想比较同一位置的字符,一种非常简单的方法是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。如果不想自己实现算法,可以使用^{}

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

但是,请注意,这将计算两次替换:一次用于删除的字符,一次用于插入的字符。你可以通过不加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")

相关问题 更多 >