天然語言處理中的分詞問題總結

衆所周知,英文是以詞爲單位的,詞和詞之間是靠空格隔開,而中文是以字爲單位,句子中全部的字連起來才能描述一個意思。把中文的漢字序列切分紅有意義的詞,就是中文分詞,有些人也稱爲切詞。本文轉載自明略研究院的技術經理牟小峯老師講授的語言處理中的分詞問題。正則表達式

如何界定分詞  算法

中文分詞指的是將一個漢字序列切分紅一個一個單獨的詞。分詞就是將連續的字序列按照必定的規範從新組合成詞序列的過程;在英文中,單詞之間是以空格做爲天然分界符,漢語中詞沒有一個形式上的分界符。(見百度百科) 正由於缺少形式上的分界符,致使咱們對詞的認定會出現很大的誤差。1996 年 Sproat 等經過對 6 個母語爲漢語的人進行調研,讓這 6 人對同一篇中文文本進行人工切分,文本包括 100 個句子,最後統計認同率,見下表:數組

圖1網絡

不只普通人有詞語認識上的誤差,即便是語言專家,在這個問題上依然有不小的差別,這種差別反映在分詞語料庫上。不一樣語料庫的數據沒法直接拿過來混合訓練。學習

之前曾經出過度詞規範 (GB13715),以「結合緊密,使用穩定」做爲分詞建議,後來發現這個建議彈性太大,不一樣的人有不一樣的理解,沒法有效實施。測試

爲了統一對詞語的認識,如今主要經過「分詞規範、詞表、分詞語料庫」來使得詞語切分可計算,例如北大的「詞語切分與詞性標註」規範。基於上述種種工做,能夠把詞語切分問題變得可操做和標準化,你們在統一的平臺上進行實驗和比較。大數據

對分詞的訴求是什麼?  優化

從已有工程經驗來看,幾乎不存在通用並且效果很是好的分詞系統,例如:在人民日報上訓練的分詞系統,在二次元的魔幻小說上切分效果不佳。每一個領域有其獨特的詞彙表示,這很難經過有限的訓練數據捕捉到全部語言現象。spa

不用使用場景對分詞的要求差別很大。在搜索的索引階段,每每會召回全部可能切分結果,對切分準確率要求不高,但對分詞速度有很高的要求,例如某中型搜索系統,天天 4000 萬篇文章入庫,每秒要處理 500 篇文檔,每秒處理的文檔字節數約有 50MB;若是分詞系統太慢的話,須要開大量線程才能處理這些文檔。線程

在問答系統中,須要對文本實現較爲深刻的理解,對分詞和實體識別的準確性要求很高。

不用的使用場景,對分詞提出了不一樣的要求,不須要片面地追求高準確率。

別家系統的準確率怎麼這麼高?  

在分詞系統研發中,最容易產生誤解的就是比較系統準確率。系統準確率與訓練數據很是相關,脫離數據而談論準確率無異於「刷流氓」。2003 年 863 分詞評測中就出現了 98% 的準確率,2007 年 Sighan 評測中最高準確率是 97%,在最近某司組織的評測中,最高準確率降低到了 94%。全部不一樣數據下的評測結果都不能直接比較高低。

如今吹噓分詞準確率的公司和單位愈來愈少了。

分詞穩定性很重要  

分詞穩定性是指分詞系統的輸出在不一樣上下文下都比較穩定,不會出現明顯被上下文影響的狀況。例如,在下面句子中,「黃代恆」有時識別爲人名,第二次出現未識別出來:

實戰 分享 三 黃代恆 /nr 與 軌道 交通 : 軟硬 結合 到 人機 結合  黃代恆 「 在 不一樣 的 客戶 場景 下 , 咱們 用 三 種 技術 實現 軌道 交通 的 數據 洞察

通常純統計分詞系統的穩定性比不上基於詞典實現的分詞系統。在搜索中,分詞穩定性很是重要,不然極容易出現查詢不到的狀況。

已有分詞系統小結  

分詞大概是投入人力很是大的 NLP 方向,幾乎每一家「有追求」的公司都有員工實施過相似的任務,並且反覆迭代更新;在 NLP 研究界,這個問題從上個世紀 80 年代就已經開始探索,一直到 ACL 2017 仍然有這方面的論文 (有 4 篇叢神經網絡角度探索分詞的文章)。

如此多的人力投入到分詞理論研發和工程研發中,產生了一批各有特點的分詞系統。下面僅僅就本人接觸到的系統做說明 (排名無前後),比較「古老」的系統不在此羅列:

 

IK 系統  

該系統採用 JAVA 開發,實現邏輯不復雜,因爲對 Lucene 和 ES 支持較好,於是獲得了比較廣泛的使用。該系統能夠實現英文單詞、中文單詞的切分,OOV 識別能力不強。該系統有幾種使用模式,分別對應不一樣的使用場景,如索引、查詢等。

IK 有些功能比較貼心,好比熱更新用戶詞典,支持用戶自定義詞典很是方面,對搜索工程師比較友好。

IK 的代碼實現上優化不夠好,甚至能發現 BUG。咱們發現的 BUG 會致使 ES 中長 Query 沒法實現精準匹配。

對於中小企業的內部應用來講,使用 IK 足夠了。在商業系統上使用的話,要很是慎重,參與優化的人員太少了。

Jieba 系統  

Jieba 大概是最好用的基於 Python 實現的分詞系統了,2-3 行代碼就能夠實現分詞調用和詞性標註,速度還不錯。基於 HMM 模型實現,能夠實現必定程度的未登陸詞識別。

Jieba 有精確模式、全模式、搜索模式三種。全模式是找到全部可能詞語;搜索模式是在精確模式的基礎上對長詞進行切分,提升召回率。

支持繁體分詞;支持自定義詞典;支持並行分詞,方便實現加速。

在分詞速度上,精確模式能達到 400KB/ 秒,全模式下能達到 1.5MB/ 秒。

Jieba 除了 Python 版本外,還有多種語言實現的版本,包括 C++, JAVA, Golang 等。

Java 版本的 Jieba 功能上受限,僅面向搜索使用。明略 SCOPA 產品中使用了 Java 版本的 Jieba 做爲分詞組件,替換了 IK。

Hanlp 平臺  

Hanlp 是一個功能很是全面的 NLP 平臺,它的分詞接口借鑑了 Ansj 的設計,形式上和命名上都很是像。

Hanlp 有「簡約版」和「增強版」,簡約版的模型參數較小,分詞能力還能夠;增強版在模型參數上擴大了若干倍,分詞能力進一步提高。

Hanlp 支持基於 HMM 模型的分詞、支持索引分詞、繁體分詞、簡單匹配分詞(極速模式)、基於 CRF 模型的分詞、N- 最短路徑分詞等。實現了很多經典分詞方法。

Hanlp 的部分模塊作了重要優化,好比雙數組,匹配速度很快,能夠直接拿過來使用。

Hanlp 作了很多重現經典算法的工做,能夠去GitHub上看一下!

ICTCLAS 系統  

ICTCLAS 大概是「最知名」的分詞系統了,從參加 2003 年中文分詞評測,一直延續到了如今。如今已是商業系統了 (更名 NLPIR),須要 License 才能運行。

從未登陸詞識別準確率上說,ICTCLAS 已經明顯落後於基於 CRF 的分詞系統了。

儘管如此,它的優勢仍然比較明顯:不多出現「錯得離譜」的切分結果,這在基於 CRF 模型的分詞系統上很多見,尤爲是遷移到其它領域時;模型和庫不大,啓動快;基於 C++ 實現,可以很快遷移到其它語言。

從分詞穩定性上來講,ICTCLAS 值得信賴,從分詞準確率、分詞速度等方面來考量,有很多分詞系統超過了它;NLPIR 的源代碼已經再也不開放,這讓用戶很糾結。

交大分詞  

所謂「交大分詞」,是指上交大趙海老師我的主頁上的分詞系統。該系統在 2007 年 Sighan 評測中拿到了多項第一。

該系統基於 CRF 模型構建,在模型特徵提取上作了大量工做,分詞準確率比較高。目前可用版本支持簡體、繁體分詞,也支持不一樣分詞標準。該系統被經常用來比較分詞準確率。

該系統的問題是不開源,只有 Windows 上的可執行文件,C++ 源碼須要向做者申請。雖然該系統不開源,但做者的一系列論文基本上揭示了其原理,複製起來並不難。

從工程角度來考慮,該系統只適合作 DEMO 組件,不適合大規模工業化使用。

Stanford 分詞  

Stanford 分詞系統的優勢是準確率高,未登陸詞識別能力比較強;缺點很是明顯,模型很大,約 300MB-400MB,啓動很是慢,大概須要 10 秒 -20 秒。在全部分詞系統中,沒有比 Stanford 啓動更慢的系統,分詞速度也不快。代碼優化的空間比較大。

Stanford 系統支持自定義訓練,只要用戶提供訓練數據,該系統能夠訓練新的模型參數。

Stanford 分詞系統只是驗證做者論文的一種手段,爲了很是微小的分詞準確率提高,致使了模型參數膨脹。

在 Demo 環境下可使用 Stanford 系統,在大規模數據環境下不適合使用該系統。

GPWS 系統  

GPWS 是北京語言大學語言信息處理研究所研發的分詞系統,2001 年對外發布。該分詞系統是 2000 年後惟一一個基於大規模規則 + 統計的分詞系統(僅限我的所知),在 2004 年很是低的硬件配置下,分詞速度也能達到 3MB-5MB/ 秒,對系統資源的消耗很低。後來受權給了新浪、微軟等公司使用,被應用在了信息檢索中。

GPWS 能夠實現中文人名、外國人名、日本人名的識別,其它分詞系統幾乎都沒有作到這個程度;對通用領域的文本切分效果較好,支持自定義詞典;不多出現切分「離譜」的狀況。該系統適合大規模數據處理的場景。

上述全部系統幾乎都依賴於訓練數據,而 GPWS 沒有這方面的問題。GPWS 依賴於高質量分詞詞典和歧義切分機制,採用基於可信度的人名識別方法,不依賴於公開的訓練數據。

GPWS 最大的問題在於很難複製,代碼沒有公開;在分詞準確率上,GPWS 已經比不上字本位的分詞系統;但從分詞穩定性上,GPWS 仍然很是出色,比純統計分詞系統明顯要好。

分詞的難點在哪裏?  

歧義  

歧義問題與詞長很是相關,詞語越短,發生歧義的可能性越大,詞語越長,發生歧義的可能性越低,不多出現成語與其餘詞發生歧義的狀況。歧義問題在分詞中不是罪嚴重的問題,僅佔分詞錯誤數的 10% 左右。歧義分類包括:

交集型歧義

abc -> 能夠切分爲 ab c 和 a bc,佔全部歧義總量的 95%,也就是說歧義問題主要是指交集型歧義

例如:

研究生命的起源 | 研究生 命 的起源

這種環境下 工做 |  這種環境 下工 做

化妝 和 服裝 |  化妝 和服 裝

這羣 山裏的娃娃 |這 羣山 裏的娃娃

進書店 跟 進超市同樣 | 進書店 跟進 超市同樣

組合型歧義

abc ->能夠切分爲 abc 和 a bc 或 abc。

組合型歧義通常要經過先後鄰接搭配的可能性大小來判斷。

他從 立刻 下來 | 他從 馬 上 下來

這個門 把手 壞了 | 這個門 把 手 壞了

基於馬爾科夫模型計算鄰接搭配能夠消除絕大部分歧義。

經過計算詞語搭配的機率估計句子的機率,選擇機率最大的結果便可。

分詞錯誤的主要來源  

未登陸詞 - 不在詞典中的詞,該問題在文本中出現頻度遠遠高於歧義。

未登陸詞的類型包括:人名、地名、機構名、公司名、數字、日期、專業術語、新詞、產品名等。通常把人名、地名、機構名、公司名叫命名實體,例如:

 

盧靖姍一晚上爆紅 (人名)

在東四十條站臺見面 (地點)

銀聯的小兄弟網聯成立了 (機構名)

公元 2017 年 8 月 24 日發生一件大事(日期)

中國外匯儲備達到三點 94 萬億美圓(數字)

在明略軟件作大數據處理 (公司名)

基於暗網數據買牛股 (專業術語)

招行發佈了朝朝盈一號的理財產品(產品名)

讓你見識什麼叫凍齡 (新詞)

不一樣類型的命名實體還能夠細分,好比人名能夠分爲中文人名、藏族人名、維族人名、日本人名、歐美人名等。

地名能夠分爲典型地名和非典型地名,典型地名如國、省、市、縣、鄉、村等;非典型地名還包括路、居委會、大廈商場、門牌單元、圖書館、門面等。理論上,只要是有經緯度座標的實體,均可以歸入地名識別範疇。在實際工做中,這方面的識別需求很是強烈,好比在公安領域的線索或案情信息,每每涉及到這種非典型地名。

機構和公司的類型也多種多樣,除了行政機構外,還有各類社團、NGO 組織、基金會、校友會等等;公司名涉及到公司全稱和公司簡稱的識別,例如:

明略軟件系統科技有限公司(全稱)

明略軟件(簡稱)

明略數據(簡稱)

全稱識別相對容易一點,簡稱識別很是困難,好比:小米、滴滴、凡客、OFO 等。

機構公司名與地名之間存在很大的交集。理論上,一個機構或公司每每會有辦公地點,有時也會用機構公司名來稱呼該地點,這樣的話機構公司名也就有了地點屬性。例如:

小明在明略軟件上班(公司名)

把球踢進了明略軟件的門前(看作公司名仍是地點?)

在實際工做中,命名實體的關注程度最高,由於這些實體每每是知識圖譜的節點。其它未登陸詞中,專業術語的提取會對文本分類和文本理解有重要幫助。

分詞中的語料問題  

基於統計模型的分詞系統,在分詞結果上出現差別的一個緣由是對語料的預處理差別致使。至關多的分詞系統沒有對訓練數據進行一致性校驗,認爲訓練數據是無差錯的。在實際調查時發現,訓練數據包含了很多標註不一致的狀況。例如人民日報中的例子:

自認倒黴 | 自 認 倒黴

倒黴 鬼 | 倒黴鬼

除了切分一致性外,詞性標註的不一致性更嚴重一些,如:「自認倒黴」有時標註爲 l、有時標註爲 lv;「難能難得」有時標註爲 i、有時標註爲 iv。

分詞語料的選擇範圍有限,主要包括北大人民日報標註語料、微軟標註語料、社科院標註語料、CTB 語料、OntoNotes 語料、城市大學繁體語料、中研院繁體語料等。通常選擇一種數據便可,數據須要購買。

分詞語料之間在詞語顆粒度上有必定差別,通常不混用進行訓練,例如:

承租人、承租者 (北大)  | 承租 商 (微軟)

高 清晰度 彩電 (北大) | 高清晰度電視 (微軟)

分詞的理論解決方案  

分詞的理論解決方案是採用統計模型,基於切分語料進行訓練。該方案在學術界和工程界都很常見,也是學術界的研究熱點。方案的差別主要是模型和特徵工程不同。模型差別很是常見,好比隱馬爾科夫模型、最大熵模型、條件隨機場模型、結構感知機模型、RNN 模型等。

特徵提取  

特徵提取的第一步是選擇單元:基於字仍是基於詞。從實踐來看,基於字的模型對未登陸詞識別能力較強,但基於詞的模型不多會出現切分「離譜」的狀況。採用什麼顆粒度單元,取決於具體任務。

特徵工程會對最終分詞結果產生很大影響。字本位分詞的常見分詞特徵是:

圖4

Unigram 是單字特徵模板,當前字的前一個字、當前字、後一個字。Bigram 是鄰接字組合特徵模板,包括前一個字與當前字、當前字與後一個字的組合。Jump 是把前一個字與後一個字組合。

其它特徵主要是關於字的屬性,如是否數字、標點、字母等。這些特徵都是形式上的特徵,沒有歧義。

每個特徵實例在 CRF 模型中有一個權重。因爲特徵越多,模型參數越大,在實際工程應用中資源消耗越大,所以在實際任務中會有必定取捨。

理論解決方案的問題  

訓練數據規模有限

北大人民日報的原始語料的詞語數爲 2800 萬;CTB9.0 詞語數爲 200 萬;國家語委數據爲 5000 萬字。

標註語料是一個很是消耗人力的事情。北大 1998 年人民日報的標註共持續了 3 年時間才完成。CTB1.0 的標註持續了約 2 年時間。

領域遷移性不佳

其餘領域實施時,分詞準確率降低很快。因爲標註語料的詞語使用沒法覆蓋實際語言現象,所以基於標註語料訓練的分詞系統在差別較大的領域會出現準確率下降的狀況,例如基於北大語料訓練的分詞系統在微博上的切分準確率就不是很高。

模型愈來愈大,速度愈來愈慢

早期使用 HMM 模型訓練分詞系統,在北大數據上訓練大概須要 1-2 分鐘,內存消耗很小。如今使用 CRF 模型訓練大概須要 3 天左右,內存大概須要十幾 G。CRF 模型在訓練分詞系統時,其參數數量跟特徵數量直接相關,訓練數據越多,特徵數量越大,模型也就愈來愈大。致使系統調用存在困難,運行速度降低。

如何工程解決?

圖5

能用規則解決的,就不要靠模型了  

針對文本中有規律的部分,能夠利用規則或者正則表達式來識別,例如數字、標點、時間、日期、重疊式等,如笑一笑。

擴大訓練語料  

擴大訓練語料的一種辦法是購買更多語料;另一種辦法是利用其它分詞系統來切分數據,對數據進行清洗,造成新數據。

這些不一樣的分詞系統依賴的訓練數據儘可能不要相同,例如 Stanford 系統是基於 CTB 語料,LTP 系統是基於人民日報,這兩個系統的切分結果就能夠考慮混用。在混用前,要進行必定程度的預處理,好比保持切分一致性。

明略的分詞系統經過使用多款不一樣分詞系統的分詞結果,擴大訓練數據,在人名識別上大幅度提升了召回率。

增長詞表  

增長詞表是提升切分準確率「立竿見影」的辦法。在天然語言處理中,只要是封閉集合的詞語或實體,能夠考慮利用詞表來切分,例如成語。該方法簡單有效。

在明略分詞數據中,集成了全國全部的地名、公交站名、路名等,精確到村和居委會,對國內地名識別上有很高的準確度。對機構名和公司名,集成了常常出現的國內行政機構、上市企業等名字。

在 Bosen 系統的演示中,對公司名識別準確率很是高,例如:「明略數據、明略軟件」這種公司簡稱也能識別出來,即便沒有上下文也能識別。這應該跟其後臺的公司名數據有關。

最大匹配 + 大詞表  

從諸多實踐來看,最大匹配分詞策略 + 大詞表的方法很是有效。在《中文分詞十年回顧》中做者提到了最大匹配和大詞表的效果:

Ftop 行表示沒有未登陸詞的狀況下,僅使用最大匹配達到的 F 值(準確率 + 召回率)。

實用的分詞系統,都帶有大量通用詞表和領域詞表。

收集整理領域詞表,對遷移分詞系統相當重要。這對統計分詞系統比較困難。

結合深度學習?  

ACL 2017 年有 3 篇跟分詞相關的文章,都是深度學習 (神經網絡) 和分詞結合的內容。分別是:

Neural Word Segmentation with Rich Pretraining

Adversarial Multi-Criteria Learning for Chinese Word Segmentation

Fast and Accurate Neural Word Segmentation for Chinese

從明略的實踐來看,深度學習應用到分詞任務中的優勢在於:模型很是小。在約 200MB 的語料上訓練獲得的模型只有 5MB。分詞準確率接近歷史上最佳評測結果,可是分詞速度太慢。

從最新文獻來看,利用神經網絡來作分詞,訓練效率和運行效率都比較低,慢得沒法忍受,不適合工程上部署,也不適合作 Demo。

在《Fast and Accurate …… for Chinese》中提供了運行速度對比,測試數據爲 170k 左右,2015 和 2016 年的 6 項分詞結果中,切分測試數據的時間從 28 秒到 125 秒。在傳統方法上,好比基於 CRF 分詞,運行時間大概只要 1 秒。

根據我的經驗,神經網絡在 NLP 上的成功應用的領域每每是準確率不高或者運行效率很低的場合,例如問答系統、機器翻譯、句法分析。在準確率比較高或者運行效率不錯的場景下,利用深度學習會得不償失。

相關文章
相關標籤/搜索