开源词法分析工具LAC重大升级!打造属于自己的个性化分词器!
星標/置頂小屋,帶你解鎖
最萌最前沿的NLP、搜索與推薦技術
文 | 匿名大佬
編 |? 北大小才女小軼
本文將為大家介紹如何使用百度開源的詞法分析工具LAC實現個性化分詞(附代碼),并展示LAC在各數據集上驚艷的性能表現。
背景介紹
分詞是中文自然語言處理基礎且重要的任務。詞是表意的完整單位。“張三”這個詞中,“張”其實既可以是姓也可以表“張開”之意,而“三”則常被表示為數字。但“張三”作為一個詞出現在一起時,大家明確知道這表示的是個人名,故而句子經過分詞后可降低理解的難度。
分詞也是文本檢索、知識圖譜等自然語言處理應用的重要基礎。這些下游任務的效果很大程度受限于分詞的準確率。在問答對話、信息抽取、機器翻譯等任務也常用采用分詞后的結果作為模型輸入。在深度學習模型中,分詞除了能降低學習難度外,還可以縮短輸入序列長度,從而降低模型運算量。
在分詞任務中,最主要的挑戰包括以下三點:
沒有統一的分詞標準:因為“詞”的本身并沒有一個非常明確的界定,比如“夕小瑤”可以看做是一個名字組成的詞,“夕”和“小瑤”分別以姓和名作為一個詞也是有意義的。
持續增加的未登錄詞:未登錄詞(Out of Vocabulary,OOV),也叫生詞,主要指未在詞典或訓練語料中出現過的詞,這是目前導致分詞錯誤最主要的原因,并且每年都會有一些新的概念詞或網絡用語出現,如“c位”、“打call”、“新冠”等。
歧義切分:一方面,同一個詞可能存在多個語義,在不同語義下需要進行不同的切分,比如“努力/才/能/成功”、“發揮/才能”中的“才能”;另一方面,不同的切分結果可能導致完全不一樣的語義,如”無線電法/國別/研究“、“無線電/法國/別/研究”;這個時候,往往都需要理解上下文的語義才能得到一個合理的切分結果。
對于分詞標準問題,總是眾口難調的,因為分詞標準上存在人的主觀性,而且其實對于不同的應用,所需要的分詞粒度也是不同的。比如檢索相關的應用往往偏向于更細粒度的分詞,甚至同時使用多種粒度的分詞構建索引,如果我們僅僅采用粗粒度的分詞,比如以“夕小瑤”進行搜索,就會難以匹配到包含“小瑤”的結果。而在實體抽取時,知識圖譜等領域則會更加偏向于粗粒度的分詞結果,比如“夕小瑤”才是一個完整的人名,對應于一個實體,而“夕”或“小瑤”則不是。而在醫療、音樂、法律等不同應用領域,所采用的分詞標準往往也是有所差異的。這個時候我們就需要打造一個屬于自己的個性化分詞工具。
此前,在領域個性化分詞方面,比較出名的工具當屬北大分詞工具pkuseg。而近期,百度開源的詞法分析工具LAC剛剛進行了一次比較大的升級,大大提升了其易用性,并提供了增量訓練的接口。在使用這個增量訓練的接口進行簡單測試發現,LAC在個性化分詞訓練的效果驚艷,在測試的多個數據集中上的表現明顯優于pkuseg。
個性化分詞的實現
數據集
我們搜刮了一些不同領域的分詞數據集,用于對個性化分詞的效果進行測試,數據集整理如下:
PKU:新聞數據 (http://sighan.cs.uchicago.edu/bakeoff2005/)
MSR:新聞數據 (http://sighan.cs.uchicago.edu/bakeoff2005/)
CityU:繁體字新聞數 (http://sighan.cs.uchicago.edu/bakeoff2005/)
weibo:微博文本數據 (https://github.com/FudanNLP/NLPCC-WordSeg-Weibo)
law:法律文書數據 (https://github.com/FanhuaandLuomu/BiLstm_CNN_CRF_CWS)
medical: 醫療論壇數據 (https://github.com/adapt-sjtu/AMTTL/tree/538258cdcc58dc66761e87db690658da5c0f498f)
HKCanCor:粵語對話數據 (http://compling.hss.ntu.edu.sg/hkcancor/)
CTB8:新聞、廣播、微博及網頁等綜合數據 (https://catalog.ldc.upenn.edu/LDC2013T21)
我們整理了以上數據,對部分需要進行格式轉換的數據進行了預處理,已將預處理腳本上傳到云盤。
在訂閱號「夕小瑤的賣萌屋」后臺回復關鍵詞【0720】,即可下載各領域分詞數據集的預處理腳本。
分詞模型的安裝與訓練
pkuseg安裝:pip install pkuseg
LAC安裝: pip install lac
pkuseg和LAC的訓練代碼都非常簡潔,安裝并準備好訓練數據后,只需運行以下幾行代碼即可完成模型訓練:
train_file?=?'train.txt'?#?訓練數據 test_file?=?'test.txt'??#?測試數據#?LAC?訓練 from?LAC?import?LAC lac?=?LAC(mode='seg') lac.train('my_lac_model',?train_file) lac?=?LAC('my_lac_model')??????#?裝載新模型#?pkuseg訓練 import?pkuseg pkuseg.train(train_file,?test_file,?'my_pku_model') pkusegger?=?pkuseg.pkuseg('my_pkumodel')?#?裝載新模型實驗
評估指標
訓練好模型后,就需要對模型進行評估了。在這里我們使用SIGHAN 2005的評估標準:以詞為粒度,統計其準確率和召回率的。以“夕小瑤的賣萌屋”的分詞結果為例,如果模型對于“賣萌屋”這一個單詞進行了分割,預測錯誤。其準確率,召回率和F1值的計算結果如下所示:
預測正確的單詞數預測結果的單詞數
預測正確的單詞數標注結果的單詞數
測試結果
下表列出了LAC、pkuseg、thulac在各數據集上的測試結果。可以看到,LAC在大多數的數據集的效果要顯著優于pkuseg,以及thulac。除了HKCanCor數據集外,LAC的F1值大約要比pkuseg高2-3個百分點。因為HKCanCor是粵語方面的數據,LAC原本模型的訓練語料中應該沒什么粵語數據,所以這個效果優勢不是很明顯似乎也能理解。
(可左右滑動查看完整表格)
| CTB8 | 232W | 95.7(96.0/95.3) | 93.7(95.4/92.0) | 92.9(94.7/91.1) | 91.4(90.4/92.4) |
| MSR | 405W | 97.3(97.2/97.3) | 95.2(96.3/94.1) | 94.9(95.9/93.9) | 93.0(92.1/93.8) |
| PKU | 182W | 95.8(96.2/95.4) | 94.0(95.5/92.6) | 93.6(95.1/92.2) | 92.0(91.9/92.0) |
| 107W | 95.2(94.7/95.6) | 93.1(93.7/92.4) | 92.7(93.4/91.9) | 89.7(88.4/91.0) | |
| CityU | 240W | 96.1(95.9/96.3) | 93.6(94.2/93.0) | 92.8(93.6/92.1) | 92.7(92.1/93.3) |
| law | 9.83W | 97.7(97.9/97.6) | 96.5(95.8/93.7) | 95.8(96.5/95.2) | 94.5(95.0/94.1) |
| medical | 9.37W | 86.9(86.4/87.5) | 84.1(85.2/83.1) | 83.7(84.6/82.8) | 80.5(78.5/82.6) |
| HKCanCor | 17.6W | 96.7(96.5/96.8) | 96.6(96.5/96.6) | 96.3(96.4/96.3) | 93.8(93.2/94.5) |
注:pkuseg 增量訓練的參數初始化均使用pkuseg提供的default模型
事實上,LAC直接采用默認參數、未經調參操作得出的結果,都已經接近近年頂會論文中呈現的結果。以下是一篇ACL2020論文(Improving Chinese Word Segmentation with Wordhood Memory Networks)所羅列的近幾年分詞測試結果。其中,近兩年的模型大多都是基于BERT等大規模預訓練模型,非常需要的算力,相信會讓不少讀者望而卻步。
而在醫療垂類的測試結果中,LAC的結果也是要遠優于COLING2018提出的AMTTL模型的,所以可以看出LAC的結果還是比較驚艷的。
完整的模型評估和訓練代碼
如下所示,為了方便讀者自行體驗感受其效果,我們提供得到上述結果的完整測試代碼。各位可下載相應數據集后直接運行以下腳本:
#?評估函數 def?seg_eval(gold_file,?predict_file):def?convert2set(word_list):offset?=?0res?=?[]for?word?in?word_list:res.append((offset,?offset?+?len(word),?word))offset?+=?len(word)return?set(res)gold_num?=?0.0predict_num?=?0.0correct_num?=?0.0golds?=?open(gold_file,?'r',?encoding='utf8')predicts?=?open(predict_file,?'r',?encoding='utf8')for?gold,?predict?in?zip(golds,?predicts):words_gold?=?gold.strip().split()words_predict?=?predict.strip().split()gold_num?+=?len(words_gold)predict_num?+=?len(words_predict)correct_num?+=?len(convert2set(words_gold)?&convert2set(words_predict))P?=?correct_num?/?predict_numR?=?correct_num?/?gold_numF1?=?2?*?P?*?R?/?(P?+?R)return?P,?R,?F1datanames?=?['lac',?'medical',?'pku',?'msr',?'ctb8',?'weibo',?'cityu',?'hkcantcor']#?訓練代碼 from?LAC?import?LAC import?pkusegfor?dataname?in?datanames:train_file?=?'cws_data/%s_train.txt'%datanametest_file?=?'cws_data/%s_test.txt'%datanamelac_predict_file?=?'%s_lacout.txt'%datanamepku_predict_file?=?'%s_pkuout.txt'%dataname#?lac?訓練并裝載新模型lac?=?LAC(mode='seg')lac.train(dataname?+?'_lacmodel',?train_file)lac?=?LAC(dataname?+?'_lacmodel',?mode='seg')#?pku?訓練并裝載新模型pkuseg.train(train_file,?test_file,?dataname?+?'_pkumodel')pkusegger?=?pkuseg.pkuseg(dataname?+?'_pkumodel')#?執行評估with?open(test_file,?'r',?encoding='utf8')?as?fi:with?open(lac_predict_file,?'w',?encoding='utf8')?as?lacfo:with?open(pku_predict_file,?'w',?encoding='utf8')?as?pkufo:for?line?in?fi:words?=?line.strip().split()#?執行并保存lac模型結果words_lac?=?lac.run("".join(words))print("?".join(words_lac),?file=lacfo)#?執行并保存pku模型結果words_pku?=?pkusegger.cut("".join(words))print("?".join(words_pku),?file=pkufo)print('lac',?dataname,?seg_eval(test_file,?lac_predict_file))print('pku',?dataname,?seg_eval(test_file,?pku_predict_file))LAC個性化增量訓練后的效果
以下展示了LAC在各自不同領域數據上訓練前后的一些case。不難發現,LAC默認模型其實在法律、醫療、新聞等相關領域的分詞效果其實都已經比較好了。通過增量訓練,主要調整了模型的分詞粒度(目測LAC默認模型的分詞粒度都比較粗)。而對于粵語數據,LAC默認模型的效果表現比較差。通過訓練后效果后明顯提升。這可能是LAC原有模型的訓練語料沒什么粵語語料的原因。
粵語數據
LAC: 我 哋 而 家 返 屋企 睇 電視 囉 !
LAC-HKCanCor: 我哋 而家 返 屋企 睇 電視 囉 !
普通話:我們現在回家看電視了!
LAC:琴日嘅嗰啲 問題 真 係 唔知 點解
LAC-HKCanCor:琴日 嘅 嗰啲 問題 真係 唔 知 點解
普通話:昨天的那些問題真的不知道為什么
法律數據
LAC:據此 , 依照 《 中華人民共和國合同法 》 第一百零七條 、 第一百九十六條 、 第二百條 、 第二百零五條 、 第二百零六條 、 第二百零七條 、 第二百一十一條 第二款
LAC-law:據 此 , 依照 《 中華 人民 共和國 合同法 》 第一百零七 條 、 第一百九十六 條 、 第二百 條 、 第二百零五 條 、 第二百零六 條 、 第二百零七 條 、 第二百一十一 條 第二 款
LAC:以上 事實 , 有 《 借款協議 》 、 《 收款確認書 》 、 工商銀行 賬戶 歷史 明細 清單 、 《 委托代理合同 》 、 律師 收費 發票 及 當事人 陳述 記錄 在案 為證 。
LAC-lac:以上 事實 , 有 《 借款 協議 》 、 《 收款 確認書 》 、 工商 銀行 賬戶 歷史 明細 清單 、 《 委托 代理 合同 》 、 律師 收費 發票 及 當事人 陳述 記錄 在案 為 證 。
醫療數據
LAC:慢性支氣管炎 冠狀動脈 肺動脈瘺 , 心律失常 完全性 左束支 傳導 阻滯 , 阻塞性肺氣腫
LAC-medical:慢性 支氣管 炎 冠狀 動脈 肺動脈 瘺 , 心律失常 完全性 左束支 傳導 阻滯 , 阻塞性 肺氣腫
新聞數據
LAC:北京新年音樂會 展現 經典 魅力 尉健行 李嵐清 與 數千 首都 觀眾 一起 欣賞
LAC-pku:北京 新年 音樂會 展現 經典 魅力 尉 健行 李 嵐清 與 數千 首都 觀眾 一起 欣賞
LAC:2000年12月22日 下午 2 時 ( 北京 時間 23日 凌晨 2 時 ) , 我 作為 鷺江出版社 “ 2000 人文 學者 南極行 ” 活動 的 代表
LAC-pku:2000年 12月 22日 下午 2時 ( 北京 時間 23日 凌晨 2時 ) , 我 作為 鷺江 出版社 “ 2000 人文 學者 南極 行 ” 活動 的 代表
賣萌屋成立了自然語言處理、搜索技術、推薦系統、算法崗求職等方向大群和知識圖譜與信息抽取、智能問答、對話系統等垂類討論群。不僅可以認識眾多志同道合的優秀小伙伴,而且還有若干賣萌屋美麗小姐姐(劃掉)、頂會審稿人、大廠研究員、知乎大V等你來撩哦。后臺回復關鍵詞【入群】即可獲取入口。
記得掃描下方二維碼關注并星標置頂,我才能來到你面前哦。
夕小瑤的賣萌屋
關注&星標小夕,帶你解鎖AI秘籍
訂閱號主頁下方「撩一下」有驚喜
總結
以上是生活随笔為你收集整理的开源词法分析工具LAC重大升级!打造属于自己的个性化分词器!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EMNLP'20最佳论文揭晓!八块肌肉=
- 下一篇: 实践中学到的最重要的机器学习经验!