我想使用python(或使用django)创建一个在线词典应用程序。
它类似于http://dictionary.reference.com/。
PS:字典未存储在数据库中。它存储在文本文件或gunzip文件中。可以从以下URL下载免费的英语词典文件:dicts.info/dictionaries.php。
最简单的免费字典文件格式为:
word1 explanation for word1
word2 explanation for word2
还有一些其他格式。但都存储在文本文件或text.gz文件中
我的问题是
(1)是否有任何现有的开源python包或模块或应用程序实现了我可以使用或学习的功能?
(2)如果第一个问题的答案是否定的。我应该遵循哪种算法来创建这样的Web应用程序?我可以简单地使用python内置字典对象来完成这项工作吗?这样字典对象的键就是英文单词,值就是解释。在性能方面这样可以吗?或者我是否必须创建自己的树对象以加快搜索速度?或任何正确处理此工作的现有包裹?
非常感谢你。
答案 0 :(得分:9)
您可能需要查看http://www.nltk.org/ 您可以获得大量单词及其定义,而无需担心数据库的实现细节。如果你是所有这些东西的新手,至少可以让你上去,然后当你有一个工作版本时,开始加入数据库。
以下是如何从该套餐中获取“狗”的所有可用含义的快速摘录:
from nltk.corpus import wordnet
for word_meaning in wordnet.synsets('dog'):
print word_meaning.definition
答案 1 :(得分:3)
我不确定你说的是什么功能。如果您的意思是“从数据库中记录的字典中搜索关键字”,则python dictionnary
不是可能的解决方案,因为您必须反序列化整个数据库才能进行搜索。
你应该选择django'搜索'应用程序。很多人建议使用haystack
:
What's the best Django search app?
并使用此搜索引擎在您的数据库中查找某些关键字。
如果您不想支持复杂的搜索,那么您还可以在数据库中查询确切的关键字
DictEntry.objects.get(keyword=`something`).definition
我想这一切都取决于你想要达到的复杂程度,但可以有非常简单的解决方案。
编辑:
如果dictionnaries来自文件,那么很难说,你有很多解决方案。
如果文件很小,您确实可以在启动服务器时将其反序列化为字典,然后始终在同一实例中搜索(这样您就不必再为每个请求反序列化。)
如果文件非常大,您可以考虑将它们迁移到数据库。
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),如initial data for your model中所述。 magic 您的初始数据已准备就绪!
PS:与python一样好:你google'python json'你会找到官方文档,因为用于写/读json的库是标准python lib的一部分!同意使用xml和csv ...答案 2 :(得分: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 :(得分:1)
import React, { useState } from 'react';
import {
Collapse,
Navbar,
NavbarToggler,
NavbarBrand,
Nav,
NavItem,
NavLink,
UncontrolledDropdown,
DropdownToggle,
DropdownMenu,
DropdownItem } from 'reactstrap';
const Menu = (props) => {
const [isOpen, setIsOpen] = useState(false);
const toggle = () => setIsOpen(!isOpen);
return (
<div>
<Navbar color="light">
<NavbarBrand href="/">reactstrap</NavbarBrand>
<NavbarToggler onClick={toggle} />
<Collapse isOpen={isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem>
<NavLink href="/components/">Components</NavLink>
</NavItem>
<NavItem>
<NavLink href="https://github.com/reactstrap/reactstrap">GitHub</NavLink>
</NavItem>
<UncontrolledDropdown nav inNavbar>
<DropdownToggle nav caret>
Options
</DropdownToggle>
<DropdownMenu right>
<DropdownItem>
Option 1
</DropdownItem>
<DropdownItem>
Option 2
</DropdownItem>
<DropdownItem divider />
<DropdownItem>
Reset
</DropdownItem>
</DropdownMenu>
</UncontrolledDropdown>
</Nav>
</Collapse>
</Navbar>
</div>
);
}
export default Menu;