sklearn 基本的文本分類

目的

其實,說白了就是人想知道這個文檔是做什么的租谈。首先給每篇文章一個標簽篮奄、構建文檔的特征,然后通過機器學習算法來學習特征和標簽之間的映射關系割去,最后對未知的文本進行標簽的預測窟却。
在海量信息的互聯(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 來說嗜逻,它的重要性可表示為:

Paste_Image.png

其中涩僻,分子表示單詞i在文檔j中出現(xiàn)的次數(shù),分母表示文檔j的所有單詞個數(shù)栈顷。
逆向文件頻率(inverse document frequency逆日,IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF萄凤,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目室抽,再將得到的商取對數(shù)得到:

Paste_Image.png

其中,分子位語料庫文檔總的個數(shù)靡努;
分母為用于單詞i的文檔的個數(shù)坪圾。

最終,


Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颤难,一起剝皮案震驚了整個濱河市神年,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌行嗤,老刑警劉巖已日,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栅屏,居然都是意外死亡飘千,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門栈雳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來护奈,“玉大人,你說我怎么就攤上這事哥纫∶蛊欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厌秒。 經(jīng)常有香客問我读拆,道長,這世上最難降的妖魔是什么鸵闪? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任檐晕,我火速辦了婚禮,結果婚禮上蚌讼,老公的妹妹穿的比我還像新娘辟灰。我一直安慰自己,他們只是感情好篡石,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布芥喇。 她就那樣靜靜地躺著,像睡著了一般夏志。 火紅的嫁衣襯著肌膚如雪乃坤。 梳的紋絲不亂的頭發(fā)上苛让,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天沟蔑,我揣著相機與錄音,去河邊找鬼狱杰。 笑死瘦材,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仿畸。 我是一名探鬼主播食棕,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼错沽!你這毒婦竟也來了簿晓?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤千埃,失蹤者是張志新(化名)和其女友劉穎憔儿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體放可,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谒臼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耀里。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈缤。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冯挎,靈堂內(nèi)的尸體忽然破棺而出底哥,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布趾徽,位于F島的核電站奶陈,受9級特大地震影響,放射性物質發(fā)生泄漏附较。R本人自食惡果不足惜吃粒,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拒课。 院中可真熱鬧徐勃,春花似錦、人聲如沸早像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卢鹦。三九已至臀脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冀自,已是汗流浹背揉稚。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熬粗,地道東北人搀玖。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像驻呐,于是被迫代替她去往敵國和親灌诅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容