文本分類器

文本分類器

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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容