目的
其實,說白了就是人想知道這個文檔是做什么的租谈。首先給每篇文章一個標簽篮奄、構建文檔的特征,然后通過機器學習算法來學習特征和標簽之間的映射關系割去,最后對未知的文本進行標簽的預測窟却。
在海量信息的互聯(lián)網(wǎng)時代,文本分類尤其重要呻逆。sklearn作為即可學術研究夸赫,也可構建產(chǎn)品原型,甚至發(fā)布商用產(chǎn)品的機器學習包咖城,里面封裝了一些常用的文本操作的算法茬腿。這里慢慢的記錄一下呼奢。
訓練數(shù)據(jù)
以后有機會我爬取一些中文的文本,但現(xiàn)在我們先使用sklearn提供的新聞媒體的數(shù)據(jù)切平。
代碼如下握础。
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類的參數(shù)也很好理解,比較重要的幾個
stop_words=,指定的停用詞絮供;
max_df=衣吠,超過這個頻率的詞不作為詞典詞,默認1.0壤靶;
min_df=缚俏,小于這個頻率的詞不作為次電磁,默認1(至少出現(xiàn)在一篇文章中)贮乳;
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
總結
基本的文本分類的流程基本就是這樣颂砸,后續(xù)就是使用更加合適的分詞、詞典、特征的構建方法人乓,使用更加合適的分類器等勤篮。具體問題具體分析。
Bag of Word
Bag of words模型最初被用在文本分類中色罚,將文檔表示成特征矢量碰缔。它的基本思想是假定對于一個文本,忽略其詞序和語法保屯、句法手负,僅僅將其看做是一些詞匯的集合涤垫,而文本中的每個詞匯都是獨立的姑尺。簡單說就是講每篇文檔都看成一個袋子(因為里面裝的都是詞匯,所以稱為詞袋蝠猬,Bag of words即因此而來)切蟋,然后看這個袋子里裝的都是些什么詞匯,將其分類榆芦。如果文檔中豬柄粹、馬、牛匆绣、羊驻右、山谷、土地崎淳、拖拉機這樣的詞匯多些堪夭,而銀行、大廈拣凹、汽車森爽、公園這樣的詞匯少些,我們就傾向于判斷它是一篇描繪鄉(xiāng)村的文檔嚣镜,而不是描述城鎮(zhèn)的爬迟。舉個例子,有如下兩個文檔:
文檔一:Bob likes to play basketball, Jim likes too.
文檔二:Bob also likes to play football games.
基于這兩個文本文檔菊匿,構造一個詞典:
Dictionary = {1:”Bob”, 2. “l(fā)ike”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”付呕,8. “games”, 9. “Jim”, 10. “too”}。
這個詞典一共包含10個不同的單詞跌捆,利用詞典的索引號徽职,上面兩個文檔每一個都可以用一個10維向量表示(用整數(shù)數(shù)字0~n(n為正整數(shù))表示某個單詞在文檔中出現(xiàn)的次數(shù)):
1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]
向量中每個元素表示詞典中相關元素在文檔中出現(xiàn)的次數(shù)(下文中,將用單詞的直方圖表示)疹蛉。不過活箕,在構造文檔向量的過程中可以看到,我們并沒有表達單詞在原來句子中出現(xiàn)的次序(這是本Bag-of-words模型的缺點之一,不過瑕不掩瑜甚至在此處無關緊要)育韩。
if-idf詞頻倒排索引
TFIDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高克蚂,并且在其他文章中很少出現(xiàn),則認為此詞或者短語具有很好的類別區(qū)分能力筋讨,適合用來分類埃叭。
在一份給定的文件里,詞頻(term frequency悉罕,TF)指的是某一個給定的詞語在該文件中出現(xiàn)的頻率赤屋。這個數(shù)字是對詞數(shù)(term count)的歸一化,以防止它偏向長的文件壁袄。(同一個詞語在長文件里可能會比短文件有更高的詞數(shù)类早,而不管該詞語重要與否。)對于在某一特定文件里的詞語 ti 來說嗜逻,它的重要性可表示為:
其中涩僻,分子表示單詞i在文檔j中出現(xiàn)的次數(shù),分母表示文檔j的所有單詞個數(shù)栈顷。
逆向文件頻率(inverse document frequency逆日,IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF萄凤,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目室抽,再將得到的商取對數(shù)得到:
其中,分子位語料庫文檔總的個數(shù)靡努;
分母為用于單詞i的文檔的個數(shù)坪圾。
最終,