今天這篇文章主要介紹一下大學期間維護的一個 NLP 工具庫 —— xmnlp 的更新。xmnlp 的上一次 release 還停留在 19 年的 11 月,現在回過頭來看之前的代碼,真的覺得好幼稚。
由於疫情,今天過年足不出「滬」,期間沒什麼事情做就想著更新一下 xmnlp,於是乎升級到 v0.3.0。這次更新幾乎把所有的模型都升級了,使用了近年來比較熱門的技術。以下是 ChangeLog:
•重構詞法分析:一個深度模型統一分詞、詞性標註、命名體識別;調用接口不變;去除繁體的支持;去除自定義詞典的支持。•重構文本糾錯:基於人民日報語料構造負樣本,使用 RoBERTa finetune 識別錯誤詞,並使用 Mask Language Model 的特性進行正確詞的預測。•重構情感分類:基於開源電商評論語料,使用 RoBERTa 進行微調。•其他:所有模型只提供 Infer 接口,不再提供訓練接口。
新版本不再支持 Python2 了 (R.I.P),由於模型有點大(單個模型 40M 左右)於是乎把模型獨立了出來,需要下載模型然後進行模型地址的配置才能使用。此次升級的模型均支持 tensorflow serving 進行獨立部署。
接下來簡單介紹一下這次升級主要更新的模塊,以及背後的原理。
詞法分析之前的版本是基於 HMM 實現的,只提供了分詞和詞性標註兩種功能,這次加入了 NER (Named-Entity Recognition, 命名體識別),基於 RoBERTa Tiny 進行 finetune ,統一了分詞、詞性標註、NER。NER 支持識別地點(Location),人物(Person),機構(Organization),時間(Time),職業(Job)和電子郵件(Email)。語料使用了開源的 2014 版人民日報語料。接口使用方式和之前版本基本保持一致。以 NER 為例,以下是使用示例:
>>> import xmnlp>>> text = "現任美國總統是拜登。">>> print(xmnlp.ner(text))[('美國', 'LOCATION', 2, 4), ('總統', 'JOB', 4, 6), ('拜登', 'PERSON', 7, 9)]文本糾錯先前版本是基於簡單的統計模型和樹結構,糾錯能力很弱,幾乎為 0 (尷尬)。這次升級也是基於 RoBERTa 進行 finetune 識別錯詞的位置,提升了錯詞識別的準確率。語料的構造是比較重要的一環,首先要有質量高錯誤率小的正樣本,這裡選用了 2014 版人民日報語料;負樣本的構造也比較簡單,隨機選擇文中 N 個錯詞進行替換,替換方式主要有兩種:1. 拼音相同詞替換(xmnlp 支持拼音識別) 2. 形近字替換。記錄下替換詞的位置作為後續模型學習的 ground-truth。通過模型訓練可以學到錯詞所在的位置。
識別出了錯詞,一般還需要給出正確詞的建議,這一模塊本次升級並沒有重點關注,只是利用了 MASK 語言模型的特性,把錯詞給 MASK 掉,然後進行 MASK 部分詞的預測。
文本糾錯還是中文信息處理中比較難的任務了,由於個人時間有限,並沒有做過多的優化,只提供簡單的錯詞識別能力。其他的能力,比如:多字、漏字、行文通暢度識別等還不具備。當然後續版本會慢慢支持其他的功能。
以下是使用示例:
>>> import xmnlp>>> text = "不能適應體育專業選拔人材的要求">>> print(xmnlp.checker(text)){(11, '材'): [('才', 1.58528071641922), ('材', 1.0009655653266236), ('裁', 1.0000178480604518), ('員', 0.35814568400382996), ('士', 0.011077565141022205)]}情感分析個人認為情感分析是一種業務價值比較高的技術,比如,電商場景下通過分析用戶評論的情感傾向來制定店鋪的負反饋策略。情感分析背後的主要技術還是文本分類。文本分類是 NLP 中很基礎的任務了,本人在業務場景中多次用到了這項技術,學術層面上也有相關的工作,後續文章會介紹下我們在 AAAI2021 上關於文本分類相關的研究。
回到 xmnlp,之前的版本使用了樸素貝葉斯,這次換成了 RoBERTa finetune,語料還是開源的電商評論語料。樸素貝葉斯方法的準確率在 85% 左右,升級後在測試集上的準確率在 96% 左右。以下是簡單的示例:
>>> import xmnlp>>> text = "這本書真不錯,下次還要買">>> print(xmnlp.sentiment(text))(0.02727833203971386, 0.9727216958999634)>>> text = "垃圾書一本">>> print(xmnlp.sentiment(text))(0.9930351972579956, 0.006964794360101223)結果返回的是一個元組,表示 (負向情感的概率,正向情感的概率)
到此這次升級涉及的部分差不多就講完了。更多功能及細節,敬請關注 Github👉:https://github.com/SeanLee97/xmnlp#outline
本人目前在國內某 top 網際網路公司搬磚(打工),坐標上海,從事 NLP 相關工作。xmnlp 只是一款個人維護的面向通用場景的工具,如果你有業務相關的 NLP 需求,且面臨落地問題的,可以 Email 至:xmlee97@gmail.com ,在能力範圍內,本人可以提供有償的諮詢和落地服務。