在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上拆分,它将不会给出正确的结果。