sklearn 基本的文本分類


目的

其實,說白了就是人想知道這個文檔是做什么的。首先給每篇文章一個標簽、構建文檔的特征,然后通過機器學習算法來學習特征和標簽之間的映射關系,最后對未知的文本進行標簽的預測。
在海量信息的互聯網時代,文本分類尤其重要。sklearn作為即可學術研究,也可構建產品原型,甚至發布商用產品的機器學習包,里面封裝了一些常用的文本操作的算法。這里慢慢的記錄一下。

訓練數據

以后有機會我爬取一些中文的文本,但現在我們先使用sklearn提供的新聞媒體的數據。
代碼如下。

categories = ['alt.atheism', 'soc.religion.christian',
              'comp.graphics', 'sci.med']

from sklearn.datasets import fetch_20newsgroups
twenty_train = fetch_20newsgroups(subset='train',
    categories=categories, shuffle=True, random_state=42)
twenty_test = fetch_20newsgroups(subset='test',
    categories=categories, shuffle=True, random_state=42)

這里只取5個類別的新聞媒體(為了計算速度)。
twenty_train, twenty_test封裝了文本和target(label,使用0、1、2、3表示)

構建特征BOW

Bag of Words是文本分類入門級的特征,很容易理解,后文會有簡略的介紹。代碼如下。

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
X_train_counts.shape

改代碼的輸出為:
(2257, 35788)
也就是說,共有2257篇訓練文章,詞典的大小為35788維。
CountVectorizer類的參數也很好理解,比較重要的幾個
stop_words=,指定的停用詞;
max_df=,超過這個頻率的詞不作為詞典詞,默認1.0;
min_df=,小於這個頻率的詞不作為次電磁,默認1(至少出現在一篇文章中);
max_features=,詞典最多有多少個詞,默認None,如果指定了,則通過詞頻來排序取舍。
vocabulary=,指定的詞典。

構建TF-IDF特征

代碼如下

from sklearn.feature_extraction.text import TfidfTransformer
tf_transformer = TfidfTransformer().fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
X_train_tf.shape

簡單的說,TF-IDF特征將每個詞在當前文檔中的重要程度給計算出來了,而且歸一化。后面會有簡略的介紹。

構建朴素貝葉斯分類器

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tf, twenty_train.target)

在測試集上的結果

predicted = clf.predict(tf_transformer.transform(count_vect.transform(twenty_test.data)))

from sklearn import metrics
print(metrics.classification_report(twenty_test.target, predicted,
    target_names=twenty_test.target_names))

結果如下所示。

                        precision    recall  f1-score   support

           alt.atheism       0.97      0.60      0.74       319
         comp.graphics       0.96      0.89      0.92       389
               sci.med       0.97      0.81      0.88       396
soc.religion.christian       0.65      0.99      0.78       398

           avg / total       0.88      0.83      0.84      1502

總結

基本的文本分類的流程基本就是這樣,后續就是使用更加合適的分詞、詞典、特征的構建方法,使用更加合適的分類器等。具體問題具體分析。

Bag of Word

Bag of words模型最初被用在文本分類中,將文檔表示成特征矢量。它的基本思想是假定對於一個文本,忽略其詞序和語法、句法,僅僅將其看做是一些詞匯的集合,而文本中的每個詞匯都是獨立的。簡單說就是講每篇文檔都看成一個袋子(因為里面裝的都是詞匯,所以稱為詞袋,Bag of words即因此而來),然后看這個袋子里裝的都是些什么詞匯,將其分類。如果文檔中豬、馬、牛、羊、山谷、土地、拖拉機這樣的詞匯多些,而銀行、大廈、汽車、公園這樣的詞匯少些,我們就傾向於判斷它是一篇描繪鄉村的文檔,而不是描述城鎮的。舉個例子,有如下兩個文檔:

文檔一:Bob likes to play basketball, Jim likes too.

文檔二:Bob also likes to play football games.

基於這兩個文本文檔,構造一個詞典:

Dictionary = {1:”Bob”, 2. “like”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”,8. “games”, 9. “Jim”, 10. “too”}。

這個詞典一共包含10個不同的單詞,利用詞典的索引號,上面兩個文檔每一個都可以用一個10維向量表示(用整數數字0~n(n為正整數)表示某個單詞在文檔中出現的次數):

1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]

2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]

向量中每個元素表示詞典中相關元素在文檔中出現的次數(下文中,將用單詞的直方圖表示)。不過,在構造文檔向量的過程中可以看到,我們並沒有表達單詞在原來句子中出現的次序(這是本Bag-of-words模型的缺點之一,不過瑕不掩瑜甚至在此處無關緊要)。

if-idf詞頻倒排索引

TFIDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
在一份給定的文件里,詞頻(term frequency,TF)指的是某一個給定的詞語在該文件中出現的頻率。這個數字是對詞數(term count)的歸一化,以防止它偏向長的文件。(同一個詞語在長文件里可能會比短文件有更高的詞數,而不管該詞語重要與否。)對於在某一特定文件里的詞語 ti 來說,它的重要性可表示為:

Paste_Image.png
其中,分子表示單詞i在文檔j中出現的次數,分母表示文檔j的所有單詞個數。
逆向文件頻率(inverse document frequency,IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到:

Paste_Image.png
其中,分子位語料庫文檔總的個數;
分母為用於單詞i的文檔的個數。

最終,
Paste_Image.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM