这周学习了机器学习算法与编程实践第二章——中文文本分类的部分内容。该章以文本挖掘为大背景,以文本分类算法为中心,详细介绍了中文文本分类项目的相关知识点。

一、文本挖掘与文本分类的概念

被普遍认可的文本挖掘的定义如下:文本挖掘是指从大量文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好的组织信息以便将来参考。

文本挖掘的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(" ","").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 "构建文本对象结束"