星期五, 6月 28, 2013

教育部電子辭典轉星際譯典(stardict)字典檔心得

大約在4月底的時候,在 http://3du.tw 上看到還文於民的活動,就認領了轉換字典檔為 stardict 字典檔的工作。
首 要的工作就是瞭解字典檔的格式,stardict 字典檔可以從很多格式轉換,像是 XML、Tabfile 等等的。轉換的工具已經有提供了,安裝 stardict-tools 套件以後,就有一堆工具放在 /usr/lib/stardict-tools 下,也有提供 GUI 工具 (stardict-editor)。
我最早是想用 XML 格式 (Textual Dictionary File Format),所以我就利用工具將現有的字典檔轉換為 XML,並且參考文件,來寫程式產出檔案,結果並不順利。即便是一個只有一個詞的檔案,轉換為字典檔以後,stardict 也無法辨識到。
後來就使用最容易,而且網路上最多人分享的 Tab file format。格式很簡單,詞與說明用 Tab 字元分隔,說明裡如果有需要換行或是做排版,可以用 \n  \t 等逸出字元來排。
程式則是用 python 來撰寫,主要使用 jinja2 來配合模版產出詞與說明,用 multiprocessing 模組善用 CPU 資源,程式放在 https://github.com/elleryq/moe2stardict 。以下記錄一下我有遇到的問題跟解決方法:
  • 使用 multiprocessing 時無法使用 profiling,上網 Google 的結果,都是建議要先在單一 process 的情況下去 profiling ,解決問題以後,再來搭配 multiprocessing。
  • 在 執行程式時,所花費的時間一直很長。我是等到完成的都差不多時,才看這問題。用 profiling 去查看,才發現問題出在 jinja2 上,我把初始化模版的程序放在迴圈裡了,導致每處理一個詞都要初始化一次,非常浪費時間,大約要十分鐘以上。當我把這初始化的程序移出迴圈以後,速度提昇 了超過十倍以上,不到一分鐘就執行完畢。
  • 同理,我也把 regular expression 的 compile 移到程式的一開始就執行,避免在會被多次呼叫的函式裡去 compile。
  • http://3du.tw 所提供的 json 原始檔裡有些像 {[8e41]} 的字元,沒有顯示出字來,發信件到 g0v.tw 聊天室問,唐鳳回應說,直接把這些字先忽略掉就好,這些字是異體字。所以我就把這些忽略掉了,非常謝謝她的回應。
目前我只有做國語辭典的轉換,其他還有客語、台語、成語的部分,就看之後有沒有人認領了,或者是等有空的時候再來弄。不過說真的,現在用 stardict 的人應該不多了吧,stardict 專案開發進度在原作者 hu zheng 失蹤後,僅在今年初有釋出 3.0.4,修正幅度不大,也沒有新功能。很多都建議轉用 goldendict,幸好 goldendict 也吃 stardict 字典檔,所以我這不算是做白工。

沒有留言: