開源中文校對Chrome插件
6 min readJun 13, 2016
到了今天、網絡上的中文輸入和顯示還是有很多制肘的。
即使是新聞、還是經常能發現問題,如錯別字、全半型標點混用等;
三地用語不同、再加上廣東話和台語問題更複雜。
英文的校對軟件不少、瀏覽器或作業系統就有不錯的支持。中文軟件,特別是網頁上卻十分缺乏。
首先的原因當然是中文校對自動化,本質上就是十分困難的:
要克服的問題就有準確分詞(Tokenize)和詞性(Part of Speech)標注;
和英文字詞不一樣,中文沒有空格分詞、一字多詞性的機會也大大提高。
我經驗不多,剛剛Hackathon中實驗了中文校對的Chrome 插件學習一下, (Geek的術語:像eslint 的chineselint) 。
離能實際應用還是有一段矩離,望高手指教🙏。
想做的功能很簡單(技術卻可以很複雜):紅色顯示出可能的錯處。
常見中文特有的錯誤及成因
內容/文法上
- 詞典不存在的字詞
- 同音錯字(特別是台灣大陸用拼音輸入)
- 繁簡混用
- 中文裏全半型標點混用
- 兩地翻譯用語混用 (e.g. 弗吉尼亞)
- 倉頡同碼選錯字,如已/己
- 漏打標點,如。或)等
呈現格式上(Presentational)
- 編碼問題(特別是粵語/台語)
- 繁體中文但使用簡體字型導型某些字不是慣用型,如誤字會出言吳vs言吴
- 網頁介面做成標點斷行
挑戰及設計
Chrome 插件定位
- 一來是CMS繁多,要每個做支援很難,更適合瀏覽器或作業系統內核做
- 二來是很多時作者/編輯會有自已的文件校對Workflow和工具(e.g.Word),而很多時錯誤在後期處理或修改插入、或是不同平台才有的問題(特別是Presentational)
- 最後是,如果大家都能看到,能令讀者更容易反饋和作者令更有動力修正。
- 校對最後看有沒有錯的是人,這只是自動化以協助;所以False Positive也可以,但準確度不能太低不然太多Noise就沒用。
- 不少情況當然是在文字發佈前校對更理想,所以要對應網頁常見文字編輯器。
- 去中心伺服器,儘量所有事情在插件內做好。
分詞
- 最複雜的部分,相關算法也是我不熟識的:
- 中文能打出來的基本上都能成字,所以要找錯字必需連同詞性(POS)一起分析。
- 而一字多詞性很常見,如「坐」字,可以是動詞、名詞、副詞和介詞;
- 分詞是本來就需要用字典做Input,然後再處理歧義、和發現新詞;
- 以校對的角度來講,分出來字典沒有的字不就代表錯,除了可以是字典問題,更是本來分詞就是一個Guess,
到最後分到一堆單字,每個字典都有的話是沒有結論的。 - 中文也可定義Stop Words (英文是is/are等),先撇除錯字錯成Stop Word 的情況,分析前先做Stop Word Tagging、把代名詞也算進去,剩下來是錯字的機會比較大。
- 處理後相對能找到的「疑似錯字」:連續兩個單字,而兩個都是動詞/或是動詞連著不確定詞性的部分等等……但準確度不高,要做得好要很深入的語言學知識。
- 另外是要把字頻考慮,Jieba就能讀額外的tf-idf分析;也應該把詞性頻度一拼考慮。
- 發現新詞最常見是HMM Model (Jieba finalseg用的是Viterbi),有一個js 的Port。
- 另一個完全不同的角度,是用Machine Learning,直接用句子和標了的錯字建構模型;因為要在瀏覽器跑,我沒實作經驗,應該不太可行吧?
實作
分詞程式庫
- 一開始當然是想用Jieba, 但找到的Js版本nodejieba是Node+CPP(C++)
Chrome Extension 有NaCl 但應該沒那麼簡單,反正打算模組化未來有必要可以插新引擎,先直接改了node-segment這個瀏覽器的版本試驗。
效能 Performance
- 字典檔可以很大,(Jieba的就有14MB);再加上載入就很慢。也不應每次重載解析。
- 首先是要用Chrome的service worker做cache,然後分開繁簡模式也有助加速分詞。
字典
- 一開始發現node-segment中的盤古字典不大,所以用Python轉換了Jieba的字典成可讀格式。
- 之後用台灣文章測試分不出的繁體字詞太多,找到萌典的數據❤︎。
- 也是轉換,而萌典有字每個詞性的數據,而node-segment 使用的方式是HashMap i.e. 一個字只能有一個詞性,所以只選了第一個(應該為頻度最高)。大部分詞語則沒有詞性資料。
- 之後是新聞所見的人物/專有名詞,通過爬蟲加了一些台灣名人。另一個可行來源是everypolitician 項目,但資料不太更新
- 簡單、但可能更有效的是一個常見錯別字黑名單。
標點
- 全半型混用校對算是相對最容易做的,比較麻煩是判斷到底整體是全型還是半型為主、很多不同的情況如數字1,500.5中的.,等、又或中英文混用
文本擷取 (Text Extraction) / 高亮處理 Highlight
- 直接用Jquery + css 置換,要避開Script Tag 和http網站中Https內容的問題
- 輸入的地方,Facebook和Medium都是特製的DOM,如DraftJS。是能把Highlight 顯示出來,但粗暴置換CSS會影響DOM結構不能再被修改、甚或影響內容。
- 最難做的是反而<input> 那種, 瀏覽器上的spellcheck 不在DOM沒有API。
測試
- 一開始主要試的是這篇文章,見蘋果日報記者發布之新聞錯字。對應上邊的GIF。
- 加進很specific的規則,成功找到錯字「副評」。
- 其他網站發現的「疑似錯字」,主要是較流行用語如「翻攝」/人名等;接下來要大量的「標本」研究。
其他
- 所以即使分詞未做得好,一些基本功能如常見錯別字和標點偵錯還是有用的。
- 時間有限很多功能也未實驗,如分辨三地用語/繁簡混用/呈現格式等。
- 一個重要的功能,是attribute文本是那地區的中文(大陸/港澳/台),然後檢查有否混用用語/譯名。
- 只有很草稿的代碼所以先待整理再發佈。
- 感謝jianxing0310 han4wluc協作。