在python中自动更正列表中的单词

在python中自动更正列表中的单词,python,python-3.x,difflib,autocorrect,Python,Python 3.x,Difflib,Autocorrect,我想自动更正我的列表中的单词 假设我有一张清单 kw = ['tiger','lion','elephant','black cat','dog'] 我想看看这些词是否出现在我的句子中。如果他们拼写错误,我想纠正他们。除了清单上的单词外,我不打算碰其他单词 现在我有了str s = ["I saw a tyger","There are 2 lyons","I mispelled Kat","bulldogs"] 预期输出: ['tiger','lion',None,'dog'] impo

我想自动更正我的
列表中的单词

假设我有一张清单

kw = ['tiger','lion','elephant','black cat','dog']
我想看看这些词是否出现在我的句子中。如果他们拼写错误,我想纠正他们。除了清单上的单词外,我不打算碰其他单词

现在我有了
str

s = ["I saw a tyger","There are 2 lyons","I mispelled Kat","bulldogs"]
预期输出:

['tiger','lion',None,'dog']
import difflib

op = [difflib.get_close_matches(i,kw,cutoff=0.5) for i in s]
print(op)
[[], [], [], ['dog']]
我的努力:

['tiger','lion',None,'dog']
import difflib

op = [difflib.get_close_matches(i,kw,cutoff=0.5) for i in s]
print(op)
[[], [], [], ['dog']]
我的输出:

['tiger','lion',None,'dog']
import difflib

op = [difflib.get_close_matches(i,kw,cutoff=0.5) for i in s]
print(op)
[[], [], [], ['dog']]
上面代码的问题是我想比较整个句子,而我的
kw
列表可以有超过1个单词(最多4-5个单词)

如果我降低
截止值
值,它将开始返回不应该返回的单词

所以,即使我计划从给定的句子中创建二元图,三元图,它也会消耗很多时间

那么,有没有办法实现这一点


我已经探索了更多的库,如
自动更正
hunspell
等,但没有成功。

您可以基于
levenshtein距离
实现一些功能

值得注意的是elasticsearch的实现:

显然,比伯离海狸还有很长一段路,他们相距太远了 被认为是一个简单的拼写错误。达梅劳观察到,80%的人 拼写错误的编辑距离为1。换句话说,80%的 拼写错误只需对原文进行一次编辑即可更正 绳子

Elasticsearch支持使用指定的最大编辑距离 模糊性参数,2

当然,单个编辑对字符串的影响取决于 字符串的长度。对“帽子可以产生疯狂”一词的两次修改, 因此,允许对长度为3的字符串进行两次编辑是过分的。这个 模糊度参数可以设置为自动,其结果如下 最大编辑距离:

0表示一个或两个字符的字符串

1表示三个、四个或五个字符的字符串

2用于超过五个字符的字符串

我自己喜欢用pyxDamerauLevenshtein

pip install pyxDamerauLevenshtein
因此,您可以执行以下简单的实现:

keywords = ['tiger','lion','elephant','black cat','dog']    

from pyxdameraulevenshtein import damerau_levenshtein_distance


def correct_sentence(sentence):
    new_sentence = []
    for word in sentence.split():
        budget = 2
        n = len(word)
        if n < 3:
            budget = 0
        elif 3 <= n < 6:
            budget = 1            
        if budget:            
            for keyword in keywords:        
                if damerau_levenshtein_distance(word, keyword) <= budget:
                    new_sentence.append(keyword)
                    break
            else:
                new_sentence.append(word)
        else:
            new_sentence.append(word)        
    return " ".join(new_sentence)
keywords=[‘老虎’、‘狮子’、‘大象’、‘黑猫’、‘狗’]
从pyxdameraulevenshtein导入damerau_levenshtein_距离
def correct_句子(句子):
新句子=[]
用于句子中的单词。拆分():
预算=2
n=len(字)
如果n<3:
预算=0
elif 3这里有一种使用的方法。
SequenceMatcher
类允许您使用其
ratio
方法测量句子相似性,您只需提供合适的阈值,即可保持比率高于给定阈值的单词:

def find_similar_word(s, kw, thr=0.5):
    from difflib import SequenceMatcher
    out = []
    for i in s:
        f = False
        for j in i.split():
            for k in kw:
                if SequenceMatcher(a=j, b=k).ratio() > thr:
                    out.append(k)
                    f = True
                if f:
                    break
            if f:
                break
        else:
            out.append(None)    
    return out
输出


虽然这与您预期的输出略有不同(它是一个列表而不是字符串列表),但我认为这是朝着正确方向迈出的一步。我之所以选择这种方法,是因为你可以对每个句子进行多次更正。这就是我添加另一个示例句子的原因

import difflib
import itertools

kw = ['tiger','lion','elephant','black cat','dog']
s = ["I saw a tyger","There are 2 lyons","I mispelled Kat","bulldogs", "A tyger is different from a doog"]

op = [[difflib.get_close_matches(j,kw,cutoff=0.5) for j in i.split()] for i in s]
op = [list(itertools.chain(*o)) for o in op]

print(op)
生成的输出为:

[['tiger'], ['lion'], [], ['dog'], ['tiger', 'dog']]

诀窍是将所有句子沿空格分开。

谢谢您提供的有用信息。将检查我的真实数据的性能。我担心这会太慢。实际上,我正在为聊天机器人实现它,所以速度对我来说很重要。在我的情况下,它不起作用,因为我的
kw
列表可能包含多个单词,如果我在whitspaces上拆分,它将不会给出正确的结果。