中文文本分类流程

利用python进行中文文本分类,主要包括以下几个流程

一、预处理

预处理主要是对训练集和测试集的语料库进行处理。

训练集语料库是已经分好类的资料,处理时按照不同的类放入不同的路径下,如./train_corpus/C3-Art,……,\train_corpus\C39-Sports

测试集语料库用于检测实际效果,也是已经分好类的语料库。

如果语料库是自己爬取到的网页等内容中获取的文本,需要将html标签去除

二、分词

分词是文本分类的核心,重要算法:基于概率图模型的条件随机场(CRF)

1.       概率图模型

概率图模型是一类用图模式(节点和边)来表达基于概率相关的模型的总称。

常用的概率图模型包含三个基本问题:

(1)模型的表示:

       贝叶斯网络(有向无环图),可以表达事件的因果关系

       马尔可夫随机场(无向图),表达变量间的相互作用。(常用)

(2)模型的学习:

将图模型化为数学公式,模型 ,Ai是模型参数,Y称为状态(序列),指使用的标签,包括词性列表、组块标签列表、BIOES标注等,自然语言处理中,将数据集数字化为 ,oi称为观测序列,也就是输入序列,根据训练集得到每个观测序列对应不同标签的分布 ,然后套入模型估计出λ,使得模型得到最大的概率分布

(3)模型的预测

对于一个新的输入样本,选择后验概率最大的最有可能的标签作为预测结果。

2、条件随机场

一种判别式无向图模型,基本思路是对汉字进行标注即由字构词(组词),不仅考虑了文字词语出现的频率信息,同时考虑上下文语境,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果;其不足之处是训练周期较长,运营时计算量较大,性能不如词典分词。

对一个字来说,CRF认为其有4种状态,分别是:词头(Begin)、词中(Middle)、词尾(End)、单字成词(Single),简称B、M、E、S。条件随机场的分词过程就是对词位进行标注后,将B和E之间的字,以及S单字构成分词。

训练集的数据是已经做好标注的语料库,然后进行特征学习,以字“我”为例,要学习的特征包括以下几点:

(1)这个字一共在语料库中出现的次数,如“我”字出现了256次;

(2)这个字出现为B、M、E、S的概率,即在这256次中,“我”作为词头、词中、词尾、单字的概率;

(3)这个字作为某一个状态的时候,他转移到下一个状态的概率,也就是他的下一个词的状态的概率分布,这一步会形成一个4*4的矩阵,也就是状态转移概率的计算;

(4)前三项的学习过程和隐马尔科夫过程类似,条件随机场和隐马尔科夫的区别在于,条件随机场会学习上下文关系。如当前状态为B的“我”,下一个字是“们”的概率,当前状态为S的“我”,上一个字是“的”的概率,下一个字是“爱”的概率。

经过特征学习,下一步是分词过程。以对于“希腊的经济结构较特殊”进行分词为例:

(1)将输入变为字符数组,即“希”、“腊”、“的”、“经”、“济”、“结”、“构”、“较”、“特”、“殊”;

(2)取出特征学习过程中学习到的每个字的特征;

(3)为确定每个字的状态,可以绘制一个表格

利用维特比算法求出概率最大路径,取出路径中对应的状态,分词工作基本上就完成了。

R是特征二,即每个字分别作为B、M、E、S的概率;

P是特征三,即每个字处于某状态时转移到下一状态的概率;

W前是特征四的上文部分,即每个字作为某种状态出现时,其上一个字是某个字的概率;

W后是特征四的下文部分即每个字作为某种状态出现时,其下一个字是某个字的概率。

例如,对于“腊”字,前一个字是“希”,后一个字是“的”,同时“希”可取的状态有B、M、E、S,计算出其在状态B上的值如下:

计算出值后,由于有取最大的操作,因此需要记录出选取的路径,对所有值计算后,选取最后一个字所对应的最大概率按照路径进行回溯,就可以得到分词结果。

这就是最基础的利用CRF进行分词的操作。

Jieba库采用的就是CRF进行分词。

具体代码为:

1.  seg_list = jieba.cut("他来到了网易杭研大厦")  默认是精确模式  

2.  print(", ".join(seg_list))  

jieba.cut()接受三个参数分别为:待分词的字符串、cut_all为布尔型变量,是否使用全模式,HMM布尔型变量,是否使用HMM模型

‘’.join(),引号里的内容是以什么来分开分好的词

分词完成后将分好的词的语料库存入某一路径,准备进行下一步操作。这里文本的存储方式为Bunch类型。

from sklearn.datasets.base import Bunch
bunch = Bunch(target_name=[],label=[],filenames=[],contents=[]) 

bunch里存入:target_name:整个数据集的类别的集合,label:所有文本的标签,filenames:所有文本文件的名字,contents:分词后的文本文件(一个 文本文件一行),四个参数均为list类型

三、结构化表示

将第二步中已经分好的词统一到一个词向量空间中。

1、去除垃圾词汇

去除语气助词、标点符号等停用词

2、得到以下两个值:

(1)词典,单词和单词对应的序号,序号应该是自定义的一个序列号,为方便引用,没有特殊含义。

(2)权重矩阵tdm,二维矩阵,tdm[i][j]表示第j个词在第i个类别中的TF-IDF值。Tdm的每一列都表示一个单词在整个类别中的权值,称这一列为一个词向量。

关于TF—IDF值:

词条的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降;也就是说词条在文本中出现的次数越多,表示该词条对该文本的重要性越高,同时词条在所有文本中出现的次数越少,说明这个词条对该文本的重要性越高(因为是该文本独特的词条)。TF(词频)指某个词条在文本中出现的次数,一般会将其进行归一化处理(在某一类中该词条数量/该类中所有词条数量);IDF(逆向文件频率)指一个词条重要性的度量,一般计算方式为总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。TF-IDF实际上是:TF * IDF

值得注意的是,如果测试集中新出现的词不是训练集生成的TF-IDF词向量空间中的词,我们就都不予考虑。所以训练集中词的全面性很重要。

四、设计分类器

中文文本分类常用的分类器包括:决策树、人工神经网络、KNN、SVM、朴素贝叶斯、Adaboosting、Rocchio算法、LDA模型、深度学习等。

朴素贝叶斯算法有一个较强的假设,要求所有属性相互独立,但是在文本中各个词向量之间并不是相互独立的,词向量之间或多或少有一定的关系,这导致了以朴素贝叶斯作为分类器算法的正确率不会很高(可以考虑用聚类算法先将相关性较大的属性聚类),而且需要知道先验概率,但是,凭借着其坚实的数学基础,以及稳定的分类效率,几乎不需要参数估计以及对缺失数据并不敏感的优势,在属性相关性较少时,依旧是性能最为良好的分类方法。

朴素贝叶斯进行分类时,要判断一个文本属于哪个类,要计算所有类别的先验概率和该文本中所有词在相应类别下的后验概率,相乘,文本归于乘积最大的类,公式表示为:

为某个类别的文本个数除以所有文本个数;

为训练集中各个类别下面各种特征的条件概率。

这就是朴素贝叶斯对已经分好词的文本进行分类的过程。

 

 

你可能感兴趣的:(中文文本分类流程)