文本分類器
python分類器環(huán)境安裝
安裝NLTK
下載地址:http://www.nltk.org/
分類器介紹
分類器是模式識別中的一種應(yīng)用,模式識別是自然語言處理的一個核心部分。
分類任務(wù)是對給定的輸入,選擇正確的"類別標(biāo)簽"。并且輸入和所有其他輸入隔離。
由于分類器的各自特點(diǎn)分為以下幾類:
有監(jiān)督分類器
如果分類的標(biāo)簽集是預(yù)先定義的,稱為有監(jiān)督分類器。
例如:
- 垃圾郵件的判斷。
- 根據(jù)名字的最后一個字母,分辨性別。
如果分類的建立是根據(jù)每個輸入的正確標(biāo)簽的訓(xùn)練預(yù)料,稱為有監(jiān)督分類。
有監(jiān)督分類器框架:
label和features在配對后輸入機(jī)器學(xué)習(xí)算法
簡單應(yīng)用:
性別分類器:
根據(jù)英文姓名的最后一個字母,男女名字有明顯區(qū)分的特點(diǎn),用來鑒別這個人的性別。
性別猜測:
from nltk.corpus import names
import random
import nltk
def gender_features(word):
return {'last_letter': word[-1]}
names = ([(name, 'male') for name in names.words('male.txt')] +
[(name, 'female') for name in names.words('female.txt')])
random.shuffle(names)
featuresets = [(gender_features(n), g) for (n, g) in names]
train_set = featuresets[500:]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print classifier.classify(gender_features('Trinity'))
輸出:
female
評估分類器:
from nltk.corpus import names
import random
import nltk
def gender_features(word):
return {'last_letter': word[-1]}
names = ([(name, 'male') for name in names.words('male.txt')] +
[(name, 'female') for name in names.words('female.txt')])
random.shuffle(names)
featuresets = [(gender_features(n), g) for (n, g) in names]
train_set, test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
radio = nltk.classify.accuracy(classifier, test_set)
print radio
輸出:
0.744
查看區(qū)分效果最好的特征:
from nltk.corpus import names
import random
import nltk
def gender_features(word):
return {'last_letter': word[-1]}
names = ([(name, 'male') for name in names.words('male.txt')] +
[(name, 'female') for name in names.words('female.txt')])
random.shuffle(names)
featuresets = [(gender_features(n), g) for (n, g) in names]
train_set, test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
classifier.show_most_informative_features(5)
輸出結(jié)果:
Most Informative Features
last_letter = 'a' female : male = 35.8 : 1.0
last_letter = 'k' male : female = 31.7 : 1.0
last_letter = 'f' male : female = 15.9 : 1.0
last_letter = 'p' male : female = 11.2 : 1.0
last_letter = 'd' male : female = 9.9 : 1.0
這些比率稱為似然比,用來比較特征和分類結(jié)果的相關(guān)關(guān)系。如姓名末尾為"a"的男女比例是35.8:1,可以看出這個特征的區(qū)分度比較高。
樸素貝葉斯分類器
算法原理
先計算每個標(biāo)簽的先驗(yàn)概率,計算方法為每個標(biāo)簽出現(xiàn)在訓(xùn)練數(shù)據(jù)中的頻率。
計算公式:
P1:每個標(biāo)簽的先驗(yàn)概率,計算方式:每個標(biāo)簽出現(xiàn)在訓(xùn)練集里的頻率。
$$
P1(Label)=Freq/DocCount
$$
P2:每個標(biāo)簽的似然得分的和與
決策樹
簡介
決策樹可以類比為輸入值選擇標(biāo)簽的流程圖,流程圖由檢查特征值的決策節(jié)點(diǎn)和分配標(biāo)簽的葉子節(jié)點(diǎn)組成。流程圖的初始節(jié)點(diǎn)稱為根節(jié)點(diǎn)。
姓名預(yù)測性別決策樹:
算法原理
首先定義決策樹樁:即只有一個決策節(jié)點(diǎn)的決策樹,基于單個特征決定輸入的分類。每個可能的特征值一個葉子,并分配一個類標(biāo)簽。
建立的決策樹樁的方法:為每個可能的特征建立一個決策樹樁,看哪個決策樹樁在訓(xùn)練數(shù)據(jù)有最高的準(zhǔn)確度。作為決策樹的根節(jié)點(diǎn)。
決策樹的生長:
檢查選擇出來的決策樹樁,在訓(xùn)練集上檢查每個葉子節(jié)點(diǎn)的準(zhǔn)確度,沒達(dá)到足夠準(zhǔn)確度的葉子被新的決策樹樁替換,然后再該路徑的訓(xùn)練子集訓(xùn)練新的決策樹樁,查看新決策樹樁每個葉子節(jié)點(diǎn)的準(zhǔn)確度,知道所有的葉子節(jié)點(diǎn)滿足準(zhǔn)確度要求。
評價標(biāo)準(zhǔn)
熵:在分類器中用來衡量數(shù)據(jù)集中無序的程度,比如訓(xùn)練集中不同的標(biāo)簽越混亂,熵越高,標(biāo)簽越趨向同類,熵越低。
標(biāo)簽數(shù)據(jù)集熵的計算公式如下:
$$
H = Σl ∈ labelsP(l) × log2P(l)
$$
如果訓(xùn)練集中全是相同的標(biāo)簽,如"姓名-性別"數(shù)據(jù)集,如P(male)=1,P(femal)=0.P(femal)對熵的貢獻(xiàn)為0,由于log2P(male)=0,對熵的貢獻(xiàn)也為0,所以整體的熵為0."姓名-性別"標(biāo)簽數(shù)據(jù)集的熵分布函數(shù)圖如下:
可以看出,P(female)=0.5時,熵最大。也就是說類別越無序,熵越大。
信息增益:
在分類器中引入了熵之后,可以計算出分類前后的無序程度,也就是熵的大小。分類前后熵的差值就是信息增益。如果信息增益越大高,決策樹樁的分類效果越好。
算法特點(diǎn)
算法特點(diǎn)
- 簡單明了,容易理解。適合多層次的分類。
- 分支會劃分訓(xùn)練數(shù)據(jù),流轉(zhuǎn)到低節(jié)點(diǎn)的訓(xùn)練數(shù)據(jù)集比較少,導(dǎo)致這些決策節(jié)點(diǎn)過擬合訓(xùn)練集。
- 強(qiáng)迫特征按照一定的順序進(jìn)行檢查,適合多層次的分類檢查。而相對獨(dú)立的特征區(qū)分度不好,可使用貝葉斯分類方法解決,允許特征“并行”生效。
優(yōu)化方法:
- 訓(xùn)練數(shù)據(jù)變小時停止分裂節(jié)點(diǎn)。
- 長出一顆完整決策樹時進(jìn)行枝剪,剪去信息增益值低的節(jié)點(diǎn)。
- 采用貝葉斯分類解決相對獨(dú)立的特征。
最大熵分類器
文本信息提取
信息提取系統(tǒng)的流水線結(jié)構(gòu)
就目前而言,我們需要做的是提取句子中的實(shí)體,用來對文檔進(jìn)行分類。
主要通過以下3步實(shí)現(xiàn):
分詞
中文分詞算法包括兩類
- 在詞典的基礎(chǔ)上對語句進(jìn)行子串匹配,優(yōu)點(diǎn)是時間復(fù)雜度低O(n),缺點(diǎn)是對歧義和詞庫里沒有的詞,分詞效果不好。比如:IK,庖丁。
- 基于統(tǒng)計和機(jī)器學(xué)習(xí)的方法分詞,基于人工標(biāo)注的詞性和統(tǒng)計特征,訓(xùn)練模型,然后通過模型計算各種分詞的概率,把概率最大分詞結(jié)果作為分詞結(jié)果,常見的序列標(biāo)注模型有HMM和CRF。
詞性標(biāo)注
命名實(shí)體識別
采用的技術(shù)為分塊(chunking)
每一個塊是分詞的一個子集,并且分塊的片段不重疊。
? 分詞和詞性標(biāo)注以及分塊
示例:
名詞短語分塊
NP塊的信息來源是詞性標(biāo)注。
分塊方法:
- 正則表達(dá)式分塊
- N-gram方法
詞性標(biāo)注
電商分類識別
在已有電商購物分類的情況下,如何把用戶關(guān)鍵詞輸入,映射到商品分類下。使得搜索結(jié)果約束在相關(guān)的分類下,以此提高召回率。
流程圖如下:
? 圖:關(guān)鍵詞匹配分類樹的流程圖
如:用戶輸入的關(guān)鍵詞如:"華碩(ASUS)ROG STRIX-GTX1080TI-O11G-GAMING 1569-1708MHz 11G/11100MHz GDDR5X PCI-E3.0顯卡"
分類樹節(jié)點(diǎn)匹配法
通過自定義關(guān)鍵詞抽取,自定義指的是詞庫為所有的商品的分類詞匯。
將提取的關(guān)鍵詞在分類樹上做映射,映射的方式可以是全詞匹配(準(zhǔn)確度會高一些)?;蛘卟捎迷~向量的方式找最相關(guān)的分類節(jié)點(diǎn)(準(zhǔn)確度不可控,計算量大)。
然后將上圖中匹配上的節(jié)點(diǎn)回路路徑,作為一種分類情形。收集所有可能的回路,并進(jìn)行路徑合并。產(chǎn)生所有的分類過濾情形,取最多3種(可配置)情形,所謂類別過濾條件,結(jié)合標(biāo)題產(chǎn)生搜索結(jié)果。
這種方式經(jīng)過測試數(shù)據(jù)集的驗(yàn)證,準(zhǔn)確率為0.2908883847884619,可以看出分類的準(zhǔn)確率并不高,不到三成。
基于統(tǒng)計方法
先把類別分級別,從第一級開始分類。
比如“電腦辦公”分類,統(tǒng)計這個大分類下的所有商品的名稱分詞后的詞語分布。
比如
? 商品名稱分詞-詞頻統(tǒng)計圖
可以看到,商品名稱分詞后的詞語,會對詞庫的詞頻貢獻(xiàn)分?jǐn)?shù)。
算法原理:
假設(shè)"電腦辦公"的商品名稱,包含大量的“華碩”這個詞語,并且其他分類很少有“華碩”這個詞,可以總結(jié)出:商品名稱里的“華碩“關(guān)鍵詞,是”電腦辦公“分類里相對特有的,相比其他分類,這個詞有很好的類別區(qū)分效果。
把一個分類類比成一份文檔,所有的商品名稱組建成文檔里的文字。分類的匹配就變成了普通的文檔匹配了,可以用TF-IDF算法進(jìn)行分類匹配。
影響因子:
- 詞頻(Term frequency):在訓(xùn)練(索引)的時候構(gòu)建的分類下詞語的統(tǒng)計數(shù)。即Term 在文檔中出現(xiàn)的個數(shù),計算方法函數(shù)是:
public float tf(float freq) {
return (float)Math.sqrt(freq);
}
有個文檔叫做”this is book about chinese book”, 我的搜索項(xiàng)為”book”,那么這個搜索項(xiàng)對應(yīng)文檔的freq就為2,那么tf值就為根號2,即1.4142135。Term的freq值是在索引期間存儲的。
- 逆文檔頻率:(Inerse document frequency),基于Term的一個因子,表示Term在所有文檔里的稀有程度,以此提升包含稀有詞的文檔的得分。默認(rèn)實(shí)現(xiàn):
public float idf(long docFreq, long numDocs) {
return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
}
其中:
docFreq 指的是Term出現(xiàn)的文檔數(shù),就是有多少個文檔符合這個搜索
numDocs 指的是索引庫中有多少個文檔。
- 文檔權(quán)重(Document boost):在這個應(yīng)用場景下也叫分類權(quán)重。設(shè)置方法可以根據(jù)經(jīng)驗(yàn)值 來設(shè)置不同分類的權(quán)重。
- 調(diào)整因子(Coord):關(guān)鍵詞分詞后,出現(xiàn)在當(dāng)前分類文檔中的個數(shù)。
計算方法函數(shù):
public float coord(int overlap, int maxOverlap) {
return overlap / (float)maxOverlap;
}
其中:
overlap:query中檢索命中term的個數(shù)
maxOverlap:query中總共的term個數(shù)
比如:
檢索''english book”, 現(xiàn)在有一個文檔是”this is an chinese book”。那么,這個搜索對應(yīng)這個文檔的overlap為1(因?yàn)槠ヅ淞薭ook),而maxOverlap為2(因?yàn)闄z索條件有兩個book和english)。最后得到的這個搜索對應(yīng)這個文檔的coord值為0.5。
Lucene Classifier
計算每個標(biāo)簽的分值
- 標(biāo)簽的先驗(yàn)概率:
$$
p(c)=log2freq(label)-log2sum(labels)
$$
freq(label)表示整個樣本空間里label標(biāo)簽出現(xiàn)的次數(shù)。
sum(lables)表示樣本空間的大小。
- 標(biāo)簽的似然估計:
$$
p(w|c)=wordFreqForClass(word,c)/textTermFreqForClass(c)
$$
wordFreqForClass(word,c) 函數(shù)計算方法:search with text:word AND class:c 表示標(biāo)簽c下包含word的文檔數(shù)
textTermFreqForClass(c)函數(shù)計算方法:c標(biāo)簽下的所有詞總數(shù)+總文檔數(shù)