中文文本分類

本文介紹文本挖掘與文本分類的一些基本概念和流程,爲後續學習分類算法作好鋪墊。算法

 

一. 文本挖掘的概念編程

  文本挖掘(Text Mining)是從非結構化文本信息中獲取用戶感興趣或者有用的模式 的過程。其中被廣泛承認的文本挖掘定義以下:文本挖掘是指從大量文本數據中抽取事先未知的、可理解的、最終可用的知識的過程,同時運用這些知識更好地組織信息以便未來參考。網絡

  簡言之,文本挖掘就是從非結構化的文本中尋找知識的過程。 文本挖掘的七個主要領域:機器學習

  (1)搜索和信息檢索(IR):存儲和文本文檔的檢索,包括搜索引擎和關鍵字搜 索。學習

  (2) 文本聚類:使用聚類方法,對詞彙,片斷,段落或文件進行分組和歸類。測試

  (3) 文本分類:對片斷,段落或文件進行分組和歸類,使用數據挖掘分類方法的 基礎上,通過訓練的標記示例模型。搜索引擎

  (4)Web 挖掘:在互聯網上進行數據和文本挖掘,並特別關注在網絡的規模和相 互聯繫。編碼

  (5)信息抽取(IE):從非結構化文本中識別與提取有關的事實和關係;從非結構 化和半結構化文本製做的結構化數據的過程。spa

  (6)天然語言處理(NLP):將語言做爲一種有意義、有規則的符號系統,在底 層解析和理解語言的任務(例如,詞性標註);目前的技術主要從語法、語義 的角度發現語言最本質的結構和所表達的意義。code

  (7)概念提取:把單詞和短語按語義分組成意義類似的組。

  在分析機器學習的數據源中最多見的知識發現主題是把數據對象或事件轉 換爲預約的類別,再根據類別進行專門的處理,這是分類系統的基本任務。文本分類 也如此:其實就是爲用戶給出的每一個文檔找到所屬的正確類別(主題或概念)。想要實現這個任務,首先須要給出一組類別,而後根據這些類別收集相應的文本 集合,構成訓練數據集,訓練集既包括分好類的文本文件也包括類別信息。今天,在 互聯網的背景下自動化的文本分類被普遍的應用於,包括文本檢索,垃圾郵件過濾, 網頁分層目錄,自動生成元數據,題材檢測,以及許多其餘的應用領域,是文本挖掘 最基礎也是應用最廣範的核心技術。

  目前,有兩種主要的文本分類方法,一是基於模式系統(經過運用知識工程技術), 二是分類模型(經過使用統計和/或機器學習技術)。專家系統的方法是將專家的知識 以規則表達式的形式編碼成分類系統。機器學習的方法是一個廣義概括過程,採用由 一組預分類的例子,經過訓練創建分類。因爲文件數量以指數速度的增長和知識專家 的可用性變得愈來愈小,潮流趨勢正在轉向機器學習 -  基於自動分類技術。

二. 中文文本分類技術和流程

  不一樣語言的文 本處理所用到的技術仍是有差異的。中文語言的文本分類技術和流程,主要包括如下幾個步驟:

  1. 預處理:去除文本的噪聲信息,例如 HTML 標籤,文本格式轉換,檢測句 子邊界等等;

    文本處理的核心任務要把非結構化和半結構化的文本轉化爲結構化的形式, 即向量空間模型。這以前,必需要對不一樣類型的文本進行預處理。在大多數文本挖掘 任務中,文本預處理的步驟都是類似的,基本步驟以下:

    (1)選擇處理的文本的範圍。

    (2)創建分類文本語料庫。文本分類中所說的文本語料通常分爲兩大類:訓練集語料和測試集語料。

    (3)文本格式轉換。不一樣格式的文本不論何種處理形式都要統一轉換爲純文本文件,例如,網頁文本,

    word 或 pdf 文件都要轉換爲純文本格式。

    (4)檢測句子邊界:標記句子的結束。

  2. 中文分詞:使用中文分詞器爲文本分詞,並去除停用詞;

    中文分詞 (Chinese Word Segmentation) 指的是將一個漢字序列(句子)切分紅一 個一個單獨的詞。中文比之英文要複雜的多、困難的多。中文分詞,不只是中文文本分類的一大問題,也是中文天然語言處理的核心問題 之一。

    分詞是天然語言處理中最基本、最底層的模塊,分 詞精度對後續應用模塊影響很大,縱觀整個天然語言處理領域,文本或句子的結構化 表示是語言處理最核心的任務。目前,文本的結構化表示簡單分爲四大類:詞向量空 間模型、主題模型、依存句法的樹表示、RDF 的圖表示。以上這四種文本表示都以分 詞爲基礎的。

     jieba 分詞,它是專門使用 Python 語言開發的分詞系統,佔用資源 較小,常識類文檔的分詞精度較高。對於非專業文檔綽綽有餘。

  Jieba 分詞已經做爲 Python 的官方外部庫,上傳到 pypi 上,能夠經過 pip 直接下載使用,簡單樣例代碼以下:

  

# -*- coding: utf-8 -*-

import sys import os import jieba

# 設置 utf-8 unicode 環境
reload(sys)
sys.setdefaultencoding('utf-8')

seg_list = jieba.cut("小明 1995 年畢業於北京清華大學", cut_all=False) print "Default Mode:", " ".join(seg_list)   # 默認切分

seg_list = jieba.cut("小明 1995 年畢業於北京清華大學") print "   ".join(seg_list)

seg_list = jieba.cut("小明 1995 年畢業於北京清華大學", cut_all=True) print "Full Mode:", "/ ".join(seg_list)   # 全切分

seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造")    #  搜 索引擎模式
print "/   ".join(seg_list)

輸出結果以下:

Default Mode:  小明 1995 年 畢業 於 北京 清華大學
小明  1995   年  畢業  於  北京  清華大學
Full Mode:  小/ 明/ 1995/ 年/ 畢業/  於/ 北京/  清華/ 清華大學/ 華大/     大學
小明/   碩士/    畢業/    於/    中國/   科學/   學院/    科學院/   中國科學院/   計算/   計算所/   ,/     後//   日本/    京都/   大學/   日本京都大學/     深造

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

文本分類的結構化方法就是向量空間模型,雖然愈來愈多的實踐已經證實,這種 模型存在着的侷限,可是迄今爲止,它還是在文本分類中應用最普遍、最爲流行的數 據結構,也是不少相關技術的基礎,例如:推薦系統、搜索引擎等。

  4. 權重策略--TF-IDF 方法:使用 TF-IDF 發現特徵詞,並抽取爲反映文檔主題 的特徵;

  計算文本的權重向量,應該選擇一個有效的權重方案。最流行的方案是對 TF-IDF 權重的方法。TF-IDF 的含義是詞頻--逆文檔頻率,其含義是若是某個詞或短語在一篇 文章中出現的頻率 TF 高,而且在其餘文章中不多出現,則認爲此詞或者短語具備很好 的類別區分能力,適合用來分類。逆文檔頻率就是使用詞條的文檔頻率來抵消該詞的詞頻對權重的影 響,而獲得一個較低的權重。某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率, TFIDFij=TFijI×IDFij 能夠產生出高權重的 TF-IDF。所以,TF-IDF 傾向於過濾掉常見 的詞語,保留重要的詞語。使用Scikit-Learn實現的代碼示例以下:

# -*- coding: utf-8 -*-

import sys  
import os 
#引入Bunch類
from sklearn.datasets.base import Bunch
#引入持久化類
import cPickle as pickle
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import TfidfVectorizer  

# 配置utf-8輸出環境
reload(sys)
sys.setdefaultencoding('utf-8')

# 讀取文件
def readfile(path):
    fp = open(path,"rb")
    content = fp.read()
    fp.close()
    return content
        
#計算訓練語料的tfidf權值並持久化爲詞袋

#讀取bunch對象
def readbunchobj(path):
    file_obj = open(path, "rb")
    bunch = pickle.load(file_obj) 
    file_obj.close()
    return bunch
#寫入bunch對象    
def writebunchobj(path,bunchobj):
    file_obj = open(path, "wb")
    pickle.dump(bunchobj,file_obj) 
    file_obj.close()    

# 1. 讀取停用詞表    
stopword_path = "train_word_bag/hlt_stop_words.txt"
stpwrdlst = readfile(stopword_path).splitlines()

# 2. 導入分詞後的詞向量bunch對象
path = "train_word_bag/train_set.dat"        # 詞向量空間保存路徑
bunch    = readbunchobj(path)

# 3. 構建tf-idf詞向量空間對象
tfidfspace = Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={})

# 4. 使用TfidfVectorizer初始化向量空間模型 
vectorizer = TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf = True,max_df = 0.5)
transformer=TfidfTransformer() # 該類會統計每一個詞語的tf-idf權值
# 文本轉爲詞頻矩陣,單獨保存字典文件 
tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
tfidfspace.vocabulary = vectorizer.vocabulary_

# 建立詞袋的持久化
space_path = "train_word_bag/tfdifspace.dat"        # 詞向量空間保存路徑
writebunchobj(space_path,tfidfspace)

print "if-idf詞向量空間建立成功!!!"

  5. 分類器:使用算法訓練分類器(未完待續);

  6. 評價分類結果:分類器的測試結果分析(未完待續)。

 

 

參考資料:

《機器學習算法原理與編程實踐》(鄭捷 著)

相關文章
相關標籤/搜索