从 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()”获取最相关的单词(拼写检查) 的相关文章

  • Python 和 Numpy 是 nan 和 set

    我在使用 Python 的 Numpy set 和 NaN 非数字 时遇到了不可预测的行为 gt gt gt set np float64 nan np float64 nan set nan nan gt gt gt set np flo
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 如何删除 PyCharm 中的项目?

    如果我关闭一个项目 然后删除该项目文件夹 则在 PyCharm 重新启动后 会再次创建一个空的项目文件夹 只需按顺序执行以下步骤即可 他们假设您当前在 PyCharm 窗口中打开了该项目 单击 文件 gt 关闭项目 关闭项目 在 PyCha
  • 如何在python中附加两个字节?

    说你有b x04 and b x00 你如何将它们组合起来b x0400 使用Python 3 gt gt gt a b x04 gt gt gt b b x00 gt gt gt a b b x04 x00
  • 数据框 - 平均列

    我在 pandas 中有以下数据框 Column 1 Column 2 Column3 Column 4 2 2 2 4 1 2 2 3 我正在创建一个数据框 其中包含第 1 列和第 2 列 第 3 列和第 4 列等的平均值 ColumnA
  • 使用 Python 3 动态插入到 sqlite

    我想使用 sqlite 写入多个表 但我不想提前手动指定查询 有数十种可能的排列 例如 def insert sqlite tablename data list global dbc dbc execute insert into tab
  • 将 pandas 剪切操作转换为常规字符串

    我明白了 pandas cut 操作的输出 0 0 20 1 0 20 2 0 20 3 0 20 4 0 20 5 0 20 6 0 20 7 0 20 8 0 20 9 0 20 如何将 0 20 转换为 0 20 我正在这样做 str
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

    我有一个正在运行的 python 程序 它使用 suds 通过 SOAP 获取大量数据 Web服务是通过分页功能实现的 这样我就可以抓取nnn每个 fetch 调用的行并获取下一个nnn与后续的电话 如果我使用如下代码向 HTTP 服务器进
  • 使用 selenium 和 python 来提取 javascript 生成的 HTML?萤火虫?

    这里是Python新手 我遇到的是数据收集问题 我在这个网站上 当我用 Firebug 检查我想要的元素时 它显示了包含我需要的信息的源 然而常规源代码 没有 Firebug 不会给我这个信息 这意味着我也无法通过正常的 selenium
  • 在 numpy 中连接维度

    我有x 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 2 3 I want 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 6 也就是说 我想连接中间维度的所有项目 在这种特殊情况下我可以得到这
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • Jupyter Notebook:带有小部件的交互式绘图

    我正在尝试生成一个依赖于小部件的交互式绘图 我遇到的问题是 当我使用滑块更改参数时 会在前一个绘图之后完成一个新绘图 而我预计只有一个绘图会根据参数发生变化 Example from ipywidgets import interact i
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic

随机推荐