如何用Python(Django)创建英语词典应用?

10 投票
4 回答
12661 浏览
提问于 2025-04-15 22:55

我想用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 个回答

1

字典在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来保存字典,这样读取的时候会更快,或者把所有数据放到数据库里。具体选择哪个,取决于你自己。

3

我不太确定你说的“功能”指的是什么。如果你是说“从存储在数据库中的字典里搜索关键词”,那么 python dictionnary 可能不太适合,因为你需要把整个数据库都反序列化才能进行搜索。

你应该考虑使用 Django 的“搜索”应用。很多人推荐使用 haystack

最好的 Django 搜索应用是什么?

然后用这个搜索引擎在你的数据库中查找关键词。

如果你不想支持复杂的搜索,那你也可以直接在数据库中查询一个确切的关键词。

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……

9

你可以看看这个网站 http://www.nltk.org/。在这里,你可以找到很多单词及其定义,而不需要担心数据库的具体实现。如果你对这些内容还不太熟悉,至少可以先用这个工具快速上手,等你有了一个能正常工作的版本,再考虑加入数据库。

下面是一个简单的代码片段,教你如何从这个工具包中获取“dog”(狗)这个词的所有可用意思:

from nltk.corpus import wordnet
for word_meaning in wordnet.synsets('dog'):
    print word_meaning.definition

撰写回答