我是Python和NLTK的新手.我正在忙于一个可以执行拼写检查的应用程序(用正确拼写的单词替换拼写错误的单词),我目前正在使用Python-2.7上的附魔库,PyEnchant和NLTK库.下面的代码是处理更正/替换的类.
from nltk.metrics import edit_distance
class SpellingReplacer(object):
def __init__(self, dict_name = 'en_GB', max_dist = 2):
self.spell_dict = enchant.Dict(dict_name)
self.max_dist = 2
def replace(self, word):
if self.spell_dict.check(word):
return word
suggestions = self.spell_dict.suggest(word)
if suggestions and edit_distance(word, suggestions[0]) <= self.max_dist:
return suggestions[0]
else:
return word
Run Code Online (Sandbox Code Playgroud)
我编写了一个函数,它接受单词列表并对每个单词执行def替换并返回单词列表但拼写正确.
def spell_check(word_list):
checked_list = []
for item in word_list:
replacer = SpellingReplacer()
r = replacer.replace(item)
checked_list.append(r)
return checked_list
>>> word_list = ['car', 'colour']
>>> spell_check(words)
['car', 'color']
Run Code Online (Sandbox Code Playgroud)
现在我不喜欢这个,因为它不是很准确,我正在寻找一种方法来实现单词的拼写检查和替换.我还需要一些可以解决像"caaaar"这样的拼写错误的东西吗?有没有更好的方法来执行拼写检查?如果是这样,他们是什么?谷歌如何做到这一点,因为他们的拼写建议非常好?有什么建议
因此PyEnchant允许您定义除语言词典之外的正确拼写单词的个人单词列表:
d2 = enchant.DictWithPWL("en_US","mywords.txt")
Run Code Online (Sandbox Code Playgroud)
但是,生成的d2
检查器是类Dict
,它只能用于检查单个单词,例如:
>>> d.check("Hello")
True
Run Code Online (Sandbox Code Playgroud)
本SpellChecker
类允许的文本块的拼写检查.但是,我似乎无法找到如何指定个人单词列表Dict
.这不是支持的功能吗?我想拼写一个针对en_US的文本块以及我的个人单词列表.有任何想法吗?
我想你可以把它归类为拼字游戏风格的问题,但它起初是因为一位朋友提到了英国电视智力竞赛节目Countdown.在节目中的各种轮次涉及参赛者被提出一组乱七八糟的字母,他们必须提出他们可以用的最长的单词.我朋友提到的那个是"RAEPKWAEN".
在相当短的时间内,我用Python来处理这个问题,使用PyEnchant处理字典查找,但是我注意到它实际上无法很好地扩展.
这是我目前的情况:
#!/usr/bin/python
from itertools import permutations
import enchant
from sys import argv
def find_longest(origin):
s = enchant.Dict("en_US")
for i in range(len(origin),0,-1):
print "Checking against words of length %d" % i
pool = permutations(origin,i)
for comb in pool:
word = ''.join(comb)
if s.check(word):
return word
return ""
if (__name__)== '__main__':
result = find_longest(argv[1])
print result
Run Code Online (Sandbox Code Playgroud)
这对他们在节目中使用的9个字母的例子来说很好,9 factorial = 362,880和8 factorial = 40,320.在那个等级上,即使它必须检查所有可能的排列和字长,也不是那么多.
然而,一旦你达到14个字符,那就是87,178,291,200可能的组合,这意味着你很依赖运气,很快找到一个14个字符的单词.
通过上面的示例单词,我的机器大约需要12 1/2秒才能找到"重新唤醒".有了14个字符的乱码,我们可以用23天的规模来讨论所有可能的14个字符排列.
有没有更有效的方法来处理这个?
我在做文字处理.我需要PyEnchant库来验证文本中的特定单词是否是有效的英语单词.但是,它仅适用于32位的Python安装.我需要64位Python来处理大文本文件的内存问题.
有没有办法可以为64位Python安装PyEnchant?如果没有,我可以用什么其他库来完成类似的任务?我查看了NLTK的wordnet但是读到它的功能不如PyEnchant.
我输入了pip install pyenchant
我的shell,但它引发了两个Traceback错误:
Traceback (most recent call last):
File "<string>", line 16, in <module>
File "/private/var/folders/q4/l70hdqjd5db2n2bdj69qrwz40000gq/T/pip_build_prernauppal/pyenchant/setup.py", line 195, in <module>
import enchant
File "enchant/__init__.py", line 90, in <module>
from enchant import _enchant as _e
File "enchant/_enchant.py", line 133, in <module>
raise ImportError("enchant C library not found")
ImportError: enchant C library not found
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "<string>", line 16, in <module>
File "/private/var/folders/q4/l70hdqjd5db2n2bdj69qrwz40000gq/T/pip_build_prernauppal/pyenchant/setup.py", line 195, in <module>
import enchant
File "enchant/__init__.py", line 90, in …
Run Code Online (Sandbox Code Playgroud) 我想安装PyEnchant进行拼写检查,它需要在我的机器上安装附魔.但我能找到的所有.exe文件都是针对win32系统的.有没有其他方法在Windows 64位机器上安装它?
令人惊讶的是,我一直无法找到真正做到这一点的人,但肯定有人有.我正在研究一个python项目,目前涉及拼写检查大约16000个单词.不幸的是,这个词数只会增长.现在我从Mongo中拉出单词,遍历它们,然后用pyenchant拼写检查它们.我已经删除了mongo作为潜在的瓶颈,首先抓住我的所有物品.这让我有大约20分钟的时间处理16k字,这显然比我想花的时间长.这给我留下了一些想法/问题:
显然,我可以利用线程或某种形式的并行性.即使我将其切成4块,我仍然会在大约5分钟内看到最佳性能.
有没有办法告诉刻录库Enchant在pyenchant下面使用了什么?Enchant的网站似乎暗示它会在拼写检查时使用所有可用的拼写库/词典.如果是这样,那么我可能通过三到四个拼写单词运行每个单词.这可能是我的问题,但我很难证明情况就是这样.即使它是,我的选择真的是卸载其他库?听起来很不幸.
那么,关于如何从中挤出至少更多性能的任何想法?我把它切成并行任务很好,但我仍然希望在我做之前让它的核心部分更快一些.
编辑:对不起,在早晨咖啡之前发帖...如果单词拼写错误,附魔会为我生成一个建议列表.这似乎是我花费大部分时间在这个处理部分的地方.
我无法在我的Mac上安装一个名为PyEnchant的Python模块.我使用的是Python 2.7.当我打开并运行pyenchant setup.py文件时,我收到以下错误消息:
Traceback (most recent call last):
File "/Applications/Python 2.7/pyenchant-1.6.5/setup.py", line 195, in <module>
import enchant
File "/Applications/Python 2.7/pyenchant-1.6.5/enchant/__init__.py", line 90, in <module>
from enchant import _enchant as _e
File "/Applications/Python 2.7/pyenchant-1.6.5/enchant/_enchant.py", line 133, in <module>
raise ImportError("enchant C library not found")
ImportError: enchant C library not found
Run Code Online (Sandbox Code Playgroud)
我已经尝试运行pyenchant网站上提供的.dmg文件.安装过程没有任何错误消息,但是一旦完成,我仍然无法将pyenchant导入Python,也无法在Finder中的任何位置找到已安装的软件.
我还尝试使用.egg安装程序,它打开了一个Python窗口,其中黑色大写字母顶部写着字母"PK".我不知道这意味着什么.
您可能会告诉我,我不是一位经验丰富的Python用户,所以对此有任何帮助都非常感谢.
有什么办法可以在附魔中使用多个字典。我就是这样
import enchant
d = enchant.Dict("en_US")
d.check("materialise")
>> False
Run Code Online (Sandbox Code Playgroud)
但是如果我使用enchant.Dict("en_UK")
,我会得到True
。组合多个字典的最佳方法是什么,以便True
无论返回materialise
还是materialize
作为输入参数返回?
hunspell
我已经使用类型
.dic
和文件加载了一本非英语词典.aff
。我可以使用以下方法检查字典中的单词
d=enchant.Dict('my_lang')
d.check('my_word')
Run Code Online (Sandbox Code Playgroud)
该.dic
文件包含所有基本形式,并且. aff
文件包含所有词缀。我需要的是找到输入单词的基本形式。enchant.dict
如果我可以打印出所有对象内容或在.dic
文件中取出一个单词并使用所有词缀来制作新单词列表,那么会有帮助。这是可能的还是我必须自己编写词缀规则?如果该check()
函数已经做到了这一点,为什么它如此隐藏?
pyenchant ×10
python ×7
python-2.7 ×2
dictionary ×1
enchant ×1
import ×1
installation ×1
macos ×1
nltk ×1
pip ×1
python-3.x ×1
windows ×1
windows-7 ×1