這周學習了機器學習算法與編程實踐第二章——中文文本分類的部分內容。該章以文本挖掘為大背景,以文本分類算法為中心,詳細介紹了中文文本分類項目的相關知識點。
一、文本挖掘與文本分類的概念
被普遍認可的文本挖掘的定義如下:文本挖掘是指從大量文本數據中抽取事先未知的、可理解的、最終可用的知識的過程,同時運用這些知識更好的組織信息以便將來參考。
文本挖掘的7個主要領域有:(1)搜索和信息檢索,(2)文本聚類,(3)文本分類,(4)Web挖掘、(5)信息抽取,(6)自然語言處理,(7)概念提取。
而文本分類,通俗點講,其實就是為用戶給出的每個文檔找到所屬的正確類別,目前主要有兩種文本分類方法,一是基於模式系統(通過運用知識工程技術),二是分類
模型(通過使用統計或者機器學習技術)。
二、文本分類項目
該節主要講述了一個中文文本分類項目的主要流程,包括以下幾個步驟:
(1)預處理:去除文本的噪音信息,例如HTML標簽、文本格式轉化、檢測句子邊界等。
(2)中文分詞:使用中文分詞器為文本分詞,並去除停用詞。
(3)構建詞向量空間:統計文本詞頻,生成文本的詞向量空間。
(4)權重策略——TF-IDF方法:使用TF-IDF發現特征詞,並抽取為反映文檔主題的特征。
(5)分類器:使用算法訓練分類器。
(6)評價分類結果:分類器的測試結果分析。
2.1 文本預處理
文本預處理的核心任務就是要把非結構化和半結構化的文本轉化為結構化的形式,及向量空間模型。在這之前,必須進行對不同類型的文本進行預處理。文本
預處理的步驟都相似,基本步驟如下:
(1)選擇處理的文本范圍
選擇適當的范圍取決與文本挖掘任務的目標,對於分類或者聚類任務,通常將整個文檔作為處理單元,而對於情感分析,文檔自動文摘或者信息檢索,段落
或者章節則更合適。
(2)建立分類文本語料庫
文本分類中所說的文本語料一般分為兩大類:訓練集語料和測試集語料。訓練集語料是指已經分還累的文本資源,二測試集語料就是待分類的文本語料,可以是
訓練集的一部分,也可以是外部來源的文本語料。該書截取了復旦大學譚松波中文文本分類語料庫的部分進行實驗。網址為http://www.threedweb.cn/thread-1288-1-1.html。
(3)文本格式轉換
不同格式的文本不論采用何種處理形式,都要統一轉換為純文本文件。
(4)檢測句子邊界
句子邊界檢測是分解整個文檔,並轉換成單獨句子的過程。對於中文文本,它就是尋找“。”、“?”或者“!”等標點符號作為斷句的依據。
2.2 中文分詞介紹
中文分詞指的是將一個漢字序列切分成一個個單獨的詞。分詞就是講連續的子序列按照一定的規范重新組合成詞序列的過程。目前開源的比較成熟的
分析工具有北京理工大學張華平博士開發的中文分詞系統和哈工大的分詞系統。但是以上這些分詞系統與python整合都比較麻煩,因此,在這里我們
使用python語言開發的分詞系統jieba。
我們用jieba包來處理訓練集語料庫,代碼如下。
# _*_ coding:utf-8 _*_
import sys
import os
import jieba
reload(sys)
sys.setdefaultencoding('utf-8')
#保存至文件
def savefile(savepath,content):
fp = open(savepath,"wb")
fp.write(content)
fp.close()
#讀取文件
def readfile(path):
fp = open(path,"rb")
content = fp.read()
fp.close()
return content
corpus_path = "train_corpus_samll/" #未分詞分類語料路徑
seg_path = "train_corpus_seg/" #分詞后分類語料庫路徑
catelist = os.listdir(corpus_path) #后去corpus_path下的所有子目錄
for mydir in catelist:
class_path = corpus_path + mydir + "/"
seg_dir = seg_path + mydir + "/"
if not os.path.exists(seg_path):
os.makedirs(seg_dir)
file_list = os.listdir(class_path)
for file_path in file_list:
fullname = class_path + file_path
content = readfile(fullname).strip()
content.replace("\r\n","").strip()
content_seg = jieba.cut(content)
savefile(seg_dir + file_path," ".join(content_seg))
print "中文語料分詞結束!!!"
這樣我們就得到了分詞后的一個訓練集文件,並將其存在一個新的文件夾下。
當然,在實際應用中,為了后續生成向量空間模型的方便,這些分詞后的信息還要轉換為文本向量信息並對象化。這里需要引入一個Scikit-Learn庫的Bunch數據結構。
Scikit-Learn庫將會在后面的內容中詳細介紹。今天先介紹到這里,下次接着介紹。
# wordbag_path:分詞語料Bunch對象持久化文件路徑
# seg_path:分詞后分類語料庫路徑
def train_bunch(wordbag_path, seg_path):
catelist = os.listdir(seg_path)
bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])
bunch.target_name.extend(catelist)
for mydir in catelist:
class_path = seg_path + mydir + "/"
file_list = os.list(class_path)
for file_path in file_list:
fullname = class_path + file_path
bunch.label.append(mydir)
bunch.filenames.append(fullname)
bunch.contents.append(readfile(fullname).strip())
file_obj = open(wordbag_path,"wb")
pickle.dumps(bunch,file_obj)
file_obj.close()
print "構建文本對象結束"