文本清洗+文本分类

系列文章综述

这个系列会包含两部分与金融数据处理有关的文章,第一部分分析数据,第二部分从已经分析的数据中进行信息提取,具体涉及到的内容:

第一部分-文本分析器

  1. 文本数据清洗
  2. 数据分类(逻辑回归+基于规则)
  3. 章节结构分析(LSTM分类器+规则)
  4. 图语义识别(识别报表、合同等)
  5. 句法分析(LSTM(段落分析)+ 规则(句子分析))
  6. 表格识别(GBDT+CNN分类器)

第二部分-信息提取

  1. 命名实体识别(实体消歧+规则识别器+CRF)
  2. 关系/事件提取(Distant Supervision+Bootstrapping+规则+语法树分析)
  3. 表格信息提取(表格结构+表格对齐+表格补全)

本章综述

现实世界中非结构化信息太多,例如网络上大量html、txt文本,想要利用这些数据,我们需要将这些非结构化信息转换为结构化信息,让计算机理解。
传统的文本方法的主要流程是人工设计一些特征,从原始文档中提取特征,然后指定分类器如LR、SVM,训练模型对文章进行分类,比较经典的特征提取方法如频次法、tf-idf、互信息方法、N-Gram。
深度学习火了之后,也有很多人开始使用一些经典的模型如CNN、LSTM这类方法来做特征的提取。
文本分类应该是自然语言处理中最普遍的一个应用,例如文章自动分类、邮件自动分类、垃圾邮件识别、用户情感分类等等,现在很多文本分类项目直接用了CNN,但这篇文章暂时只介绍LR用于文本分类,再加上一些规则方法,实现效果并不比CNN差。

目录

一. 获取预料
二. 文本数据预处理
三. 构造文本特征
四. 特征选择处理
五. 模型训练

一. 获取预料

获取文本语料通常有以下几种方式:
1。 标准开放公开测试数据集,比如国内的中文汉语有搜狗语料、人民日报语料;国际English的有stanford的语料数据集、semavel的数据集等等

  1. 爬虫抓取,获取网络文本,主要是获取网页HTML的形式,利用网络爬虫在相关站点爬取目标文本数据。

二. 文本数据预处理

除了一般分类问题的数据清洗都包含的缺失值处理、去重处理和噪声处理等步骤之外,还包括:

  1. 进行jieba分词
    中文文本数据,比如一条中文的句子,词语词之间是连续的,而数据分析的最小单位粒度我们希望是词语,所以我们需要进行分词工作,这样就给下一步的工作做准备。而对于英文文本句子,就不存在分词这一说法了,应为英文的句子的最小单位就是词语,词语之间是有空格隔开的;
    使用jieba包进行分词处理,我们可以得到干净的文本,文本中起到关键作用的是一些词,主要词就能决定文本的取向。
    由于计算机无法识别自然语言,我们自然也就无法直接将原始文本直接扔到分类算法当中得到分类结果。因此我们需要先将文本转化为一定格式的特征编码,文本分类区别于其他文类问题的特点在于此。显然,转化后的特征编码能够携带越多的文本特征,就越能帮助分类算法预测出对于的类别。
    中文文本分类最常用的特征提取的方法就是分词。区别于英文天然的存在空格符作为词与词之间的间隔标志,中文文本中词的提取必须通过基于序列预测等方法的分词技术来实现。在提取了特征值之后,再采用One-hot或TF-IDF等方法将每个样本转化为固定长度的特征编码作为分类算法的输入。
    除了分词,N-gram模型也完全值得你去尝试。分词产生的特征丢失了原文本中词与词之间的的位置和顺序信息,以至于对于“我爱你”、“你爱我”这样的短语,分词得到的特征完全相同。同样的例子,若采用二元的Bi-gram模型则能提取出“我爱”、“爱你”以及“你爱”、“爱我”两组完全不同的特征,更清晰得表达的原文的原意。
    在在中文文本分类中,另一个N-gram模型相对分词的优势在于:N-gram模型不受分词准确率的影响。并且当N取足够大时,字符级别的N-gram模型总是能完全覆盖分词+词袋模型的特征集合,同时能极大得召回其他特征,这一点在短文本分类中效果格外明显。
    在工程实践中,为了不让特征集合过于庞大从而拖累分类速度,一般同时采用N为1到3的N-gram就能取得较好的效果。
  2. 词性标注(可选)
    通过很多分词工具分出来的会出现一个词,外加该词的词性,比如说啊是语气助词。
  3. 去除指定无用的符号
    可以使用python中的replace替换一些指定的字符数据,可以用在去除文本中大量重复的符号
  4. 去除停用词(stop words)
    经过上面的步骤,我们已经把所有的词进行了分类。但是这些所有的词,并不都是我们所需要的,比如说句号(。)显然,句号对意思的表达没有什么效果。还有”是“、”的“等词,也没有什么效果。因为这些词在所有的文章中都大量存在,并不能反应出文本的意思,可以清理掉,通常情况下,在文本中去掉这些停用词能够使模型更好地去拟合实际的语义特征,从而增加模型的泛化能力。
    但值得注意的是,停用词表并不是一成不变的。针对不同的文本分类情景,所采用的停用词表也应该作出针对性的调整。例如书名号“《”和“》”往往比书名本身更能代表书名的特征、冒号“:”通常出现在人物访谈类文章的标题中,以及人称代词“他”和“她”在情感类文章标题中的频繁使用等。根据情景灵活地使用停用词表,往往能够起到意想不到的效果。
    例如:
    标点符号:, 。! /、*+-
    特殊符号:❤❥웃유♋☮✌☏☢☠✔☑♚▲♪等
    无意义的虚词:“the”、“a”、“an”、“that”、“你”、“我”、“他们”、“想要”、“打开”、“可以”等
  5. 非文本数据
    很多时候我们的分类文本都来自爬虫的爬取结果,因此文本中常常会附带有HTML标签、URL地址等非文本内容,所以需要清除这部分内容对分类没有什么帮助的内容。
  6. 长串数字或字母
    通常情况下中文文本中长串的数字代表手机号、车牌号、用户名ID等文本内容,在非特定的文本分类情境下可以去除。或者将其转换为归一化的特征,如是否出现长串数字的布尔值特征HAS_DIGITAL、按长度归一的DIGIAL_LEN_10等等。值得一提的是,表情代号常常作为长串数字或字母出现,却能在情感分析中却能起到巨大作用。
  7. 无意义文本
    此外,还需要过滤掉剩余文本当中的诸如广告内容、版权信息和个性签名的部分,毫无疑问这些也都不应该作为特征被模型所学习。
  8. 变形词识别和替换
    变形词问题除了能让我们感叹中文博大精深之外,也时时刻刻困扰文本分类工作者,极大地增加了广告识别、涉黄涉政等特殊的文本分类场景下的分类难度。对中文词的变形通常采用的方法有:特殊符号替换、同音近型替换、简繁替换等。
    要做到变形词的识别和替换,除了建立常见变形词的映射表以外,还可以尝试用拼音首字母的方法来鉴别同音替换的变形词;以及用 Word2vec词向量来对比变形词与上下文的语意关联度,从而识别出该词是否经过了变形。

三. 构造文本特征

接下来我们需要将文本符号串转变为数字,更确切滴说是向量阵列:矩阵

  1. 词袋表示
    词袋表示(bag of word, BOW), 即不考虑词语的原本在句子中的顺序,直接将每一个词语或者符号按照计数的方式,即出现的次数来进行统计。当然了,统计词频这只是最基本的方式。还有很多的处理,具体如下。
    1.1 count
    先将关键的keywords作为文本特征,然后再用此最直接的方式进行句子表示,就是直接统计词频,然后将每一个句子或者文本篇章按照每一个特征出现的频率进行统计,这样处理后将得到句子或者文档对应的一个特征向量,向量的每个元素便是对应特征词的出现频数。
    1.2 tf-idf
    与count类似,不过对其进行了改进。TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TFIDF,TF词频(Term Frequency),IDF反文档频率(Inverse DocumentFrequency)。TF表示词条,在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。 同样的,处理后将得到一个句子的特征向量,不过每个元素应该是一个[0, 1]的实数,表示一个概率。一个好的tf-idf需要进行很多的处理,比如进行光滑处理。这里贴一篇文章作为参考 TF-IDF与余弦相似性的应用(一):自动提取关键词
  2. 词向量表示
    词向量又名词嵌入word embedding,具体的无门槛科普请参考隔壁一篇博客《DeepNLP的表示学习·词嵌入来龙去脉·深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)》。分布式表示的优点就是1.维度低,节省计算等等一堆资源;2.capture了相对位置的语义信息,这一点革命性的。当然了,不同类型的词向量有不同的能力,这里不啰嗦。下面举两个例子。
    2.1 word2vec
    不是说word2vec只能用于神经网络的输入,词向量只是一种词的表示方式,同样适用于经典的ML模型。具体请参考博客《DeepNLP的表示学习·词嵌入来龙去脉·深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)》
    2.2 glove
    likewise.

四. 特征选择处理

  1. 特征选择
    在文本挖掘与文本分类的有关问题中,常采用特征选择方法。原因是文本的特征一般都是单词(term),具有语义信息,使用特征选择找出的k维子集,仍然是单词作为特征,保留了语义信息,而特征提取则找k维新空间,将会丧失了语义信息。
    在解决一个实际问题的过程中,选择合适的特征或者构建特征的能力特别重要。这成为特征选择或者特征工程。特征选择时一个很需要创造力的过程,更多的依赖于直觉和专业知识,并且有很多现成的算法来进行特征的选择。 对于一个语料而言,我们可以统计的信息包括文档频率和文档类比例,所有的特征选择方法均依赖于这两个统计量, 目前,文本的特征选择方法主要有:DF, MI, IG, CHI,WLLR,WFO六种。
    1)DF(Document Frequency)
    2)MI(Mutual Information)
    3)IG(Information Gain)
    4)CHI(Chi-square)
    5)WLLR(Weighted Log Likelihood Ration)
    具体地不过多地赘述,网络有资料,可以查阅相关论文。还有这些:WET(文档证据权重),OI,CC(相关系数)等常用的特征选择。除此之外还可以利用LDA进行特征优化。
  2. 特征降维(非必须)
    对于文本类的数据挖掘项目,基本不考虑降维的问题。
    具体地有这些:LDA(线性特征抽取),PCA(主成分分析),FA(因子分析),SVD(奇异值分解),NMF(非负矩阵分解),LSI或者LSA(潜在语义分析)
  3. 划分训练集、测试集
    可以使用sklearn将数据集进行分类,便于训练,也可以分为训练集、验证集、测试集,训练集进行数据训练,验证集进行具体的调参工作,在测试集上进行测试

五. 模型训练

经过上面几步处理后的数据我们得到了常规的广义特征数据结构,我们所要做的就是将这些特征喂入学习模型,然后适用于心得测试数据集,最后得到结果。
对于各种算法内部的原理和实现,本文并不打算深入探讨。在机器学习算法库趋于成熟的今天,无论是在单机还是分布式甚至GPU集群上,所有你需要做的就是调用和调参即可。因此,在条件允许的情况下,建议尽可能多的在各种数据集上测试不同算法,并且记录其在各项指标上的效果,从而清楚地了解各种算法的特点。
下表总结了各个常用分类算法在中文文本分类情景下的对比情况,可供参考。


文本清洗+文本分类_第1张图片
image

*注:TextCNN和LSTM模型的训练一般需要通过GPU加速。
事实上分类算法并没有绝对的好坏之分,在合适的场合才用适当的算法才是关键。如果是在线分类场景,那么预测速度较快的算法应该成为首选;如果需要快速迭代,那么训练速度快且调参难度小的算法更合适;若不考虑时间开销,那么尝试对多个模型进行集成(Ensemble)是最常用的提升分类效果的方法。

  1. 模型训练学习
    对于文本分类问题,我们可以采用KNN,SVM,Naive Bayes,决策树,GBDT,当然,直接上xgboost也是杠杠滴。
    对于文本聚类问题,可选择K-means,agent,divided,DBSCAN 等模型。
  2. 模型评估
    当然最后也需要对模型进行必要的评估,以让模型optimized。
    关于评价指标,一般最先想到的就是分类准确率(Precision),但准确率并不是全部。如果一个分类模型的准确率很高而召回率很低(Recall),那么反而意味着模型没能把其他本该预测出来的类别给预测出来。这常常在两种情况下发生:
    一是在非均衡样本中,模型由于学习不到足够的小类的特征而倾向于把大部分小类样本预测为大类类别,虽然预测为小类的部分准确率较高,但是更多的小类样本却没有被召回。面对这种情况,应该关注小类类别的F1值情况,即准确率与召回率调和平均值;
    二是在多标签分类中,如果一个模型偏向于保守,那么其可能只对某个多标签的样本预测出最有把握的一个标签,虽然保证了预测准确性,但是仍然没有召回其它的有效标签。此时,可以适当降低内部的二元分类器的预测阈值。如假设原来只有预测得分高于0.5的候选标签被输出,则将阈值降低到0.3时可以得到更多的预测标签,从而提高分类的召回率。
    具体有这些指标可以参考:
    2.1 保持、随机二次抽样、交叉验证、自助法
    2.2 准确率,错误率,精确度,召回率
    2.3 ROC曲线、AUC曲线。

完结

你可能感兴趣的:(文本清洗+文本分类)