文本分類的定義
文本分類是現在非常熱門的一個研究領域,也是機器學習中最為重要最為基礎的組成部分。文本分類有各種各樣的方法,有些簡單易懂,有些看上去非常復雜。其實只要搞清楚他們背后的原理,理解文本分類並不是一件很困難的事情。今天先從宏觀上介紹一下文本分類,后續會在其他博文中分門別類對文本分類這一課題進行深入的分析,敬請關注。也希望各位高手們多提建議,畢竟我也是菜鳥一個。
文本分類就是將一篇文章歸入已有的幾個類別當中,這里注重強調2點:
1 要分類的類別必須是事先確定的,並且短時間內不會發生改變。
2 分類的類別並不一定唯一。
文本分類的方法
1 人工制訂規則
這種方法最大的弊端就是需要牽扯太大的人力,成本極高。對人的要求也極高,很難通過文章抽象出屬於某個分類的規則。而且這種方法靈活性太小,很難適應語言的發展,因此極少有人使用。
2 統計學方法
統計學習方法的基本思想就是:讓機器像人類一樣自己來通過對大量同類文檔的觀察來自己總結經驗,作為今后分類的依據。統計學習方法需要一批由人工進行了准確分類的文檔作為學習的材料(稱為訓練集,注意由人分類一批文檔比從這些文檔中總結出准確的規則成本要低得多),計算機從這些文檔重挖掘出一些能夠有效分類的規則,這個過程被形象的稱為訓練,而總結出的規則集合常常被稱為分類器。訓練完成之后,需要對計算機從來沒有見過的文檔進行分類時,便使用這些分類器來進行。
統計學習方法
之前已經提到過,這種方法就是讓計算機自己去學習已經分類好的訓練集,然而計算機不是人類,無法按人類理解文章那樣來學習,這就給文本分類提出了一個重要的課題。因此如何表示一篇文章,讓計算機能夠理解就成了重中之重。我們知道,文章的語義信息是很難用計算機可以識別的形式所描述的,因此我們只能退而求其次,用文章中所包含的較低級別的詞匯信息來表示文檔。事實證明,這種做法的效果也是不錯的。
進一步的,不光是包含哪些詞很重要,這些詞出現的次數對分類也很重要。
再確定如何表示文檔之后,就要討論如何讓計算機去學習文檔了,也就是我們說的訓練。
在訓練過程中,每一個實例被稱為一個樣本,這些樣本是由人工進行分類處理過的文檔集合,計算機認為這些數據的分類是絕對正確的,可以信賴的。之后,讓計算機去觀察學習這些樣本,來猜出一個可能的分類規則,在機器學習中,這種猜測出來的規則稱為假設。然后當遇到要分類的文檔時,就是用我們的假設來進行判斷,並為文檔進行分類。
舉個例子說明,人們評價一輛車是否是“好車”的時候,可以看作一個分類問題。我們也可以把一輛車的所有特征提取出來轉化為向量形式。在這個問題中詞典向量可以為: D=(價格,最高時速,外觀得分,性價比,稀有程度)
保時捷:vp=(200萬,320,9.5,3,9)
花冠: vt=(15萬,220,6.0,8,3)
不同的人會有不同的評價標准,如果以性價比來看,很顯然花冠是首選。如果考慮時速,外觀和時尚,當然要選保時捷了。可見,對同一個分類問題,用同樣的表示形式(同樣的文檔模型),但因為關注數據不同方面的特性而可能得到不同的結論。這種對文檔數據不同方面側重的不同導致了原理和實現方式都不盡相同的多種方法,每種方法也都對文本分類這個問題本身作了一些有利於自身的假設和簡化,這些假設又接下來影響着依據這些方法而得到的分類器最終的表現。
常用的分類方法
分類方法可以說是機器學習領域人們研究的最多的一個部分,目前也有很多成熟的算法。比如決策樹,Rocchio,朴素貝葉斯,神經網絡,支持向量機,線性最小平方擬合,kNN,遺傳算法,最大熵等等,下面就挑選幾個跟大家簡單介紹一下,以后的博文會陸續的對其中的一些方法做詳細的闡述,希望大家常來看看,歡迎拍磚。
1 Rocchio算法
這個方法的思想就是把一個分類中的所有文檔的向量去平均值,得到一個新的向量,相當於分類的質心。再有新文檔需要判斷的時候,比較新文檔和質心有多么相像,也就是計算新文檔和質心的距離。通過距離的遠近判斷是否屬於該分類。另外有改進的Rocchio算法除了考慮所有正樣本的質心之外,還考慮不屬於該文檔的所有文檔的質心。這樣一來,新文檔應該接近正樣本的質心,遠離負樣本的質心。
該算法有致命的缺陷:
首先該算法假設所有同類文檔都是聚集在一個質心的周圍,這顯然沒有任何依據,事實證明也並非如此。
另外一個弊端是該算法認為訓練數據絕對正確,這在很多應用中是無法保證的。
2 朴素貝葉斯算法
貝葉斯算法關注的是文檔屬於某類別概率。文檔屬於某個類別的概率等於文檔中每個詞屬於該類別的概率的綜合表達式。而每個詞屬於該類別的概率又在一定程度上 可以用這個詞在該類別訓練文檔中出現的次數(詞頻信息)來粗略估計,因而使得整個計算過程成為可行的。使用朴素貝葉斯算法時,在訓練階段的主要任務就是估 計這些值。
同樣的,該方法也有一定的缺陷:
首先,P(d| Ci)之所以能展開成(式1)的連乘積形式,就是假設一篇文章中的各個詞之間是彼此獨立的,其中一個詞的出現絲毫不受另一個詞的影響。但這顯然不對,即使不是語言學專家的我們也知道,詞語之間有明顯的所謂“共現”關系,在不同主題的文章中,可能共現的次數或頻率有變化,但彼此間絕對談不上獨立。
其次,使用某個詞在某個類別訓練文檔中出現的次數來估計P(wi|Ci)時,只在訓練樣本數量非常多的情況下才比較准確,而需要大量樣本的要求不僅給前期人工分類的工作帶來更高要求(從而成本上升),在后期由計算機處理的時候也對存儲和計算資源提出了更高的要求。
3 kNN算法
kNN算法則又有所不同,在kNN算法看來,訓練樣本就代表了類別的准確信息,因此此算法產生的分類器也叫做“基於實例”的分類器,而不管樣本是使用什么特征表示的。其基本思想是在給定新文檔后,計算新文檔特征向量和訓練文檔集中各個文檔的向量的相似度,得到K篇與該新文檔距離最近最相似的文檔, 根據這K篇文檔所屬的類別判定新文檔所屬的類別(注意這也意味着kNN算法根本沒有真正意義上的“訓練”階段)。這種判斷方法很好的克服了Rocchio 算法中無法處理線性不可分問題的缺陷,也很適用於分類標准隨時會產生變化的需求(只要刪除舊訓練文檔,添加新訓練文檔,就改變了分類的准則)。
kNN唯一的也可以說最致命的缺點就是判斷一篇新文檔的類別時,需要把它與現存的所有訓練文檔全都比較一遍,這個計算代價並不是每個系統都能夠承受的 (比如我將要構建的一個文本分類系統,上萬個類,每個類即便只有20個訓練樣本,為了判斷一個新文檔的類別,也要做20萬次的向量比較!)。一些基於 kNN的改良方法比如Generalized Instance Set就在試圖解決這個問題。
特征選擇的方法
大家可能會覺得奇怪,正說着文本分類方法,怎么突然就跳到特征選擇上面了。這是因為特征選擇在文本分類乃至機器學習中都起到了至關重要的作用。特征選擇的好,既可以充分利用訓練數據,又可以將數據量進行有效的精簡,從而減少計算代價,有效的防治過擬合和欠擬合的發生。常用的特征選擇算法有互信息,文檔頻率,信息增益,開方檢驗等。具體的特征選擇方法我會在以后的博文中進行說明,大家一起期待吧。
今天就寫到這里,大概介紹了文本分類的定義,分類和常用算法,以后會針對不同的分類進行單獨詳細的講解。