文本分類

1、樸素貝葉斯

原理:

理論上,概率模型分類器是一個條件概率模型:

[公式]

獨立變量C有若干類別,條件依賴於若干特徵變量,但問題在於如果特徵數量n的維度較大或者每個特徵能取大量值時,基於概率模型列出概率表變得不現實。所以我們修改這個模型使之變得可行。 根據貝葉斯公式有以下式子:

[公式]

或者,這樣表達比較簡潔明瞭:

[公式]

其中, [公式] 爲先驗概率, [公式] 爲後驗概率;可以這麼理解,再不知道需要預測的樣本任何特徵的時候,先判斷該樣本爲某個類別的概率爲 [公式] 爲,再知道樣本的特徵之後,乘上 [公式] 之後,得到該樣本再知道 [公式] 之後,樣本屬於這個類別的條件概率。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_selection import mutual_info_classif
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
import jieba

text = ['我喜歡吃蘋果',
        '我愛吃香蕉',
        '他不想吃桃子',
        '我想去上海玩',
        '她遊玩的地點在重慶',
        '他正在北京玩']
category = [1,1,1,2,2,2]
corpus = []
for t in text:
    corpus.append(" ".join(list(jieba.cut(t))))
print(corpus)

tfidf = TfidfVectorizer()
X_train, X_test, y_train, y_test = train_test_split(corpus,category,test_size=0.25,random_state=50)
print(X_train)
print(X_test)

X_train = tfidf.fit_transform(X_train)
X_test = tfidf.transform(X_test)
mnb = MultinomialNB()
mnb.fit(X_train,y_train)
predict = mnb.predict(X_test)
print(classification_report(y_test,predict))

output:

['我 喜歡 吃 蘋果', '我 愛 吃 香蕉', '他 不想 吃 桃子', '我 想 去 上海 玩', '她 遊玩 的 地點 在 重慶', '他 正在 北京 玩']
['我 愛 吃 香蕉', '我 想 去 上海 玩', '他 正在 北京 玩', '我 喜歡 吃 蘋果']
['她 遊玩 的 地點 在 重慶', '他 不想 吃 桃子']
             precision    recall  f1-score   support

          1       0.50      1.00      0.67         1
          2       0.00      0.00      0.00         1

avg / total       0.25      0.50      0.33         2

skearn naive bayes : https://scikit-learn.org/stable/modules/naive_bayes.html#naive-bayes

2、SVM

原理:

SVM學習的基本想法是求解能夠正確劃分訓練數據集並且幾何間隔最大的分離超平面。如下圖所示, [公式] 即爲分離超平面,對於線性可分的數據集來說,這樣的超平面有無窮多個(即感知機),但是幾何間隔最大的分離超平面卻是唯一的。

支持向量機的優點是:

  • 在高維空間有效。
  • 在尺寸數量大於樣本數量的情況下仍然有效。
  • 在決策函數中使用訓練點的子集(稱爲支持向量),因此它也具有內存效率。
  • 多功能:可以爲決策功能指定不同的內核功能。提供了通用內核,但也可以指定自定義內核。

支持向量機的缺點包括:

  • 如果要素的數量遠遠大於樣本數量,請避免在選擇內核函數時過度擬合,並且正則化項是至關重要的。
  • SVM不直接提供概率估計,這些是使用昂貴的五重交叉驗證計算的(參見下面的分數和概率
from sklearn.svm import SVC

svc = SVC(kernel='sigmoid',tol=0.0001,verbose=True)
svc.fit(X_train,y_train)
predict = svc.predict(X_test)
print(classification_report(y_test,predict))

sklearn 官網有一個關於文本分類的例子,可以參考一下:

https://scikit-learn.org/stable/auto_examples/text/plot_document_classification_20newsgroups.html#sphx-glr-auto-examples-text-plot-document-classification-20newsgroups-py

skearn SVM : https://scikit-learn.org/stable/modules/svm.html

3、LDA

3.1 共軛分佈

在共軛先驗分佈(Conjugate prior distribution)之前,先要了解貝葉斯公式。

先驗分佈:在抽取樣本X之前,需要對樣本類別Y有所瞭解的信息,通常稱爲先驗信息。對於樣本類別Y的分佈稱爲先驗分佈

後驗分佈:在抽取樣本X,得到樣本信息的情況下關於樣本類別Y的概率分佈稱爲後驗信息。

共軛先驗分佈:在貝葉斯概率理論中,如果後驗概率和先驗概率滿足同樣的分佈律(形式相同,參數不同)。那麼,先驗分佈和後驗分佈被叫做共軛分佈,同時,先驗分佈叫做似然函數的共軛先驗分佈。

3.2 pLSA

LSA :   潛在語義分析是主題建模的基礎技術之一。其核心思想是把我們所擁有的文檔-術語矩陣分解成相互獨立的文檔-主題矩陣和主題-術語矩陣。

LSA 方法快速且高效,但它也有一些主要缺點:

  • 缺乏可解釋的嵌入(我們並不知道主題是什麼,其成分可能積極或消極,這一點是隨機的)
  • 需要大量的文件和詞彙來獲得準確的結果
  • 表徵效率低

pLSA : 概率潛在語義分析,採取概率方法替代 SVD 以解決問題。其核心思想是找到一個潛在主題的概率模型,該模型可以生成我們在文檔-術語矩陣中觀察到的數據。特別是,我們需要一個模型 P(D,W),使得對於任何文檔 d 和單詞 w,P(d,w) 能對應於文檔-術語矩陣中的那個條目。

3.3 LDA

LDA:潛在狄利克雷分佈,是 pLSA 的貝葉斯版本。它使用狄利克雷先驗來處理文檔-主題和單詞-主題分佈,從而有助於更好地泛化。

3.4 lda2vec (深度學習)

在單詞級別上,我們通常使用諸如 word2vec 之類的東西來獲取其向量表徵。lda2vec 是 word2vec 和 LDA 的擴展,它共同學習單詞、文檔和主題向量。lda2vec 專門在 word2vec 的 skip-gram 模型基礎上建模,以生成單詞向量。skip-gram 和 word2vec 本質上就是一個神經網絡,通過利用輸入單詞預測周圍上下文詞語的方法來學習詞嵌入。

參考文章:

https://zhuanlan.zhihu.com/p/37873878

https://msd.misuland.com/pd/3148108429789237898

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章