中文文本分类

本文介绍文本挖掘与文本分类的一些基本概念和流程,为后续学习分类算法作好铺垫。算法

 

一. 文本挖掘的概念编程

  文本挖掘(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. 评价分类结果:分类器的测试结果分析(未完待续)。

 

 

参考资料:

《机器学习算法原理与编程实践》(郑捷 著)

相关文章
相关标签/搜索