NLP的語言檢測方式

NLP的前處理(斷詞、數據等)到應用面傾向於特定語系處理,因此更需要正確的語系判定來確認每次輸入的語言。這篇來說說哪些Python工具可以用來預處理語系判斷。

Cindy C
7 min readFeb 23, 2021

💻 工具選擇

1. langdetect

langdetect是Python提供的語言檢測工具,判定輸入的字串語系後,會輸出對應的語系ISO 693代碼及其機率。

☑️ Install

pip install langdetect

✍️ Coding

接著,分別來實測看看英文字串中文字串中英混合字串的辨識結果吧!依序出入字串後,會顯示機率最高的語系及辨識出各語系及對應的機率值。

💯 Coding result

從結果可以看到除了英文字串外,有混到中文時的便是綠都沒有很好,甚至連其中的英文都辨識不出來了 😢

==English string==Inupt: Hello world.Top language: enLanguage(probability): [en:0.9999904077287755]
==Chinese string==Inupt: 來測試看看這串句子吧!Top language: koLanguage(probability): [ko:0.9999991736856194]
==En & Zh string==Inupt: Let's start! 來測試看看這串句子吧!Top language: frLanguage(probability): [fr:0.714787974608774, no:0.14285598865664084, sv:0.1423556411566312]

2. langid

接著介紹以速度為優勢的langid,他提供97種預先訓練的語言,也提供自己想要語系的訓練操作;langid除了在Python程式中執行,也提供命令行指令直接執行python langid.py。預訓練的語系ISO 639–1代碼及訓練方式也完整提供在釋出的GitHub中。

☑️ Install

pip install langid

✍️ Coding

這邊一樣實測三種中英排列的句子,直接調用 langid.classify()會回傳信心值最高的語系代碼及其信心指數,但這裡的信心值是非正規化的數值;透過 langid.rank()會顯示97個語系按照信心值排序後的辨識結果。

💯 Coding result

從這次結果看到中文的辨識準確度提升了,在中英混合的字串中也會以辨識出中文(zh)為主,這裡的rank結果先顯示前三名為主。

==English string==Inupt: Hello world.Top language: ('en', -23.719746112823486)Language(probability): [('en', -23.719746112823486), ('it', -25.36365556716919), ('nl', -26.236979961395264)]
==Chinese string==Inupt: 來測試看看這串句子吧!Top language: ('zh', -117.49670219421387)Language(probability): [('zh', -117.49670219421387), ('ja', -140.35816621780396), ('qu', -183.29132652282715)]
==En & Zh string==Inupt: Let's start! 來測試看看這串句子吧!Top language: ('zh', -135.62063598632812)Language(probability): [('zh', -135.62063598632812), ('ja', -160.76487016677856), ('qu', -202.55140113830566)]

langid也可以指定想辨識的特定語系,不用97個語系都進行辨識。另外,執行 python langid.py -n可以將辨識信心值正規化到0~1間的數值,在Python程式中也可以透過 LanguageIdentifier做正規化。

✍️ Coding

💯 Coding result

==English string==Inupt: Hello world.Top language: ('en', -23.719746112823486)Probability Normalization: ('en', 0.7280929622500324)
==Chinese string==Inupt: 來測試看看這串句子吧!Top language: ('zh', -117.49670219421387)Probability Normalization: ('zh', 0.999999999882133)
==En & Zh string==Inupt: Let's start! 來測試看看這串句子吧!Top language: ('zh', -135.62063598632812)Probability Normalization: ('zh', 0.9999999999879774)

🆚 工具比較

這邊分別從中英文網站下載各100筆文件來進行測試,分別比較工具執行效率及辨識準確度。

從結果看到英文辨識度都很穩定,但在中文辨識上 landig表現優異許多;執行效率上 langid也比 langdetect更快速。

langdetect

langdetect Speend and Accuracy

langid

langid Speend and Accuracy

💛 後記

分享兩個小工具提供大家做NLP錢可以對語系進行前處理,在中英文資料判定中,時間和準確度上目前看來都是 langid略勝一籌,若大家有其他語系的心得也歡迎跟我分享。

若只是想判斷字串中有無中文字符,可以透過正則表達式來進行,中文字符的編碼會在 \u4e00~ \u9fff之間,使用Python 內建的 relibrary就可以做辨識。

re.search(u'[\u4e00-\u9fff]+', input)

除了上述兩個工具外,還有常見到 FastTextspaCy,這邊沒有列入實測,但網友們的分享在效能和準確度上也都有不錯的優勢,之後C有實驗時再跟大家分享囉!

歡迎指教或和我分享你的經驗唷! 若小小心得有幫上你,請在底下長案拍手,謝謝您的閱讀~

--

--

Cindy C

熱愛嘗試新事物,從機器人跳到人工智慧領域的工程師,分享生活體驗,分享專業~