最近改造了一点 mdx

最近改造了一点mdx,打造出自己想要词典样子。
我把mdx转成了sqlite。这个事情两年前就做了,但那时候没思考清楚如何压缩,转出来的词典容量要比mdx大10倍多。最近忽然想明白了mdx是怎么压缩的,但我没打算采用他们的方式。(这里先不说具体细节了)。得益于现在的压缩技术进步,我转出来的词典容量大约是mdx的2~3倍的样子。如:mdx 10M,我转出来的大约30M。有更激进的压缩方式,但我觉得没必要了,磁盘容量在现在来说是很廉价的。
最近做这些事情最大的改进就是为词典增加了全文搜索,可以做到查句子和普通的单词查询速度一样快,用的就是sqlite的 fts5。但全文搜索也不是完全无代价的,需要为词典里面出现的每个单词建立索引。这样又让词典的容量增加大约1个mdx的大小(比如上文说的10M 的mdx,转换后30M,加上全文索引 50M)。
至于mdd我认为不重要,音频可以用 TTS 弥补,这块现在已经很好了。图片没了就没了吧,不影响学习。

有些想法在两年前已经有了,之所以没做是没找到更好的方式。另外还有个重要的原因就是词典内容完全算是盗版的,我即使做了没法给我带来盈利(甚至会带来麻烦),因此也没啥动力去做。

6 个赞

图片发音都可以放sqlite里,官方说法是小文件从sqlite里读取比直接存储在本地的文件快30%~500%,

不是放不了,也不是性能。主要是占容量太大了,而且缺了也不会有啥太大的影响。

你是做了app吗?

我也做了差不多的事情。你可以用 zstd 来进一步减少字典体积,全文索引可以调整 detail 和 columnsize 选项来进步减少体积,但这是有代价的:SQLite FTS5 Extension

1 个赞

全文搜索占用的体积是必须要支付的代价,过多调整会牺牲搜索和数据获取效率。
我用过zstd,包括它的字典。还尝试了zstd sqlite的插件。用下来可以让体积做到mdx的1.5倍的样子。但最后放弃了,原因是它牺牲了数据获取效率。最后我采用了google的压缩算法 brotli,这个算法对html数据有优化,整块压缩比zstd压缩率还要更好。但小数据块压缩还是永远不及整块压缩的mdx。
现在的zstd和brotli压缩算法已经足够好了,如果整块压缩是可以做到比mdx更小的。

我专门写了字符串压缩器,适配了词典的HTML,极限压缩比zstd猛,但解压速度始终上不去,比最差的xz还慢。

没必要这样做,压缩的比率取决于数据块大小。数据块越大,能找到的重复信息就越多,压缩比例就越高。
fb和google的这两个算法已经足够使用了,没必要造不成熟的轮子。

mdx用了lzo压缩,这个是gpl协议,我当时为了绕过这个协议,专门学了下压缩算法。

1 个赞

zstd 的压缩速度慢,但解压速度不算差,而且在使用中应该体现不出来吧。。别过早优化了,也别太小看现代计算机的性能。。

为什么要转成sqlite呢,是为了方便编辑吗?如果不是为了编辑,是否可以像goldendict那样建定制索引更好?比如通过配置文件设置,有些词典不需要全文索引就只对词条建索引,有些词典需要全文索引就词条与内容一起建索引?为了速度快,还可以把索引全加载到内存,甚至把常用的高频词典也加载到内存。

sqlite 跨平台支持,兼容性好,文档丰富,社区活跃,协议友好。自己写索引面临很多未知问题,尤其是手机端的兼容问题,使用现成的第三方索引,已知的 alob ,goldendict/xapian,stardict 全是 gpl 协议的,苹果不支持 gpl 协议的应用上架。

1 个赞

mdx相对SQLite除了容量上的优势,其他所有方面完全秒杀mdx。真没必要用mdx,而且它还是靠着类似社区反编译的做法在解析。编辑什么的问题就别提了,完全靠着词典爱好者在靠着一腔热情用爱发电。主要还是mdx的封闭导致的问题。另外就是版权问题,这个我也没法跨越,所以自己写代码自用自hi一下。

不知道这个项目是不是你维护的:https://github.com/liuyug/flask-mdict。
最近用欧陆词典调教了几个日语词典,修改了一些样式,加上 Forvo 的真人发音,使用体验很满意,已经达到了我理想中的词典应用。划词后可以直接用快捷键调用取词窗口。欧路词典是需要会员才能导入自定义词库的,我个人觉得开发一个 APP 是有意义的,提供导入词库的功能,让用户自由组合词库,使用体验类似 bob(一个不支持 mdx 的取词翻译软件)。GitHub - biyidev/biyi: Biyi (比译) is a convenient translation and dictionary app written in Flutter. 是一个用 fluuter 写的跨平台取词翻译软件,同样不支持 mdx。能支持 mdx 并提供取词翻译的软件目前最好用的应该是欧路词典。
欧陆词典调教的效果


bob 的效果:

1 个赞

新软件要支持 mdx ,如果没有长期的用户反馈,很难说的上好用。与其和兼容问题做斗争,不如另起门户,如果还有做开发的兄弟要搞新的词典软件,我的建议是直接用 sqlite,或者自定义新的词典格式,或者像 bob 一样自定义词典的接口。

====

补充说明:

词典作者通常只会适配老牌的词典软件,更可能的是只适配了他自己使用的软件,这种情况下,其他词典软件就会出现兼容问题,不说积存的海量词典,即使是新的词典想要他们做适配,也是天方夜谈。

另一方面 mdx 这个格式已经很老旧了,受词典格式所限,在用户体验上很难超越现有的老牌词典,想要开发体验更好的词典软件,需要设计更好的词典格式。