分詞或說切詞是天然語言處理中一個經典且基礎的問題,在平時的工做中也反覆的接觸到分詞問題,用到了不一樣的模型,不一樣的方法應用在各個領域中,因此想對分詞問題作一個系統的梳理。大多數分詞問題主要是針對相似漢語、韓語、日語等,詞語之間並無自然的分割,而像英語等,句子中是帶有自然的分割的。可是英語也會涉及到分詞問題,好比實體識別、詞性標註等內容。而本系列文章更多的是討論漢語中的分詞問題,首先咱們從分詞問題的基本出發,以後從傳統的詞典分詞到將分詞轉爲序列標註問題的分詞,以及最新的結合深度學習的分詞,基本按照時間順序對分詞模型可能用到的算法模型進行一步步嘗試與介紹,全部代碼我會放在本身的github上:xlturing。git
淺談分詞算法(1)分詞中的基本問題
淺談分詞算法(2)基於詞典的分詞方法
淺談分詞算法(3)基於字的分詞方法(HMM)
淺談分詞算法(4)基於字的分詞方法(CRF)
淺談分詞算法(5)基於字的分詞方法(LSTM)github
簡單的講,漢語自動分詞就是讓計算機在漢語文本中的詞與詞之間自動加上空格或其餘邊界標記。分詞中涉及到三個基本問題:分詞規範、歧義切分和未登陸詞的識別。算法
咱們從小學習漢語開始,基本順序就是漢字->詞語->句子->段落->篇章,而其中詞是什麼,什麼是詞語,這個問題看似有些莫名其妙,可是如何界定一個詞語倒是分詞中一個很重要的話題。有關專家的調查代表,在母語爲漢語的被試者之間,對漢語文本中出現的詞語的認同率只有大約70%,從計算的嚴格意義上說,自動分詞是一個沒有明肯定義的問題[黃昌寧等,2003]。舉個簡單的例子:
「小明看到湖岸上的花草,一株不知名的小花引發了他的注意」網絡
對於這句話中的「湖岸」、「花草」、「不知名」等,不一樣的詞語界定方式就會出現不同的分詞結果,如咱們能夠切分紅如下幾種形式:學習
咱們能夠看出不一樣的詞語界定方式,能夠組合出不少種分詞結果,因此說分詞能夠看作是找尋一個沒有明肯定義問題的答案。因此當咱們在衡量一個分詞模型的好壞時,咱們首先須要肯定一個統一的標準,即所謂Golden Data,你們全部的模型都在統一的數據集上進行訓練和評測,這樣比較纔會具備可參考性。htm
歧義字段在漢語中是廣泛存在的,而歧義字段是漢語切分的一個重要難點。梁南元最先對歧義字段進行了兩種基本的定義:blog
咱們能夠看出歧義字段給咱們的分詞問題帶來了極大的困擾,因此想要正確的作出切分判斷,必定要結合上下文語境,甚至韻律、語氣、重音、停頓等。get
未登陸詞,一種是指已有的詞表中沒有收錄的詞,另外一種是指訓練語料中不曾出現過的詞。然後一種含義也能夠被稱做集外詞,OOV(out of vocabulary),即訓練集之外的詞。一般狀況下未登陸詞和OOV是一回事,咱們這裏不加以區分。
未登陸詞大致能夠分爲以下幾個類型:深度學習
通過統計漢語分詞出現問題更可能是因爲未登陸詞形成的,那麼分詞模型對於未登陸詞的處理將是衡量一個系統好壞的重要指標。
基於詞典的方法是經典的傳統分詞方法,這種方式很直觀,咱們從大規模的訓練語料中提取分詞詞庫,並同時將詞語的詞頻統計出來,咱們能夠經過逆向最大匹配、N-最短路徑以及N-Gram模型等分詞方法對句子進行切分。基於詞典的分詞方法很是直觀,咱們能夠很容易的經過增減詞典來調整最終的分詞效果,好比當咱們發現某個新出現的名詞沒法被正確切分的時候,咱們能夠直接在詞典當中進行添加,以達到正確切分的目的;一樣的過於依賴於詞典也致使這種方法對於未登陸詞的處理不是很好,而且當詞典當中的詞出現公共子串的時候,就會出現歧義切分的問題,這須要語料庫足夠的豐富,從而可以對每一個詞的頻率有一個很好的設置。
不一樣於基於詞典的分詞方法,須要依賴於一個事先編制好的詞典,經過查詞典的方式做出最後的切分決策;基於字的分詞方法將分詞過程看做是字的分類問題,其認爲每一個字在構造一個特定詞語時都佔據着一個肯定的構詞位置(詞位)[1]。這種方法最先由薛念文等人於2002年提出,並在各類分詞大賽上取得了不錯的成績,尤爲是對未登陸詞問題的處理,召回率一直很高。
通常狀況下,咱們認爲每一個字的詞位有4種狀況:B(Begin)、E(End)、M(Middle)、S(Single),那麼咱們對於一個句子的切分就能夠轉爲對句子中每一個字打標籤的過程,舉個例子:
咱們對句子中的每一個字賦予了一個詞位,即BEMS中的一個標籤,這樣咱們就完成了分詞的目的。
基於字的方法將傳統的語言學問題轉換爲了一個更加容易建模的序列標註問題,咱們能夠用最大熵模型爲每一個字進行標籤分類;也能夠利用HMM將其看做一個解碼問題;或者考慮句子間的時序關係,利用判別模型CRF來建模;一樣時下火熱的深度學習中的LSTM也能夠用在這裏進行建模。
本篇博文咱們先簡單介紹分詞問題自己,其重點和難點是什麼,已經大的方向上用到了哪些方法和模型,後續咱們會選取經常使用的分詞模型進行一一介紹和實現。這裏須要特別說明下的是,本系列文章在介紹的時候是分開單個模型進行介紹的,在實際生產環境中,咱們每每會融合多種方法來提升準確率和召回率,好比在github中常常被說起的結巴分詞就融合了n-gram詞典分詞和HMM字分詞,你們具體用到的時候要根據實際環境進行選擇和搭配,必要的時候要對模型進行重train和調整。
若有任何紕漏,歡迎你們指正。