中文文本分类

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

一. 文本挖掘的概念

  文本挖掘(Text Mining)是从非结构化文本信息中获取用户感兴趣或者有用的模式 的过程。其中被普遍认可的文本挖掘定义如下:文本挖掘是指从大量文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考。

  简言之,文本挖掘就是从非结构化的文本中寻找知识的过程。 文本挖掘的七个主要领域:

  (1)搜索和信息检索(IR):存储和文本文档的检索,包括搜索引擎和关键字搜 索。

  (2) 文本聚类:使用聚类方法,对词汇,片段,段落或文件进行分组和归类。

  (3) 文本分类:对片段,段落或文件进行分组和归类,使用数据挖掘分类方法的 基础上,经过训练的标记示例模型。

  (4)Web 挖掘:在互联网上进行数据和文本挖掘,并特别关注在网络的规模和相 互联系。

  (5)信息抽取(IE):从非结构化文本中识别与提取有关的事实和关系;从非结构 化和半结构化文本制作的结构化数据的过程。

  (6)自然语言处理(NLP):将语言作为一种有意义、有规则的符号系统,在底 层解析和理解语言的任务(例如,词性标注);目前的技术主要从语法、语义 的角度发现语言最本质的结构和所表达的意义。

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

参考资料:

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

   

原文地址:https://www.cnblogs.com/taich-flute/p/6755031.html