A. 分詞的基本原理
本文只是對NLP知識進行梳理,鞏固及時查漏補缺。
在對文本處理的時候,首要做的就是分詞。英文可以按空格分詞,但有時候需要把多個單詞作為一個分詞,比如一些名詞如「New York」,需要作為一個詞看待。而中文沒有空格,分詞就是一個需要專門去解決的問題了。無論是英文還是中文,分詞的原理都是類似的,本文就對文本挖掘時的分詞原理做一個總結。
三大主流分詞方法:
現代分詞幾乎都是基於統計的分詞,而統計的樣本內容來自於一些標準的語料庫。
假如有一個句子: 「小明來到荔灣區」 ,我們期望語料庫統計後分詞的結果是: "小明/來到/荔灣/區" ,而不是 「小明/來到/荔/灣區」 。那麼如何做到這一點呢?
從統計的角度,我們期望 "小明/來到/荔灣/區" 這個分詞後句子出現的概率要比 「小明/來到/荔/灣區」 大。數學表示就是:如果有一個句子S,它有m種分詞選項,
其中下標 代表第 種分詞的詞個數。如果我們從中選擇了最優的第𝑟種分詞方法,那麼這種分詞方法對應的統計分布概率應該最大,即:
但是我們的概率分布 並不好求出來,因為它涉及到 個分詞的聯合分布。在NLP中,為了簡化計算,我們通常使用馬爾科夫假設,即每一個分詞出現的概率僅僅和前一個分詞有關,即:
由馬爾科夫假設,則聯合分布為:
而通過我們的標准語料庫,我們可以近似的計算出所有的分詞之間的二元條件概率,比如任意兩個詞 , ,它們的條件概率分布可以近似的表示為:
其中𝑓𝑟𝑒𝑞(𝑤1,𝑤2)表示𝑤1,𝑤2在語料庫中相鄰一起出現的次數,而其中𝑓𝑟𝑒𝑞(𝑤1),𝑓𝑟𝑒𝑞(𝑤2)分別表示𝑤1,𝑤2在語料庫中出現的統計次數。
利用語料庫建立的統計概率,對於一個新的句子,我們就可以通過計算各種分詞方法對應的聯合分布概率,找到最大概率對應的分詞方法,即為最優分詞。
2.1 正向最大匹配思想MM
例: 我們要對 南京市長江大橋 這個句子進行分詞,根據正向最大匹配的原則:
2.2 逆向最大匹配演算法RMM
該演算法是正向最大匹配的逆向思維,匹配不成功,將匹配欄位的最前一個字去掉,實驗表明,逆向最大匹配演算法要優於正向最大匹配演算法。
例:取出 南京市長江大橋 的後四個字「長江大橋」,發現詞典中有匹配,切割下來;對剩餘的「南京市」進行分詞,整體結果為:南京市、長江大橋。
2.3 雙向最大匹配法BM
雙向最大匹配法是將正向最大匹配法得到的分詞結果和逆向最大匹配法的到的結果進行比較,從而決定正確的分詞方法。
例:雙向的最大匹配,即把所有可能的最大詞都分出來,上面的句子可以分為:南京市、南京市長、長江大橋、江、大橋。
2.4 設立切分標志法
收集切分標志,在自動分詞前處理切分標志,再用MM、RMM進行細加工。
隨著大規模語料庫的建立,統計機器學習方法的研究和發展,基於統計的中文分詞方法漸漸成為了主流方法。
主要思想 :把每個詞看做是由詞的最小單位各個字組成的,如果相連的字在不同的文本中出現的次數越多,就證明這相連的字很可能就是一個詞。因此我們就可以利用字與字相鄰出現的頻率來反應成詞的可靠度,統計語料中相鄰共現的各個字的組合的頻度,當組合頻度高於某一個臨界值時,我們便可認為此字組可能會構成一個詞語。
主要統計模型:
N元模型
只依賴於前一個詞太武斷了,我們能不能依賴於前兩個詞呢?
這樣也是可以的,只不過這樣聯合分布的計算量就大大增加了。我們一般稱只依賴於前一個詞的模型為二元模型(Bi-Gram model),而依賴於前兩個詞的模型為三元模型。以此類推,我們可以建立四元模型,五元模型,...一直到通用的N元模型。越往後,概率分布的計算復雜度越高。當然演算法的原理是類似的。
在實際應用中,N一般都較小,一般都小於4,主要原因是N元模型概率分布的空間復雜度為O( ),其中|V|為語料庫大小,而N為模型的元數,當N增大時,復雜度呈指數級的增長。
N元模型的分詞方法雖然很好,但是要在實際中應用也有很多問題,
維特比演算法與分詞
為了簡化原理描述,我們的討論都是以二元模型為基礎。
對於一個有很多分詞可能的長句子,我們當然可以用暴力方法去計算出所有的分詞可能的概率,再找出最優分詞方法。但是用維特比演算法可以大大簡化求出最優分詞的時間。
大家一般知道維特比演算法是用於隱式馬爾科夫模型HMM解碼演算法的,但是它是一個通用的求序列最短路徑的方法,不光可以用於HMM,也可以用於其他的序列最短路徑演算法,比如最優分詞。
維特比演算法採用的是動態規劃來解決這個最優分詞問題的,動態規劃要求局部路徑也是最優路徑的一部分,很顯然我們的問題是成立的。首先我們看一個簡單的分詞例子:"人生如夢境"。它的可能分詞可以用下面的概率圖表示:
參考: https://www.cnblogs.com/pinard/p/6677078.html
B. 分詞演算法是什麼
分詞演算法是文本挖掘的基礎,通常對整個模型的效果起著較大的決定作用。
分詞演算法常用的兩種運行方式:
1、用戶搜索及匹配。
例如:我們在網路搜索一個詞 「手機回收」,那麼網路會先把這個詞分為手機和回收兩個詞這個時候呢網路會先在庫中搜索手機這個詞然後進行第一輪的篩選。把網頁當中沒有手機這個詞的去除,只保留帶有手機這個詞的結果,之後再從已篩選出來的網頁中,篩選出帶有回收這個詞的頁面。然後在所得結果裡面根據頁面評分給用戶進行排序。
2、網頁主題計算
前面啟蒙博客也講過,網路蜘蛛只是一個機器,並不能向人一樣去思考,而在處理文章的時候,網路蜘蛛則會把文章也進行分詞去處理,如過文章里 手機 這個詞出現頻率比較多,也就是所說的關鍵詞密度,那麼這個頁面也就會定性為手機方面的文章。
搜索引擎是通過分詞演算法來計算網頁的,如果我們能夠合理地利用分詞演算法進行網頁布局,會讓網頁將會有一個很好的得分。
中文分詞演算法大概分為三大類:
第一類是基於字元串匹配,即掃描字元串,如果發現字元串的子串和詞典中的詞相同,就算匹配,比如機械分詞方法。這類分詞通常會加入一些啟發式規則,比如「正向/反向最大匹配」,「長詞優先」等。
第二類是基於統計以及機器學習的分詞方法,它們基於人工標注的詞性和統計特徵,對中文進行建模,即根據觀測到的數據(標注好的語料)對模型參數進行訓練,在分詞階段再通過模型計算各種分詞出現的概率,將概率最大的分詞結果作為最終結果。
常見的序列標注模型有HMM和CRF。這類分詞演算法能很好處理歧義和未登錄詞問題,效果比前一類效果好,但是需要大量的人工標注數據,以及較慢的分詞速度。
第三類是通過讓計算機模擬人對句子的理解,達到識別詞的效果,由於漢語語義的復雜性,難以將各種語言信息組織成機器能夠識別的形式,目前這種分詞系統還處於試驗階段。
C. 有哪些比較好的中文分詞方案
1. 好詞典很重要m不論什麼樣的分詞方法, 優秀的詞典必不可少, 越拿老掉牙的詞典對越新的文本進行分詞, 就越會分成一團糟. 怎樣構建一個優秀的詞典, 快速發現新新詞彙.。可以看有幾篇文章,講的非常透徹明白 : 互聯網時代的社會語言學:基於SNS的文本數據挖掘。
2. 演算法跟著需求走,建議根據不同的需求選用不同的演算法, 例如, 類似知乎頭部搜索的 AutoComplete 部分, 講究的是速度快, 興趣相關( 優先找和你賬戶相關, 和可能感興趣的內容 ), 分詞演算法反而在其次了. 而像全文搜索這樣大段大段的長文字.。我覺得則更注重的是精準, 應該選一個像CRF這樣的演算法。
D. 漢語分詞演算法如何實現
常用的分詞演算法有正向最大匹配、逆向最大匹配、雙向最大匹配、最佳匹配法、最少分詞法、詞網格演算法等等。
最大匹配法(Forward Maximum Matching method, FMM法):選取包含6-8個漢字的符號串作為最大符號串,把最大符號串與詞典中的單詞條目相匹配,如果不能匹配,就削掉一個漢字繼續匹配,直到在詞典中找到相應的單詞為止。匹配的方向是從右向左。
逆向最大匹配法(Backward Maximum Matching method, BMM法):匹配方向與MM法相反,是從左向右。實驗表明:對於漢語來說,逆向最大匹配法比最大匹配法更有效。
雙向匹配法(Bi-direction Matching method, BM法):比較MM法與RMM法的切分結果,從而決定正確的切分。
最佳匹配法(Optimum Matching method, OM法):將詞典中的單詞按它們在文本中的出現頻度的大小排列,高頻度的單詞排在前,頻度低的單詞排在後,從而提高匹配的速度。
E. 文本、語音相似度演算法
前段時間公司項目用到了語音識別,圖像識別,視頻識別等,其實不能說是識別,應該說是相似度對比吧,畢竟相似度對比還上升不了到識別哈,等以後有了更深的理解再來討論修改下!這次就當做一個總結吧!
其實它的原理和視頻圖像相似度演算法類似,將一系列的向量,特徵,權重,進行合並,然後降維降到一維,其實這個演算法也就是採用降維技術,將所有的特徵都用一個唯一標識來表示.然後這個標識是經過這個演算法內部的計算,再利用海明距離計算相似度,視頻和圖片是經過漢明距離計算的
文本我們是採用simhash演算法:
1.我們給文本裡面的詞進行分詞,我們是用ik演算法,這個演算法就是while循環,讀取一行,然後調用ik智能分詞的類,智能去切割裡面的分詞;
2.根據裡面的詞頻,simhash演算法會加一個權重,當然,得詞頻達到多少個的時候才會有有權重,這也是它的缺點,一般文本數據較少的時候,他是不準確的,一般數據量在500+;演算法內部的話會將一系列的向量,特徵,權重,進行合並,然後降維降到一維,其實這個演算法也就是採用降維技術,將所有的特徵都用一個唯一標識來表示.然後這個標識是經過這個演算法內部的計算,然後得到的一個指紋簽名;
3.然後對比兩個文本的相似度就是將兩個指紋簽名進行海明距離計算,如果海明距離<8(根據業務和場景去判斷這個值,8是建議,參考)的話,表示兩個相似,小於3的話.表示兩個文本重復.
simhash演算法我們還可以做語音相似度,它的基本原理就是根據傅里葉變換處理得到聲波的形狀。
語音的坡度如果向上我們就用1表示,向下我們就用0表示,這樣的話,我們也可以用二進制碼去描述一首歌曲.得到一個唯一的指紋簽名,對比兩個音頻的相似度就是將兩個指紋簽名進行海明距離計算<8的話,我們就默認兩個音頻相似.
總結:都是把特徵降到一維,然後採用海明距離計算。計算的值小於多少時,就當做是相似。我這邊講的太淺了,實在領悟有限,時間有限,觸摸不深,等下次有新的領悟再來補充!
F. 有哪些比較好的中文分詞方案
1.每次從一個完整的句子里,按照從左向右的順序,識別出多種不同的3個詞的組合;然後根據下面的4條消歧規則,確定最佳的備選片語合;選擇備選片語合中的第1個詞,作為1次迭代的分詞結果;剩餘的2個詞繼續進行下一輪的分詞運算。採用這種辦法的好處是,為傳統的前向最大匹配演算法加入了上下文信息,解決了其每次選詞只考慮詞本身,而忽視上下文相關詞的問題。4條消歧規則包括,
1)備選片語合的長度之和最大。
2)備選片語合的平均詞長最大;
3)備選片語合的詞長變化最小;
4)備選片語合中,單字詞的出現頻率統計值最高。
CRF方法是目前公認的效果最好的分詞演算法。但,具體效果是否好,也依賴於你使用的訓練模型。
G. 文本分類的6類方法
一、中文分詞:
針對中文文本分類時,很關鍵的一個技術就是中文分詞。特徵粒度為詞粒度遠遠好於字粒度,其大部分分類演算法不考慮詞序信息,基於字粒度的損失了過多的n-gram信息。下面簡單總結一下中文分詞技術:基於字元串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法 [1]。
1,基於字元串匹配的分詞方法:
過程:這是一種基於詞典的中文分詞,核心是首先建立統一的詞典表,當需要對一個句子進行分詞時,首先將句子拆分成多個部分,將每一個部分與字典一一對應,如果該詞語在詞典中,分詞成功,否則繼續拆分匹配直到成功。
核心: 字典,切分規則和匹配順序是核心。
分析:優點是速度快,時間復雜度可以保持在O(n),實現簡單,效果尚可;但對歧義和未登錄詞處理效果不佳。
2,基於理解的分詞方法:基於理解的分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、復雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。
3,基於統計的分詞方法:
過程:統計學認為分詞是一個概率最大化問題,即拆分句子,基於語料庫,統計相鄰的字組成的詞語出現的概率,相鄰的詞出現的次數多,就出現的概率大,按照概率值進行分詞,所以一個完整的語料庫很重要。
主要的統計模型有: N元文法模型(N-gram),隱馬爾可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),條件隨機場模型(Conditional Random Fields,CRF)等。
二、文本預處理:
1,分詞: 中文任務分詞必不可少,一般使用jieba分詞,工業界的翹楚。
2,去停用詞:建立停用詞字典,目前停用詞字典有2000個左右,停用詞主要包括一些副詞、形容詞及其一些連接詞。通過維護一個停用詞表,實際上是一個特徵提取的過程,本質 上是特徵選擇的一部分。
3,詞性標註: 在分詞後判斷詞性(動詞、名詞、形容詞、副詞…),在使用jieba分詞的時候設置參數
H. 自然語言處理(NLP)的基礎難點:分詞演算法
自然語言處理(NLP,Natural Language Processing)是人工智慧領域中的一個重要方向,主要研究人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理的底層任務由易到難大致可以分為詞法分析、句法分析和語義分析。分詞是詞法分析(還包括詞性標注和命名實體識別)中最基本的任務,也是眾多NLP演算法中必不可少的第一步,其切分准確與否往往與整體結果息息相關。
金融領域分詞的難點
分詞既簡單又復雜。簡單是因為分詞的演算法研究已經很成熟了,大部分的演算法(如HMM分詞、CRF分詞)准確率都可以達到95%以上;復雜則是因為剩下的5%很難有突破,主要可以歸結於三點:
▲粒度,即切分時的最小單位,不同應用對粒度的要求不一樣,比如「融資融券」可以是一個詞也可以是兩個詞
▲歧義,比如「恆生」一詞,既可指恆生公司,又可指恆生指數
▲未登錄詞,即未出現在演算法使用的詞典中的詞,比如不常見的專業金融術語,以及各種上市公司的名稱
在金融領域中,分詞也具有上述三個難點,並且在未登錄詞方面的難點更為突出,這是因為金融類詞彙本來就多,再加上一些專有名詞不僅有全稱還有簡稱,這就進一步增大了難度。
在實際應用中,以上難點時常會造成分詞效果欠佳,進而影響之後的任務。尤其是在一些金融業務中,有許多需要與用戶交互的場景,某些用戶會用口語化的詞彙描述業務,如果分詞錯誤會影響用戶意圖的解析,這對分詞的准確性提出了更高的要求。因此在進行NLP上層應用開發時,需要對分詞演算法有一定的了解,從而在效果優化時有能力對分詞器進行調整。接下來,我們介紹幾種常用的分詞演算法及其應用在金融中的優劣。
幾種常見的分詞演算法
分詞演算法根據其核心思想主要分為兩種:
第一種是基於字典的分詞,先把句子按照字典切分成詞,再尋找詞的最佳組合方式,包括最大匹配分詞演算法、最短路徑分詞演算法、基於N-Gram model的分詞演算法等;
第二種是基於字的分詞,即由字構詞,先把句子分成一個個字,再將字組合成詞,尋找最優的切分策略,同時也可以轉化成序列標注問題,包括生成式模型分詞演算法、判別式模型分詞演算法、神經網路分詞演算法等。
最大匹配分詞尋找最優組合的方式是將匹配到的最長片語合在一起,主要的思路是先將詞典構造成一棵Trie樹(也稱為字典樹),Trie樹由詞的公共前綴構成節點,降低了存儲空間的同時可以提升查找效率。
最大匹配分詞將句子與Trie樹進行匹配,在匹配到根結點時由下一個字重新開始進行查找。比如正向(從左至右)匹配「他說的確實在理」,得出的結果為「他/說/的確/實在/理」。如果進行反向最大匹配,則為「他/說/的/確實/在理」。
這種方式雖然可以在O(n)時間對句子進行分詞,但是只單向匹配太過絕對,尤其是金融這種詞彙較豐富的場景,會出現例如「交易費/用」、「報價單/位」等情況,所以除非某些詞的優先順序很高,否則要盡量避免使用此演算法。
最短路徑分詞演算法首先將一句話中的所有詞匹配出來,構成詞圖(有向無環圖DAG),之後尋找從起始點到終點的最短路徑作為最佳組合方式,例:
我們認為圖中每個詞的權重都是相等的,因此每條邊的權重都為1。
在求解DAG圖的最短路徑問題時,總是要利用到一種性質:即兩點之間的最短路徑也包含了路徑上其他頂點間的最短路徑。比如S->A->B->E為S到E到最短路徑,那S->A->B一定是S到B到最短路徑,否則會存在一點C使得d(S->C->B)<d(S->A->B),那S到E的最短路徑也會變為S->C->B->E,這就與假設矛盾了。利用上述的最優子結構性質,可以利用貪心演算法或動態規劃兩種求解演算法:
(1)基於Dijkstra演算法求解最短路徑,該演算法適用於所有帶權有向圖,求解源節點到其他所有節點的最短路徑,並可以求得全局最優解;
(2)N-最短路徑分詞演算法,該方法是對Dijkstra演算法的擴展,在每一步保存最短的N條路徑,並記錄這些路徑上當前節點的前驅,在最後求得最優解時回溯得到最短路徑。這種方法的准確率優於Dijkstra演算法,但在時間和空間復雜度上都更大。
相較於最大匹配分詞演算法,最短路徑分詞演算法更加靈活,可以更好地把詞典中的片語合起來,能更好地解決有歧義的場景。比如上述「他說的確實在理」這句話,用最短路徑演算法的計算結果為「他/說/的/確實/在理」,避免了正向最大匹配的錯誤。但是對於詞典中未存在的詞基本沒有識別能力,無法解決金融領域分詞中的「未登錄詞」難點。
N-Gram(又稱N元語法模型)是基於一個假設:第n個詞出現與前n-1個詞相關,而與其他任何詞不相關。在此種假設下,可以簡化詞的條件概率,進而求解整個句子出現的概率。
現實中,常用詞的出現頻率或者概率肯定比罕見詞要大。因此,可以將求解詞圖最短路徑的問題轉化為求解最大概率路徑的問題,即分詞結果為「最有可能的詞的組合「。
計算詞出現的概率,僅有詞典是不夠的,還需要充足的語料,所以分詞任務已經從單純的「演算法」上升到了「建模」,即利用統計學方法結合大數據挖掘,對「語言」(句子出現的概率)進行建模。
我們將基於N-gram模型所統計出的概率分布應用到詞圖中,可以得到詞的概率圖。對該詞圖用最短路徑分詞演算法求解最大概率的路徑,即可得到分詞結果。
相較於前兩種分詞演算法,基於N-Gram model的分詞演算法對詞頻進行了統計建模,在切分有歧義的時候力求得到全局最優值,比如在切分方案「證券/自營/業務」和「證券/自/營業/務」中,統計出「證券/自營/業務」出現的概率更大,因此結果有更高的准確率。但也依然無法解決金融場景中未登錄詞的問題。
生成式模型主要有隱馬爾可夫模型(HMM,Hidden Markov Model)、樸素貝葉斯分類等。HMM是常用的分詞模型,基於Python的jieba分詞器和基於Java的HanLP分詞器都使用了HMM。
HMM模型認為在解決序列標注問題時存在兩種序列,一種是觀測序列,即人們顯性觀察到的句子,另一種是隱狀態序列,即觀測序列的標簽。假設觀測序列為X,隱狀態序列是Y,則因果關系為Y->X。因此要得到標注結果Y,必須對X的概率、Y的概率、P(X|Y)進行計算,即建立P(X,Y)的概率分布模型。
HMM演算法可以在一定程度上解決未登錄詞的問題,但生成式模型的准確率往往沒有接下來要談到的判別式模型高。
判別式模型主要有感知機、支持向量機(SVM,Support Vector Machine)、條件隨機場(CRF,Conditional Random Field)、最大熵模型等,其中感知機模型和CRF模型是常用的分詞模型。
(1)平均感知機分詞演算法
感知機是一種簡單的二分類線性模型,通過構造超平面,將特徵空間(輸入空間)中的樣本分為正負兩類。通過組合,感知機也可以處理多分類問題。但由於每次迭代都會更新模型的所有權重,被誤分類的樣本會造成很大影響,因此採用平均的方法,在處理完一部分樣本後對更新的權重進行平均。
(2)CRF分詞演算法
CRF可以看作一個無向圖模型,假設給定的標注序列為Y,觀測序列為X,CRF對條件概率P(Y|X)進行定義,而不是對聯合概率建模。
平均感知機演算法雖然速度快,但仍不夠准確。適合一些對速度要求高、對准確性要求相對不那麼高的場景。CRF分詞演算法可以說是目前最常用的分詞、詞性標注和實體識別演算法,它對未登陸詞也有很好的識別能力,是目前在速度、准確率以及未登錄詞識別上綜合表現最突出的演算法,也是我們目前所採用的解決方案,但速度會比感知機慢一些。
在NLP中,最常用的神經網路為循環神經網路(RNN,Recurrent Neural Network),它在處理變長輸入和序列輸入問題中有著巨大的優勢。LSTM(Long Short-Term Memory,長短期記憶網路)為RNN變種的一種,在一定程度上解決了RNN在訓練過程中梯度消失和梯度爆炸的問題。
目前對於序列標注任務,業內公認效果最好的模型是BiLSTM+CRF。相比於上述其它模型,雙向循環神經網路BiLSTM,可以更好地編碼當前字等上下文信息,並在最終增加CRF層,核心是用Viterbi演算法進行解碼,以得到全局最優解,避免B,S,E這種不可能的標記結果的出現,提高准確率。
神經網路分詞雖然能在准確率、未登錄詞識別上有更好的表現,但RNN無法並行計算,在速度上沒有優勢,所以該演算法通常在演算法研究、句子精確解析等對速度要求不高的場景下使用。
分詞作為NLP底層任務之一,既簡單又重要,很多時候上層演算法的錯誤都是由分詞結果導致的。因此,對於底層實現的演算法工程師,不僅需要深入理解分詞演算法,更需要懂得如何高效地實現和調試。
而對於上層應用的演算法工程師,在實際分詞時,需要根據業務場景有選擇地應用上述演算法,比如在搜索引擎對大規模網頁進行內容解析時,對分詞對速度要求大於精度,而在智能問答中由於句子較短,對分詞的精度要求大於速度。
I. NLP之文本分類
作為NLP領域最經典的使用場景之一,文本分類積累了許多的實現方法。這里我們根據是否使用深度學習方法將文本分類主要分為一下兩個大類:
隨著統計學習方法的發展,特別是在90年代後互聯網在線文本數量增長和機器學習學科的興起,逐漸形成了一套解決大規模文本分類問題的經典玩法,這個階段的主要套路是人工特徵工程+淺層分類模型。整個文本分類問題就拆分成了 特徵工程 和 分類器 兩部分。
這里的特徵工程也就是將文本表示為計算機可以識別的、能夠代表該文檔特徵的特徵矩陣的過程。在基於傳統機器學習的文本分類中,我們通常將特徵工程分為 文本預處理、特徵提取、文本表示 等三個部分。
文本預處理過程是提取文本中的關鍵詞來表示文本的過程 。中文文本預處理主要包括 文本分詞 和 去停用詞 兩個階段。
文本分詞 ,是因為很多研究表明特徵粒度為詞粒度遠好於字粒度(其實很好理解,因為大部分分類演算法不考慮詞序信息,基於字粒度顯然損失了過多「n-gram」信息)。具體到中文分詞,不同於英文有天然的空格間隔,需要設計復雜的分詞演算法。傳統分詞演算法主要有 基於字元串匹配的正向/逆向/雙向最大匹配 ; 基於理解的句法和語義分析消歧 ; 基於統計的互信息/CRF方法 。近年來隨著深度學習的應用, WordEmbedding + Bi-LSTM+CRF方法 逐漸成為主流,本文重點在文本分類,就不展開了。
而 停止詞 是 文本中一些高頻的代詞、連詞、介詞等對文本分類無意義的詞 ,通常維護一個停用詞表,特徵提取過程中刪除停用表中出現的詞,本質上屬於特徵選擇的一部分。
特徵提取包括 特徵選擇 和 特徵權重計算 兩部分。
特徵選擇的基本思路 是 根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其餘的特徵項 。常用的評價有:文檔頻率、互信息、信息增益、χ²統計量等。
特徵權重計算 主要是經典的TF-IDF方法及其擴展方法。 TF-IDF的主要思想 是 一個詞的重要度與在類別內的詞頻成正比,與所有類別出現的次數成反比 。
文本表示的目的是把文本預處理後的轉換成計算機可理解的方式,是決定文本分類質量最重要的部分。傳統做法常用 詞袋模型 (BOW, Bag Of Words)或 向量空間模型 (Vector Space Model),最大的 不足 是忽略文本上下文關系,每個詞之間彼此獨立,並且無法表徵語義信息。
大部分機器學習方法都在文本分類領域有所應用,比如樸素貝葉斯分類演算法(Naïve Bayes)、KNN、SVM、最大熵和神經網路等等。
FastText 是Facebook AI Research在16年開源的一種文本分類器。 其 特點 就是 fast 。相對於其它文本分類模型,如 SVM , Logistic Regression 等模型,fastText能夠在保持分類效果的同時,大大縮短了訓練時間。
FastText方法包含三部分, 模型架構 , 層次SoftMax 和 N-gram特徵 。
FastText模型架構和 Word2Vec 中的 CBOW 模型很類似,因為它們的作者都是Facebook的科學家Tomas Mikolov。不同之處在於,FastText 預測標簽 ,而CBOW 模型 預測中間詞 。
TextCNN 是利用卷積神經網路對文本進行分類的演算法,它是由 Yoon Kim 在2014年在 「 Convolutional Neural Networks for Sentence Classification 」 一文中提出的。詳細的原理圖如下。
特徵 :這里的特徵就是詞向量,有 靜態(static) 和 非靜態(non-static) 方式。static方式採用比如word2vec預訓練的詞向量,訓練過程不更新詞向量,實質上屬於遷移學習了,特別是數據量比較小的情況下,採用靜態的詞向量往往效果不錯。non-static則是在訓練過程中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預訓練(pre-train)的word2vec向量初始化詞向量,訓練過程中調整詞向量,能加速收斂,當然如果有充足的訓練數據和資源,直接隨機初始化詞向量效果也是可以的。
通道(Channels) :圖像中可以利用 (R, G, B) 作為不同channel,而文本的輸入的channel通常是不同方式的embedding方式(比如 word2vec或Glove),實踐中也有利用靜態詞向量和fine-tunning詞向量作為不同channel的做法。
一維卷積(conv-1d) :圖像是二維數據,經過詞向量表達的文本為一維數據,因此在TextCNN卷積用的是一維卷積。一維卷積帶來的問題是需要設計通過不同 filter_size 的 filter 獲取不同寬度的視野。
Pooling層: 利用CNN解決文本分類問題的文章還是很多的,比如這篇 A Convolutional Neural Network for Modelling Sentences 最有意思的輸入是在 pooling 改成 (dynamic) k-max pooling,pooling階段保留 k 個最大的信息,保留了全局的序列信息。
參考文獻
J. 有哪些比較好的中文分詞方案
中文分詞演算法大概分為兩大類
a.第一類是基於字元串匹配,即掃描字元串,如果發現字元串的子串和詞相同,就算匹配。
這類分詞通常會加入一些啟發式規則,比如「正向/反向最大匹配」, 「長詞優先」 等策略。
這類演算法優點是速度塊,都是O(n)時間復雜度,實現簡單,效果尚可。
也有缺點,就是對歧義和未登錄詞處理不好。
b.第二類是基於統計以及機器學習的分詞方式
這類分詞基於人工標注的詞性和統計特徵,對中文進行建模,即根據觀測到的數據(標注好的語料)對模型參數進行估計,即訓練。 在分詞階段再通過模型計算各種分詞出現的概率,將概率最大的分詞結果作為最終結果。常見的序列標注模型有HMM和CRF。
這類分詞演算法能很好處理歧義和未登錄詞問題,效果比前一類效果好,但是需要大量的人工標注數據,以及較慢的分詞速度。