我正在学习Python,并试图在flask中创建一个字谜创作器。
我正在使用nltk,并设置了一个基本的脚本,它可以对一组字母进行解扰,并从语料库中找到单词。我知道我的方法可能并不完美--请记住,我还在学习Python中的可用功能--但它原则上是可行的,我已经创建了一个类似的脚本来查找一组字母中的所有单词。
我的问题是它只使用美式英语,所以在下面的例子中,'favro'变成了'favor',这是美式拼写,但'favrou'没有变成'favor',这是英式拼写。
import itertools
import nltk
from nltk.corpus import words
english_vocab = set(w.lower() for w in nltk.corpus.words.words())
scramble = "favro"
sep = ""
for y in list(itertools.permutations(scramble, len(scramble))):
if (sep.join(y) in english_vocab):
print(sep.join(y))
有没有什么东西可以区分美式英语和英式英语?
我试过使用'enchant',在解题器部分运行良好,但当我试图在一个单词中创建一个单词列表时,速度慢得令人难以置信。例如,当我试图找到'颜色'内的所有单词时,ltk需要0.08秒,而enchant需要2.5秒。随着字母数量的增加,这个时间差也会增加,所以enchant是不可行的。
有什么好办法吗?
史蒂夫
如果你只用NLTK来处理单词语料库,你可能只想找一个英式英语单词的单词表,然后把它读进去。
既然我们在讨论字谜,为什么不使用SOWPODS单词表,就像在官方拼字比赛中使用的那样?
例如: https:/raw.githubusercontent.comjesstessScrabblemasterscrabblesowpods.txt。 (警告:大文件!)包含 FAVOUR
,所以它应该为你工作。
EDIT: 详述我的评论,例如:
from collections import defaultdict
ws = defaultdict(set)
for word in open("./sowpods.txt"):
word = word.lower().strip()
if word:
ws[frozenset(word)].add(word)
def find(word):
return ws[frozenset(word)]
print(find("wired"))
输出
{'rewired', 'weirdie', 'wiredrew', 'dewier', 'weired', 'widder', 'wried', 'weird', 'weirded', 'weedier', 'wider', 'wired', 'weirder'}
0.7秒内。
(是的,这是一个可能的单词的超集,但很容易过滤掉。另一个可以避免这种情况的方法是使用 ''.join(sorted(word))
作为dict.的键)