天然語言處理的流程:
- 得到數據
- 預處理
- 去除不須要的內容,如HTML標籤。
- 將文檔分割成句子。將句子分割成詞(tokenize)。
- 其餘一些操做。如轉換爲小寫,糾正拼寫錯誤。
- 去掉長度太短的詞。去掉停用詞。
- 提取詞幹。
- 訓練。
- 繪製結果。
中文分詞的常見算法:
- 基於字符串匹配的方式:速度快,實現簡單;對歧義和未登陸詞處理很差。
- 最簡單的,最大匹配法:每次從詞典中找最長的詞匹配。
反例:「北京大學生前來應聘」本應是「北京/大學生/前來/應聘」,卻會被誤分紅「北京大學/生前/來 /應聘」。
能夠維護特殊的規則表,如某個固定的組合應當如何劃分;再如維護不單獨成詞的字表,若是發現字表中的字單獨成字,須要修改分詞結果。
- 稍好一點的,最少詞數法:認爲分出的詞數量更少的方案更好。
可能會出現多種方案詞數相同。
能夠利用不單獨成詞字表:每一個詞罰一分,出現字表中的字加罰一分。選擇罰分最少的方案。
- 基於統計和機器學習的方式:能很好處理歧義和未登陸詞問題,效果比前一類效果好,可是須要大量的人工標註數據,以及較慢的分詞速度。
- 基於隱馬爾可夫模型(HMM)。隱馬爾可夫的內容可參考[6]。
- 條件隨機場(CRF):目前公認的效果最好的分詞算法。
新詞(未登陸詞)的發現:
常見的有人名、地名、機構名、專有名詞等。git
- 人名:有規律:姓氏、頭銜、動做等。
- 地名:利用收錄地名的資料。
還可使用基於統計的方法:github
互信息算法
互信息之統計模型中衡量2個隨機變量X,Y之間的關聯程度,而在新詞的識別中則特指相鄰2個詞之間的關聯程度。
MI(X,Y)=log2(p(X,Y)/p(X)*P(Y))
那麼當『XY』未在已經訓練完的詞庫中出現,且該互信息高於某一閥值值,那麼咱們就假定該詞爲新詞。
頻率網絡
當某一組連續相鄰的字在新的語料庫或網絡日誌中大量出現而未在詞庫中登記時,那麼咱們也可假定該詞爲新詞。
這種方法思路很簡單,實現的代碼也至關容易,可是該方法必須基於大規模的語料庫才能準確識別。機器學習
停用詞:
爲節省存儲空間和提升搜索效率,在處理天然語言數據(或文本)以前或以後會自動過濾掉某些字或詞,這些字或詞即被稱爲Stop Words(停用詞)。停用詞大體分爲兩類。一類是人類語言中包含的功能詞,這些功能詞極其廣泛,與其餘詞相比,功能詞沒有什麼實際含義,好比'the'、'is'、'at'、'which'、'on'等。;另外一類詞包括詞彙詞,好比'want'等,這些詞應用十分普遍,可是對這樣的詞搜索引擎沒法保證可以給出真正相關的搜索結果,難以幫助縮小搜索範圍,同時還會下降搜索的效率,因此一般會把這些詞從問題中移去,從而提升搜索性能。性能
將停用詞分爲三類:學習
首先自動識別:搜索引擎
- 若是是分類問題:經過互信息(MI)或者信息增益(IG)等算法來自動識別停用詞。
- 若是不是:採用平均(tf-)idf 等算法來進行。
- 經過領域知識排除。
使用手工維護的列表。.net
自動識別停用詞的方案主要有:日誌
- 文檔頻數( DF):當一個詞在大量文本中出現時,這個詞一般被認爲是噪聲詞。
- 詞頻(WF):當一個詞在大量出現時,一般被認爲是噪聲詞。
- 熵計算:一個基於單詞出現的平均信息量,對詞的有效性進行計算。
- 聯合熵:基於詞在句子中出現的頻率與該詞包含個icid句子頻率的聯合熵分別計算詞條在語料庫中各個句子內發生的機率,以及包含該詞條的句子在文本中發生的機率,計算他們的熵,並根據他們的聯合熵選取停用詞。
在唐詩自動分類中遇到的一些問題:
- 訓練語料庫:全唐詩。
- 停用詞表的選擇:古漢語停用詞和現代漢語停用詞都不太合適。
- 詞的長度:一個字、兩個字或三個字。
- 分詞:使用結巴分詞。它採用HMM。
- 新詞的發現:使用互信息判斷是否成詞。
- 降維:去除停用詞和低頻詞。
參考資料:
[1] http://zh.wikipedia.org/wiki/%E5%81%9C%E7%94%A8%E8%AF%8D
[2] https://github.com/chao787/RNote/blob/master/Blog/IR/stopword.org
[3] http://zhuanlan.zhihu.com/textmining-experience/19630762
[4] http://www.matrix67.com/blog/archives/4212
[5] http://www.zhihu.com/question/19578687
[6] http://blog.csdn.net/stdcoutzyx/article/details/8522078