制作 ZIM 格式词典(一) 和 zimwriterfs 的例子

mdx, slob, ZIM 三个格式大同小异,都是压缩 html 和一些资源文件到一个文件里面,然后可能包含用来获取内容的索引表之类的东西。(压缩方面 mdx 的用的是 zlib or LZO,新的 zim 用的是 zstd)

ZIM 本身格式开放,且相关工具都是开源的。开发者是 kiwix 项目。虽然是开源软件,但是背后有金主 Wikipedia 每年打一波钱,可能会比一般的开源软件更可靠一些 :)

https://wikimediafoundation.org/news/2023/04/13/first-grants-announced-from-the-wikimedia-endowment/

image

ZIM 并不是为词典设计的,而是为了压缩像维基百科那样的整个网站,每个网页都有一个 Titile,GoldenDict 用这个 Title 当作词条,实际上和词典并没有太大区别。

操作这个格式的核心库是 libzim。基于它有好几个工具

  • zim-tools → 几个命令行工具
  • python-zim → 用 python 读 和 写 zim 文件
  • wget-2-zim → 通过 wget 的 --recursive 来下载整个网站
  • mwoffliner → 从 mediawiki 网站上抓内容

目前:

  • GoldenDict-ng 直接用 libzim 来解析 zim 文件
  • 原版 GoldenDict 用的是自己的代码来解析 zim
  • Kiwix 有 Android & IOS 和桌面软件可以用

这是一个用 zim-tools 中 zimwriterfs 的例子,包含一张图片,一个音频,css & js 的加载,一个词头跳转 以及 生成的 zim 文件:

zim_demo.zip (4.4 MB)

Sadly,目前 ZIM 制作的相关工具在 Windows 上支持并不好,需要 Linux 或者 WSL 安装 zim-tools (ubuntu 22.04) or zimwriterfs (ubuntu20.04) :sweat_smile:

按照 词典制作:从一个简单的图片词典开始 的说法,MdxBuilder 应该需要把内容汇成一个 txt → 转换成 html → 合并成 mdx

zimwriterfs 只做其中 html -> 合并 的步骤,不需要 emeditor 那样的特大文件编辑器。

因为 ZIM 本身是用来储存网站的格式,只要把页面做成类似网站的结构就可以。生成这个”网站“的方法可以随心所欲。

例子的文件结构如下:

image

. 目录里,执行这串命令就可以生成 mydict.zim

#create.bash
zimwriterfs \
--welcome A/index.html \ # 主页,实际上 gd 不需要
--illustration=-/lenna48x48.png \ # 必须是 48x48 的 png 文件
--language=eng \
--title=zimdict \
--name=zimdict \
--description="This is just a demo" \
--longDescription="This shuold be longer than Description" \ #另外的描述,gd 暂时不用,旧版的 zimwriterfs 没有这个命令?
--creator=slbtty --publisher=slbtty \
./zim_dict/ \ # 内容目录
./mydict.zim

“index.html” aka “This will be title” 的内容

<!DOCTYPE html>
<html lang="en">
<head>
  <title>This will be title</title>
  <link href="../-/style.css" rel="stylesheet">
  <script src="../-/script.js" defer></script>
</head>
<body>
  <div class="main-content">
    <a href="./ok">A link to another word!</a><br>

    <img width =50% src="../-/lenna_full.png"><br>

    <audio controls>
      <source src="../-/sample_sound.ogg" type="audio/ogg">
    </audio>

    <p>Index page does matter for GoldenDict</p>
  </div>
</body>
</html>

GD-ng 的效果:

6 个赞

安卓版 goldendict 支持 zim 格式吗

没用过,不清楚 :sweat_smile:

1 个赞

楼主有兴趣分析一下他们全文检索的差别吗,压缩率来说,mdx,slob,ld2相当,zim的大小是他们的两倍不止,kiwix,mdx相关软件都有实现全文检索,slob官方的没有

kiwix 本体好像是没有全文检索的功能。它依靠在制作 ZIM 文件的时候有选择地去嵌入一个索引好的 xapian 数据库。

mdict 没用过,不清楚。

压缩率来说,mdx,slob,ld2相当,zim的大小是他们的两倍不止

不清楚你说的具体是什么的大小,不过 zlib/xz/lzo/zstd 的压缩率是可以调整的,新版本的 zim 默认使用 zstd 压缩,按照 zstd 的 benchmark,zstd 相比 zlib 在压缩率接近的情况下,速度是好几倍地快。

https://github.com/facebook/zstd#benchmarks

以前 archlinux 改用 zstd 来 取代 xz (目前 slob 用的压缩库,又名 LZMA)压缩所有的软件包,据说体积只增加了 0.8%,但是快了 13 倍

https://archlinux.org/news/now-using-zstandard-instead-of-xz-for-package-compression/

1 个赞

不错的介绍文章。
谢谢科普。

看好这个格式:制作门槛不高,还有 Wiki 支持。
现在这硬盘容量,不必过分追求压缩率。压缩率高的,CPU占用就上去了

我说的是比较表面的,没那么深入:smile:,就是比较最新维基百科,各种格式文件的大小,zim格式的50g,其他几种都在20g左右。
我所说的全文检索主要是想知道每种格式的搜索速度,对于维基百科这种体量的,目前各种mdx软件速度都太慢,如果有一种格式,压缩率和搜索速度“性价比”最高,那就完美了。

1 个赞

MDX和SLOB都不带全文检索的索引,不好比较,想像一下,你要搜索的单词在维基百科的最后一个词条里,你要完整解压20G的文件才能找到这个单词,而ZIM,大概不需要100毫秒。

索引大小/检索速度,和分词器/位置信息/过滤器设置/片段缓存都相关,一般规律是索引越大功能越强检索速度越快,多出来的每个字节都是有用的。

有些软件自带全文检索引擎,可以自己生成索引,但对维基这种体量的资料来说很不现实,如果有这方面需求的话,直接使用ZIM是最好的选择。

1 个赞

大概明白了,要达到极致速度,就必须要索引,gd,kiwix,无限词典的lucene都是这类,缺点就是体积大。
普通全文检索的速度,各种软件因为实现算法不一样,速度也不一样,比如深蓝,tango,无限的普通全文搜索,但再快也跟建立索引差了很多,好像深蓝最快

反正"尽量"(有可能的情况下)用开源的, 就像隔壁关闭了, 但是资源还在, 还能接着搞;

1 个赞