拼写检查器
spell checker with a twist
有一个关于拼写检查器的快速问题,但有点曲折。实际上,它比您的常规拼写检查器更模糊,因为它不是纠正您的单词,而是根据单词的接近程度来判断您的正确程度。例如,如果一个字符串与另一个基于两个字符或更少或更少的字符不同,例如"hello and hallo",它将显示 "nearly 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")
显然我意识到这是一个相当粗略的答案,因为它没有谈论错误的范围,但老实说,我找不到将错误范围合并到单词中的方法。连看nltk的回答都不知道从何下手
应用"hello, hallo"示例时的答案输出如下
错误
几乎
几乎
几乎
几乎
几乎
几乎
几乎
几乎
几乎
几乎
几乎
错误的
错误的
几乎
几乎
几乎
错误的
错误的
几乎
几乎
几乎
几乎
几乎
错
我相信它几乎遍历了每个字符并说明一个字符是否与另一个字符相似。非常感谢对此的任何帮助
您的代码存在的问题是您将第一个单词中的 每个 个字符与另一个单词中的 每个其他 个字符进行比较。如果你只想比较相同位置的字符,一个非常非常的简单方法是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 between the two strings. If you do not want to implement the algorithm yourself, you could e.g. use 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
但是请注意,这会将替换计数两次:一次用于删除的字符,一次用于插入的字符。你可以通过例如解决这个问题如果得到 +
后跟 -
则不添加 1
,反之亦然,这留给感兴趣的 reader 作为练习。
无论如何,只需计算不匹配字符的数量,如果该数字足够小则打印 "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")
有一个关于拼写检查器的快速问题,但有点曲折。实际上,它比您的常规拼写检查器更模糊,因为它不是纠正您的单词,而是根据单词的接近程度来判断您的正确程度。例如,如果一个字符串与另一个基于两个字符或更少或更少的字符不同,例如"hello and hallo",它将显示 "nearly 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")
显然我意识到这是一个相当粗略的答案,因为它没有谈论错误的范围,但老实说,我找不到将错误范围合并到单词中的方法。连看nltk的回答都不知道从何下手
应用"hello, hallo"示例时的答案输出如下
错误 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 几乎 错误的 错误的 几乎 几乎 几乎 错误的 错误的 几乎 几乎 几乎 几乎 几乎 错
我相信它几乎遍历了每个字符并说明一个字符是否与另一个字符相似。非常感谢对此的任何帮助
您的代码存在的问题是您将第一个单词中的 每个 个字符与另一个单词中的 每个其他 个字符进行比较。如果你只想比较相同位置的字符,一个非常非常的简单方法是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 between the two strings. If you do not want to implement the algorithm yourself, you could e.g. use 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
但是请注意,这会将替换计数两次:一次用于删除的字符,一次用于插入的字符。你可以通过例如解决这个问题如果得到 +
后跟 -
则不添加 1
,反之亦然,这留给感兴趣的 reader 作为练习。
无论如何,只需计算不匹配字符的数量,如果该数字足够小则打印 "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")