如何用Python(Django)创建英语词典应用?
我想用Python(或者Django)来创建一个在线词典应用。
这个应用会和http://dictionary.reference.com/差不多。
补充说明:这个词典不是存储在数据库里的,而是保存在一个文本文件或者gunzip文件中。你可以从这个网址下载免费的英语词典文件:dicts.info/dictionaries.php。
最简单的免费词典文件格式是:
word1 explanation for word1
word2 explanation for word2
还有其他一些格式,但所有的文件都是存储在文本文件或者文本.gz文件中。
我想问的是:
(1) 有没有现成的开源Python包、模块或者应用可以实现这个功能,我可以用或者学习一下?
(2) 如果第一个问题的答案是否定的,那我应该用什么算法来创建这样的网页应用?我能不能直接用Python内置的字典对象来完成这个任务?这样字典的键就是英语单词,值就是解释。这样在性能上可以吗?还是说我需要自己创建一个树形结构来加快搜索速度?或者有没有现成的包可以很好地处理这个问题?
非常感谢!
4 个回答
字典在IT行业来说应该算是比较小的。
为了提高性能,确保字典是在模块的命名空间里创建的:
好的例子:
# build the dictionary
english_dict = dict()
for line in open(dict_file):
# however you process the file:
word,def = line.split(',')
# put it in the dictionary
english_dict[word] = def
def get_definition(word):
# should use english_dict.get(word,'undefined')
if word in english_dict:
return english_dict[word]
else:
return 'no definition'
不好的例子:
def get_definition(word):
# build the dictionary
english_dict = dict()
for line in open(dict_file):
# however you process the file:
word,def = line.split(',')
# put it in the dictionary
english_dict[word] = def
if word in english_dict:
return english_dict[word]
else:
return 'no definition'
你也可以使用pickle来保存字典,这样读取的时候会更快,或者把所有数据放到数据库里。具体选择哪个,取决于你自己。
我不太确定你说的“功能”指的是什么。如果你是说“从存储在数据库中的字典里搜索关键词”,那么 python dictionnary
可能不太适合,因为你需要把整个数据库都反序列化才能进行搜索。
你应该考虑使用 Django 的“搜索”应用。很多人推荐使用 haystack
:
然后用这个搜索引擎在你的数据库中查找关键词。
如果你不想支持复杂的搜索,那你也可以直接在数据库中查询一个确切的关键词。
DictEntry.objects.get(keyword=`something`).definition
我想这完全取决于你想达到的复杂程度,但其实有一些非常简单的解决方案。
编辑:
如果字典数据来自文件,那就很难说了,你有很多解决方案。
如果文件很小,你可以在服务器启动时把它反序列化成字典,然后在同一个实例中一直搜索(这样就不用每次请求都反序列化了)。
如果文件真的很大,你可以考虑把它们迁移到数据库中。
1) 首先创建你的 Django 模型,这样你就知道需要什么数据,字段的名称等等,比如:
class DictEntry(Model):
keyword = CharField(max_length=100)
definition = CharField(max_length=100)
2) 看起来你给的链接中的一些文件是 csv 格式的(似乎也可以是 xml 格式)。使用标准库中的 csv 模块,你可以把这些文件提取到 Python 中。
3) 然后使用 json 或 yaml 的 Python 库,把这些文件转换成不同的格式(json 或 yaml),就像在 模型的初始数据 中描述的那样。然后 魔法,你的初始数据就准备好了!
PS:使用 Python 的好处是:你在谷歌上搜索“python json”,就能找到官方文档,因为用于读写 json 的库是 Python 标准库的一部分!同样的情况也适用于 xml 和 csv……
你可以看看这个网站 http://www.nltk.org/。在这里,你可以找到很多单词及其定义,而不需要担心数据库的具体实现。如果你对这些内容还不太熟悉,至少可以先用这个工具快速上手,等你有了一个能正常工作的版本,再考虑加入数据库。
下面是一个简单的代码片段,教你如何从这个工具包中获取“dog”(狗)这个词的所有可用意思:
from nltk.corpus import wordnet
for word_meaning in wordnet.synsets('dog'):
print word_meaning.definition