从 Python 中的“enchant suggest()”获取最相关的单词(拼写检查)

2024-02-24

我想从中获取最相关的单词enchant suggest()。有没有更好的方法来做到这一点。我觉得我的函数在检查 100k 或更多范围内的大量单词时效率不高。

有问题enchant suggest():



>>> import enchant
>>> d.suggest("prfomnc")
['prominence', 'performance', 'preform', 'Provence', 'preferment', 'proforma']
  

我的功能是从一组建议的单词中获取适当的单词:



import enchant, difflib

word="prfomnc"
dict,max = {},0
a = set(d.suggest(word))
for b in a:
    tmp = difflib.SequenceMatcher(None, word, b).ratio();
    dict[tmp] = b
    if tmp > max:
       max = tmp

print dict[max]

Result: performance
  

Updated:

如果我得到多个钥匙,意思是一样的difflib ratio()值,我使用多键字典。正如这里所解释的:http://code.activestate.com/recipes/440502-a-dictionary-with-multiple-values-for-each-key/ http://code.activestate.com/recipes/440502-a-dictionary-with-multiple-values-for-each-key/


恐怕没有灵丹妙药...不过有一些建议。

我猜逻辑上的大部分时间都花在了difflib 的 SequenceMatcher().ratio() 调用。这并不奇怪,因为该方法使用了Ratcliff-Obershelp 算法 http://xlinux.nist.gov/dads/HTML/ratcliffObershelp.html从 CPU 角度来看,这是相对昂贵的(但它产生的指标相当“准确”,可以找到接近的匹配项,这可能就是您喜欢它的原因)。

为了确定,您应该分析此逻辑并确认 SequenceMatcher() 确实是热点。也许 Enchant.suggest() 也有点慢,但我们在代码方面几乎无能为力来改进这一点(在配置方面,可能有一些选择,例如,取消个人字典来保存双重查找和合并等)。

假设 SequenceMatcher() 确实是罪魁祸首,并且假设您希望坚持使用 Ratcliff-Obershelp 相似性度量作为选择最佳匹配的方法,您可以执行以下操作:

  • 仅计算 Enchant 中前 (?) 5 个项目的 SequenceMatcher 比率值。
    毕竟,Enchant.suggest() 以有序的方式返回其建议,首先是最佳猜测;因此,虽然基于不同的启发法,附魔顺序也有价值,但当我们在列表中向下移动时,找到高排名匹配的机会可能会减少。此外,尽管如此,我们最终可能会忽略一些这样的高排名比赛,但通过仅测试前几个附魔建议,我们以某种方式将附魔启发式中发现的“智慧”与 Ratcliff-Obershelp 指标中的“智慧”结合起来。
  • 达到某个阈值后停止计算 SequenceMatcher 比率
    这个想法与前面的类似:一旦找到更好的可能性越来越小(并且一旦我们手头有一个不错的选择,即使不是最好的选择),也避免调用 SequenceMatcher
  • 用你自己的逻辑过滤掉Enchant中的一些单词。
    我们的想法是进行一个相对快速/便宜的测试,这可能会告诉我们给定的单词不太可能在 SequenceMatcher 比率上得分很高。例如,排除至少不具有用户字符串长度减去两个共同字符的单词。
    顺便说一句,您也许可以使用 SequenceMatcher 对象的一些 [quicker] 函数来获取一些用于过滤启发式的数据。
  • 使用 SequenceMatcher *quick_ratio*() 函数 instead
    至少在某些情况下。
  • 只将最佳匹配保留在字符串中,而不是使用字典
    显然只有最佳选择才重要,因此除了测试目的之外,您可能不需要[相对较小的]字典开销。
  • you may考虑编写您自己的 Ratcliff-Obershelp (或类似)方法,其中引入了当满足当前最大比率的可能性很小时的各种早期退出。请注意,生成一种与 difflib 的 C 语言方法一样高效的方法可能很困难,您对此感兴趣的是早期退出......

HTH,祝你好运;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Python 中的“enchant suggest()”获取最相关的单词(拼写检查) 的相关文章

随机推荐