幾周前,著手替萌典加上了「拼音詞條搜尋」的功能,跟做輸入法很類似,因此 想稍微作文說明一下。

目前的萌典網站程式碼共處 理了四部詞典,依照源碼中的 README.md 的說明,就可以在本機建好開發環境, 這部份很容易完成。而萌典網站最大的特性,便是其搜尋詞條的功能全是在瀏覽 器中完成,而在使用者點選了特定詞條之後,才會下載該項目的內容。

既然現有的詞條搜尋是在瀏覽器中完成,那麼拼音搜尋也應該以此為前題,把搜 尋引擎的邏輯全做在瀏覽器中。但建立索引的步驟可以事先完成,不必在瀏覽器 中進行。

這麼決定後,主要的工作內容就是寫一支建立索引的程式 build-pinyin-lookup.pl ,再讓 javascript 去先查索引後合併的 pinyin_lookup 函式。

為了避免輸入時界面卡住,單一索引檔不宜太大,下載大檔耗時,解析大檔也耗 時。最後決定以「音」為單位,將單一一個無調拼音建成為一個小索引檔。

例如,「meng」這個索引檔內容,則條列出含有「ㄇㄥ」音所有聲調之字詞條:

# https://www.moedict.tw/lookup/pinyin/a/HanYu/meng.json
["幪","鄳","盟","鸏","懵","矇","鄸","瞢","甿","礞","氋","莔","氓","濛","儚","尨","蜢","霿","錳","雺"....

查訊時若輸入 meng fa 二音,則瀏覽器只需下載兩個檔:

# https://www.moedict.tw/lookup/pinyin/a/HanYu/meng.json
["幪","鄳","盟","鸏","懵","矇","鄸","瞢","甿","礞","氋","莔","氓","濛","儚","尨","蜢","霿","錳","雺"....

# https://www.moedict.tw/lookup/pinyin/a/HanYu/fa.json
["法","伐","茷","琺","發","砝","筏","閥","乏","罰","垡","瞂","鍅","髮","發發","茷茷"...

在瀏覽器中,只要將同時存在於 meng.jsonfa.json 的詞條取出便可。 也就是取兩部的交集。

如此做法,從「國語辭典」中拆出 744 個不重複的拼音,最大的索引檔案前三名為:

  • shi.json (112KB)
  • yi.json (103KB)
  • bu.json (80KB)

(看似 "shi" (ㄕ) 音對應最多詞量,也難怪有「施氏食獅史」這篇文章了。)

於是以同樣的做法,用萌典本身的拼音資料,替所有辭典都加上了無調拼音詞條 搜尋功能。雖然每部辭典用的拼音系統略有不同,但可以用一樣的原理進行拼音 搜尋。

感謝 @au ,萌典的拼音搜尋也就這麼正式上線了。使 用起來和輸入法很是相像,輸入兩個音時,會列出長度在二以上的詞條。

附帶一提,國語辭典這 744 個音乃是含有兒化音的,例如 "tian" (天) 及 "tianr" (天兒) 。雖在資料來源中是視為不同的音,但「天兒」在詞條中多半 也是指「天」,因此似乎可以把兒化音去掉,把 "tianr" 換為 "tian er"。如 果結尾為 r 的兒化音去掉,可將音的總數量減為 408 個。