文档章节

有道词典 Andriod 版本数据格式分析

N3verL4nd
 N3verL4nd
发布于 2017/03/25 10:39
字数 956
阅读 38
收藏 0
其实很简单无聊

基于版本 5.3 分析。
其实也简单分析了有道词典iOS版本,必应词典的各个版本,以及金山词典的各个版本,还有那个一直逍遥法外的林格斯词典。
由于在各个平台上的限制,同一词典的不同版本大多都采用了不用的实现方式。

一般 PC 版和 iOS 版本都有一定程度的加密,而 Andriod 版本则比较单纯。可能是 Andriod 硬件千差万别,不敢做额外消耗 CPU 的处理。

基本索引和词典分开
这是大多数词典都干了的事情,包括 PC 本地词典。基本索引就是在输入的时候给与下拉提示的部分,一般会给几个备选的单词以及非常精简的释意。
而真正查询某个词的时候,则单独调用其他本地词典,已经网络 API。性能的考虑,很好理解。
这个“基本索引”,在不同词典上实现不一。必应词典使用 sqlite,有道词典使用分割的文本文件。Sqlite 很好理解,有道词典选择本地文件,可能是为了省内存。

iOS 版本上,大家对基本索引处理比较自在。
如有道词典 iOS 版本,这个基本索引是放在两个巨大的数据文件里,加起来有40MB,可想而知为什么有道词典的 iOS 版本为什么比较慢,可能测试机的性能较好,他们无所谓。


有道词典的索引文件
有道词典选择本地文件存索引数据,可能是为了省内存。嗯,毕竟现在一些无聊软件,专门给你列内存占用列表。
这方案的确可行,因为现在手机使用的存储并不慢,把数据分割,用哪块取哪块,也不慢,而且内存占用极小。
整个数据大概40MB,有道把他们分成256块,中到英128块,英到中128块。
每块呢有两个文件,一个idx相当于单词列表,一个def,相当于词典。这也很好理解,在idx里找到了词,那么在def里,对于的位置就能找到具体数据。此外还有一个块的索引,列出了每个文件的第一个单词。

从需求的角度,当你输入一个东西,需要给与提示。需要使用 1 到 2 个块(因为输入的内容可能刚好在块的边缘),那么从数学角度,占用内存大概是 400K,这比40MB 还是差很远的。而实际上,英中词典并不大,一般仅有 60000-100000,这样的数据量就算线性处理都是非常快的,如果加上简单的索引,完全没有必要调用第三方数据库。

IDX 和 DEF 格式
IDX 格式和 DEF 格式也是非常简单。是一种在流处理里很常见的方式:{长度+字符串} 的数组。大端16位数字代表长度,后面跟着的是与这个长度相符的字符串。
IDX 文件里,这个字符串就是单词,而在 DEF 里,这是个 json 格式。

以 DEF 为例,可以使用PHP这样读取

$count = 0;
for ($i=0; $i<128; $i++) {
	$file = fopen('e2c_'.$i.'.def', 'r');
	while($head = fread($file, 2)) {
		// 之前做过预判,没有异常数据
		$size = unpack('n', $head)[1];
		$string = fread($file, $size);
		$dict = json_decode($string, TRUE);
		
		// 这个 dict 就是单个词典的数据
		$word = $dict['word'][0]['return-phrase']['l']['i'];
		// 单词
		echo $word."\r\n";
		foreach ($dict['word'][0]['trs'] as $tr) {
			$tr = $tr['tr'][0]['l']['i'][0];
			// 解释(可能有多个)

额外地,这些 JSON 数据冗余严重,简单的处理完全可以减少到 30MB。

© 著作权归作者所有

上一篇: poj_1724ROADS
下一篇: C指针右左法则
N3verL4nd
粉丝 1
博文 379
码字总数 481243
作品 0
朝阳
私信 提问
翻译信手拈来:有道词典linux版正式上线

外语翻译是用户在日常工作和生活中经常遇到的,而linux桌面系统中始终缺乏一个用户在应用中得心应手的翻译软件。近日,有道词典linux版正式上线,此版本是国内Linux系统发行版团队deepin(即...

sara-girl
2015/04/22
33
0
Python控制台英汉-汉英电子词典

Python控制台英汉-汉英电子词典 By qianghaohao(CodeNutter) 用python实现了下控制台电子词典,数据来自有道,通过向有道发送http表单数据,然后将服务器返回的json数据解析得到翻译结果,代...

CodeNutter
2016/08/08
45
0
有道词典登陆 Linux 平台!

近日,网易有道与武汉深之度联合发布有道词典Linux版,经过双方长达5个月的联合开发,有道词典正式登陆Linux平台! 有道词典是一款在Windows平台下广受赞誉的全能翻译软件,它结合了桌面词典...

cxbii
2015/04/21
11.2K
16
把词典功能做到极致——欧路词典

tou 电子词典除了先天的搜索优势,总是被人诟病:词义不够详细、内容排版不像纸质词典那么美观。 「有道词典」、「金山词霸」都在有意弥补这些缺陷。但做到极致的还是「欧路词典」。 本篇文章...

沉思CONTEMPLATE
2017/11/12
0
0
有道词典 纯净版 - imsoft.cnblogs

软件名称:有道词典 软件版本:5.4 正式版(5.4.46.5554) 软件主页:http://cidian.youdao.com/ 软件定制:飞扬时空 更新日期:2013年8月26日 软件简介: 有道词典是一款免费的全能翻译软件...

imzdx
2014/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部