1. 程式人生 > >資料探勘+python 中文文字分類

資料探勘+python 中文文字分類

修改自 :http://blog.csdn.net/github_36326955/article/details/54891204

文字分類

摘要

文字分類指按照預先定義的主題類別,為文件集合中的每個文件確定一個類別。這樣使用者不但能夠方便地瀏覽文件,而且可以通過限制搜尋範圍來使文件的查詢更容易、快捷。目前,主要方法有樸素貝葉斯分類(Naive Bayesian Model),向量空間模型(Vector Space Model)以及線性最小二乘LLSF(Linear Least Square Fit)。本文中,使用一個已經分好類的資料集,通過對其中的文章進行分詞,並存入Bunch資料結構,統計詞頻,然後再用

TF-IDF的方法進行特徵選取,最後使用利用樸素貝葉斯對測試資料集分類,並評估準確率。

1.文字分類過程

中文語言的文字分類技術和流程,主要包括下面幾個步驟:
1. 預處理:去除文字噪聲資訊,例如HTML標籤,文字格式轉換,檢測句子邊界

2. 中文分詞:使用中文分詞器為文字分詞,並去除停用詞

3. 構建詞向量空間:統計文字詞頻,生成文字的詞向量空間

4. 權重策略——TF-IDF:使用TF-IDF發現特徵詞,並抽取為反映文件主題的特徵

5. 分類:使用演算法訓練分類器,本文使用樸素貝葉斯

6. 評價分類結果

2.資料集

訓練集train_small中包含10個分類,每個分類下有一些txt文字檔案。

同樣,在測試集test_small中也有10個分類的資料集,就是用這些資料來測試模型的好壞。

3.分詞

分詞是將連續的字序列按照一定的規範重新組合成詞序列的過程,中文分詞即將一個漢字序列(句子)切分成一個個獨立的單詞,中文分詞很複雜,從某種程度上並不完全是一個演算法問題,最終概率論解決了這個問題,演算法是基於概率圖模型的條件隨機場(CRF)分詞是自然語言處理中最基本,最底層的模組,分詞精度對後續應用模組的影響很大,文字或句子的結構化表示是語言處理中最核心的任務,目前文字的結構化表示分為四大類:詞向量空間、主體模型、依存句法的樹表示、RDF的圖表示。

由於資料已經相對規整,直接對訓練集和測試集中所有文字中文章進行分詞,並把分好的文章存入各自對應的分詞資料夾。

# -*- coding: utf-8 -*-import osimport jiebadef savefile(savepath, content):    fp = open(savepath,"w",encoding='gb2312',errors='ignore')    fp.write(content)    fp.close()def readfile(path):    fp = open(path,"r",encoding='gb2312',errors='ignore')    content = fp.read()    fp.close()returncontentcorpus_path = "test_small/"  # 未分詞分類預料庫路徑seg_path = "test_seg/"  # 分詞後分類語料庫路徑catelist = os.listdir(corpus_path)  # 獲取改目錄下所有子目錄print(catelist)for mydirin catelist:    class_path = corpus_path + mydir + "/"  # 拼出分類子目錄的路徑seg_dir = seg_path + mydir +"/"  # 拼出分詞後預料分類目錄if notos.path.exists(seg_dir):  # 是否存在,不存在則建立os.makedirs(seg_dir)    file_list = os.listdir(class_path)forfile_path infile_list:        fullname = class_path + file_path        content = readfile(fullname).strip()  # 讀取檔案內容content = content.replace("\r\n","").strip()  # 刪除換行和多餘的空格content_seg = jieba.cut(content)        savefile(seg_dir + file_path, " ".join(content_seg))print("分詞結束")

對於程式碼中corpus_path ="test_small/"seg_path ="test_seg/"這兩個變數,只要改為訓練集的路徑,就是對訓練集進行分詞。分詞結果:

截止目前,我們已經得到了分詞後的訓練集語料庫和測試集語料庫,下面我們要把這兩個資料集表示為變數,從而為下面程式呼叫提供服務。我們採用的是Scikit-Learn庫中的Bunch資料結構來表示這兩個資料集。用Bunch表示,就是:

from sklearn.datasets.base import Bunch
bunch = Bunch(target_name=[],label=[],filenames=[],contents=[]) 

我們在Bunch物件裡面建立了有4個成員:
target_name:是一個list,存放的是整個資料集的類別集合。
label:是一個list,存放的是所有文字的標籤。
filenames:是一個list,存放的是所有文字檔案的名字。
contents:是一個list,分詞後文本檔案詞向量形式

程式碼如下:

importosimport picklefrom sklearn.datasets.baseimport Bunch#Bunch 類提供了一種key,value的物件形式#target_name 所有分類集的名稱列表#label 每個檔案的分類標籤列表#filenames 檔案路徑#contents 分詞後文件詞向量形式def readfile(path):    fp = open(path,"r",encoding='gb2312',errors='ignore')    content = fp.read()    fp.close()returncontentbunch=Bunch(target_name=[],label=[],filenames=[],contents=[])# wordbag_path="train_word_bag/train_set.dat"# seg_path="train_seg/"wordbag_path="test_word_bag/test_set.dat"#test_word_bag資料夾已經自己建立seg_path="test_seg/"catelist=os.listdir(seg_path)bunch.target_name.extend(catelist)#將類別資訊儲存到Bunch物件for mydirin catelist:    class_path=seg_path+mydir+"/"file_list=os.listdir(class_path)forfile_path infile_list:        fullname=class_path+file_path        bunch.label.append(mydir)#儲存當前檔案的分類標籤bunch.filenames.append(fullname)#儲存當前檔案的檔案路徑bunch.contents.append(readfile(fullname).strip())#儲存檔案詞向量#Bunch物件持久化file_obj=open(wordbag_path,"wb")pickle.dump(bunch,file_obj)file_obj.close()print("構建文字物件結束")

4.構建向量空間和權重策略

由於文字在儲存向量空間是維度較高,為節省儲存空間和提高搜尋效率,在文字分類之前會自動過濾掉某些字詞,這些字或詞被稱為停用詞,本文使用網上的常用停用詞。

3.1.TF-IDF方法:

如果某個詞或短語在一篇文章中出現的頻率高,並且在其他文章中很少出現,那麼認為這個詞或者短語具有很好的類別區分能力,適合用來分類。

 TF-IDF(Term Frequency-InversDocument Frequency)是一種常用於資訊處理和資料探勘的加權技術。該技術採用一種統計方法,根據字詞的在文字中出現的次數和在整個語料中出現的文件頻率來計算一個字詞在整個語料中的重要程度。它的優點是能過濾掉一些常見的卻無關緊要本的詞語,同時保留影響整個文字的重要字詞。計算方法如下面公式所示:

 其中,式中tfidfij表示詞頻tfi,j和倒文字詞頻idfi的乘積。TF-IDF值越大表示該特徵詞對這個文字的重要性越大。

詞頻(TF):指的是某一個給定的詞語在該檔案中出現的頻率。這個數字是對詞數的歸一化,以防止它偏向長的檔案,對於某一個特定檔案裡的詞語來說,它的重要性可表示為:

分子是該詞在檔案中出現的次數,分母是在檔案中所有字詞的出現次數之和

逆向檔案頻率(IDF)是一個詞語普遍重要性的度量,某一特定詞語的IDF,可以由總檔案數目除以包含該詞語的檔案的數目,再將得到的商取對數:

|D|是語料庫中的檔案總數,j是包含詞語的檔案數目,如果該詞語不在語料庫中,就會導致分母為零,因此一般情況下分母還要額外再加上1。

之後計算詞頻和逆向檔案頻率的乘積,某一特定檔案內的高詞語頻率,以及該詞語在整個檔案集合中的低檔案頻率,可以產生出高權重的TF-IDF,因此TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語。對訓練資料的程式碼如下:

importosfrom sklearn.datasets.baseimport Bunchimport pickle#持久化類from sklearnimport feature_extractionfrom sklearn.feature_extraction.textimport TfidfTransformer#TF-IDF向量轉換類from sklearn.feature_extraction.textimport TfidfVectorizer#TF-IDF向量生成類def readbunchobj(path):    file_obj=open(path,"rb")    bunch=pickle.load(file_obj)    file_obj.close()returnbunchdef writebunchobj(path,bunchobj):    file_obj=open(path,"wb")    pickle.dump(bunchobj,file_obj)    file_obj.close()def readfile(path):    fp = open(path,"r",encoding='gb2312',errors='ignore')    content = fp.read()    fp.close()returncontentpath="train_word_bag/train_set.dat"bunch=readbunchobj(path)#停用詞stopword_path="stop_words.txt"stpwrdlst=readfile(stopword_path).splitlines()#構建TF-IDF詞向量空間物件tfidfspace=Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={})#使用TfidVectorizer初始化向量空間模型vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5)transfoemer=TfidfTransformer()#該類會統計每個詞語的TF-IDF權值#文字轉為詞頻矩陣,單獨儲存字典檔案tfidfspace.tdm=vectorizer.fit_transform(bunch.contents)tfidfspace.vocabulary=vectorizer.vocabulary_#建立詞袋的持久化space_path="train_word_bag/tfidfspace.dat"writebunchobj(space_path,tfidfspace)

結果是生成一個訓練集的詞袋。對於測試集生成向量空間,在訓練詞向量模型時需要載入訓練集詞袋,將測試集產生的詞向量對映到訓練集詞袋的詞典中,生成向量空間模型,測試集生成向量空間的程式碼:

importosfrom sklearn.datasets.baseimport Bunchimport pickle#持久化類from sklearnimport feature_extractionfrom sklearn.feature_extraction.textimport TfidfTransformer#TF-IDF向量轉換類from sklearn.feature_extraction.textimport TfidfVectorizer#TF-IDF向量生成類def readbunchobj(path):    file_obj=open(path,"rb")    bunch=pickle.load(file_obj)    file_obj.close()returnbunchdef writebunchobj(path,bunchobj):    file_obj=open(path,"wb")    pickle.dump(bunchobj,file_obj)    file_obj.close()def readfile(path):    fp = open(path,"r",encoding='gb2312',errors='ignore')    content = fp.read()    fp.close()returncontent#匯入分詞後的詞向量bunch物件path="test_word_bag/test_set.dat"bunch=readbunchobj(path)#停用詞stopword_path="stop_words.txt"stpwrdlst=readfile(stopword_path).splitlines()#構建測試集TF-IDF向量空間testspace=Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={})#匯入訓練集的詞袋trainbunch=readbunchobj("train_word_bag/tfidfspace.dat")#使用TfidfVectorizer初始化向量空間vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5,vocabulary=trainbunch.vocabulary)transformer=TfidfTransformer();testspace.tdm=vectorizer.fit_transform(bunch.contents)testspace.vocabulary=trainbunch.vocabulary#建立詞袋的持久化space_path="test_word_bag/testspace.dat"writebunchobj(space_path,testspace)

5.分類與評估

5.1分類方法:

KNN演算法原來最簡單,分類精度尚可,但是速度最快支。

樸素貝葉斯演算法對於短文字分類的效果最好,精度很高。

支援向量機演算法的優勢是支援線性不可分的情況,精度上取中。

本文中使用樸素貝葉斯演算法,程式碼如下:

importpicklefrom sklearn.naive_bayesimport MultinomialNB  # 匯入多項式貝葉斯演算法包def readbunchobj(path):    file_obj = open(path,"rb")    bunch = pickle.load(file_obj)    file_obj.close()returnbunch# 匯入訓練集向量空間trainpath = "train_word_bag/tfidfspace.dat"train_set = readbunchobj(trainpath)# d匯入測試集向量空間testpath = "test_word_bag/testspace.dat"test_set = readbunchobj(testpath)# 應用貝葉斯演算法# alpha:0.001 alpha 越小,迭代次數越多,精度越高clf = MultinomialNB(alpha=0.001).fit(train_set.tdm, train_set.label)# 預測分類結果predicted = clf.predict(test_set.tdm)total = len(predicted);rate = 0for flabel, file_name, expct_catein zip(test_set.label, test_set.filenames, predicted):ifflabel != expct_cate:        rate += 1print(file_name,": 實際類別:", flabel,"-->預測分類:", expct_cate)# 精度print("error_rate:",float(rate) *100 /float(total),"%")from sklearnimport metricsdef metrics_result(actual,predict):print("精度{0:.3f}".format(metrics.precision_score(actual,predict,average='weighted')))print("召回:{0:0.3f}".format(metrics.recall_score(actual,predict,average='weighted')))print("f1-score:{0:.3f}".format(metrics.f1_score(actual,predict,average='weighted')))metrics_result(test_set.label, predicted)

5.2評估

預測結果和實際情況0-1狀態圖

實際情況1代表真實情況此類,0表示不屬於

預測結果

1代表預測屬於此類

0代表預測不屬於此類

1

0

1

True positive

False positive

0

False negative

True negative

P = True positive/(True positive + False positive)

R = True positive/(True positive + False negative)

F1-Score = (2 * P * R)/(P + R)

在此實驗中,我通過準確率、召回率和F1-Score這三個效能評估方法對最後的結果進行了詳細的分析。結果顯示:

準確率和召回率為0.92,F1-Score為0.918,準確率可以接受。

相關推薦

資料+python 中文文字分類

修改自 :http://blog.csdn.net/github_36326955/article/details/54891204 文字分類 摘要 文字分類指按照預先定義的主題類別,為文件集合中的每個文件確定一個類別。這樣使用者不但能夠方便地瀏覽文件,而且可以通過限

python資料實戰筆記——文字挖掘(1):語料庫構建

什麼是文字挖掘 ?   文字挖掘是抽取有效、新穎、有用、可理解的、散佈在文字檔案中的有價值知識,並且利用這些知識更好地組織資訊的過程。 一、搭建語料庫 語料庫:要進行文字分析的所有文件的集合。 需要用到的模組:os、os.path、codecs、pandas 程

python資料實戰筆記——文字挖掘(4):詞雲繪製

概念: 詞雲:詞雲是指對文字中詞頻較高的分詞,給予視覺上的突出,形成“關鍵詞渲染”,從而過濾掉大量的文字資訊,使瀏覽者一眼掃過就可以領略文字的主旨。 需要用到的包:wordcloud、matplotlib wordcloud包下載地址:http://www.l

python資料實戰筆記——文字分析(6):關鍵詞提取

緊接上篇的文件,這節學習關鍵字的提取,關鍵詞——keyword,是人們快速瞭解文件內容,把握主題的重要內容。 #匯入需要的模組 import os import codecs import pandas import jieba import jieba.ana

資料領域中的分類和迴歸區別是什麼?

先簡單的說下吧,下面給出實際例子 類和迴歸的區別在於輸出變數的型別。定量輸出稱為迴歸,或者說是連續變數預測;定性輸出稱為分類,或者說是離散變數預測。舉個例子:預測明天的氣溫是多少度,這是一個迴歸任務;預測明天是陰、晴還是雨,就是一個分類任務。  拿支援向量機舉個例子,分類問題

【Mark Schmidt課件】機器學習與資料——進一步討論線性分類

本課件主要內容包括: 上次課程回顧:基於迴歸的分類方法 Hinge損失 Logistic損失 Logistic迴歸與SVMs “黑盒”分類器比較 最大餘量分類器 支援向量機 魯棒性與凸近似 非凸0-

機器學習/資料, Python 書籍推薦

1. 適合入門的讀物: 《深入淺出資料分析》這書挺簡單的,基本的內容都涉及了,說得也比較清楚,最後談到了R是大加分。難易程度:非常易。 《啤酒與尿布》通過案例來說事情,而且是最經典的例子。難易程

python 中文文字分類

寫這篇博文用了很多時間和精力,如果這篇博文對你有幫助,希望您可以打賞給博主相國大人。哪怕只捐1毛錢,也是一種心意。通過這樣的方式,也可以培養整個行業的智慧財產權意識。我可以和您建立更多的聯絡,並且在相關領域提供給您更多的資料和技術支援。 賞金將用於拉薩兒童圖書公益募捐 手機

資料基礎-1.文字相似度

一、文字相似度 相似度度量指的是計算個體間相似程度,一般使用距離來度量,相似度值越小,距離越大,相似度值越大,距離越小。在說明文字相似度概念和計算方式之前,先回顧下餘弦相似度。 1.餘弦相似度 衡量文字相似度最常用的方法是使用餘弦相似度。  – 空間中,兩個向量夾角的

資料 --- Python實現KNN演算法專案-約會推薦演算法

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

資料——基於R文字情感分析(2)

姑且算是搞定了這個。 最後使用的是在twitter中搜索。因為callback url的關係,之前一直無法直接搜尋twitter內容,今天直接把callback url刪除了就成功了。 推薦兩個很好的

資料python學習——《寫給程式設計師的資料實踐指南》第3章

第3章  協同過濾——隱式評級及基於物品的過濾 對於一些5分割槽間,10分割槽間等的評分機智,使用者的評分方式可能傾向於極端化,集中在高分或是集中在低分,這樣參差不平的評分對於結果的準確性產生較大的

資料(三)分類模型的描述與效能評估,以決策樹為例

關於分類的第一部分我們要講一些關於分類的基本概念,然後介紹最基本的一種分類模型-決策樹模型,再基於此討論一下關於分類模型的效能評估。 =================================

資料-決策樹ID3分類演算法的C++實現

資料探勘課上面老師介紹了下決策樹ID3演算法,我抽空餘時間把這個演算法用C++實現了一遍。決策樹演算法是非常常用的分類演算法,是逼近離散目標函式的方法,學習得到的函式以決策樹的形式表示。其基本思路是不斷選取產生資訊增益最大的屬性來劃分樣例集和,構造決策樹。資訊增益定義為結點與

python資料課程】二十一.樸素貝葉斯分類器詳解及中文文字輿情分析

這是《Python資料探勘課程》系列文章,也是我上課內容及書籍中的一個案例。本文主要講述樸素貝葉斯分類演算法並實現中文資料集的輿情分析案例,希望這篇文章對大家有所幫助,提供些思路。內容包括:1.樸素貝葉斯數學原理知識    2.naive_bayes用法及簡單案例    3.

資料 文字分類(二)蒐集中文語料庫與ICTCLAS分詞

           在上一篇部落格中簡單介紹了實驗環境和流程,這一篇我們繼續。            第一步,下載搜狗中文語料庫。連結:http://www.sogou.com/labs/dl/c.html                            我們下載

python資料入門與實踐--------電離層(Ionosphere), scikit-learn估計器,K近鄰分類器,交叉檢驗,設定引數

ionosphere.data下載地址:http://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/ 原始碼及相關資料下載  https://github.com/xxg1413/MachineLea

Python資料學習筆記(1)文字挖掘入門

一、準備階段: (1)開啟cmd,pip安裝jieba(pip install jieba) (2)開啟python安裝目錄的Lib->site-packages->jieba,開啟dict.txt,可以看到這是jieba模組的詞典:          每

Python資料分析與資料實戰》第十五章學習——文字分析

本章主要實戰目的是對京東平臺上的熱水器評論進行文字挖掘分析,包括分析其使用者情感傾向、從評論文字中挖掘出該品牌熱水器的優點與不足和提煉不同品牌熱水器的賣點。 本文主要包括以下幾個部分: 評論資料抽取 評論預處理 模型準備 模型構建 總結 評論資料抽

Python資料——文字分析

一、一、定義:文字挖掘:從大量文字資料中抽取出有價值的知識,並且利用這些知識重新組織資訊的過程。二、語料庫(Corpus)語料庫是我們要分析的所有文件的集合。import os import os.path filePaths = [] #定義一個數組變數 #再用OS.w