">

自然语言处理之数据预处理

摘要: 数据预处理的整个步骤流程在自然语言处理的工程中要比其在机器学习的工程中精简一些,最大的区别就在数据清洗和特征构造这两个至关重要的过程。在自然语言处理中特征构造是否良好,很大程度上取决于所构造的特征数据集的数据特性与文本内容语义吻合程度的高低。比如,文本情感分类和文本内容分类都属于分类范畴,但对于同一种算法(参数都调整到最优),在两个不同分类的业务下,得到的结果可能会相差很大。通过仔细分析,我们将不难发现造成这种差异的最根本原因就是构造出来的特征数据集的数据模式没有很好地契合文本的真实语义,这也是自然语言处理的最大难点所在。(本文原创,转载必须注明出处.)

无论在机器学习还是在自然语言处理的过程中,数据预处理都是举足轻重的关键步骤,它常决定着一个好模型的训练难易程度,甚至决定着一个项目的成败。依作者愚见,相比于机器学习,数据预处理对自然语言处理而言更为重要。为什么这样说?因为自然语言对真实信息进行了额外的外表包装,只有剥开这层包装,才能更容易地去挖掘到真实信息。在自然语言处理过程中,数据预处理过程大致包括四个步骤:数据清洗、分词与数据转换、特征提取与构造、特征降维。

数据清洗

在自然语言处理的过程中,通常我们得到的数据并非完全“干净”的,因此就需要将语言信息中的干扰信息除去,这样才能更有效去挖掘出其中包含的重要信息。文本内容形式多种多样,常见的包括:TXT文本、HTML文本、XML文本、word文档、excel文档等。在机器学习过程中,数据清洗的内容步骤是相当复杂的;但对文本来说,清洗的目的却很明确简单,即排除非关键信息。我们只需要保留文本内容所阐述的文字信息即可,并同时尽可能减小这些信息对算法模型构建的影响。
以HTML文本为例,HTML文本中有很多HTML标签,如"body","title","p"等,毫无疑问将这些标签作为有效信息来训练模型是不可取的,因为它们与文本内容所要表达的主题没有任何关联。那么清洗这些标签需要自己写很多代码吗?答案是:当然不用!因为在Java语言中,有Jsoup、HtmlParser、Apache tika、HtmlCleaner以及XPath等功能包,它们可以来帮助你完成对HTML文本的清洗工作。而在Python语言中,有BeautifulSoup、SGMLParser、HTMLParaer等功能包也能完成清洗工作。所以无论你是用Java语言,还是Python语言来进行你的自然语言处理工程,行业先驱早已给后辈们种下了无数的“乘凉树”。当然在实际情况中我们可能还会遇到一些特殊的情况,以至于这些功能包并不能很好地帮我们完成所有的清洗工作;但是不用担心,正则表达式会满足你的需求。

分词处理

在对文本进行清洗之后,需要给文本分词,这样能更容易挖掘出文本内容中的一些特征。在上一章中我们提到了一些常用的分词工作包,如Stanford NLP分词、jieba分词、中科院NLPIR汉语分词等。这些分词工具的分词效果都很不错,具体使用起来也很简单。比如有这样一句话:“自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域!”,采用jieba分词后的效果:“自然语言处理/n (/x NLP/eng )/n 是/v 计算机科学/n ,/x 人工智能/n ,/x 语言学/n 关注/v 计算机/n 和/c 人类/n (/x 自然/d )/ x 语言/n 之间/f 的/uj 相互作用/l 的/uj 领域/n !/x”。在分词时,一些停词和标点符号通常是需要排除的,如”是”、”和”、“的”、“,”、“(”、“)”等。但在某些业务情况下,有些停词和标点符号却对业务的建模有一定的帮助,比如对微博内容的情感判断。

特征构造

在做文本特征构造的时候,需要先了解”向量空间模型”(VSM:Vector Space Model)这一个概念。向量空间模型把文本内容的处理简化为向量空间中的向量运算,并且以空间上的相似度表达语义的相似度,直观易懂。自然语言处理中,几乎所有的特征构造方法都基于这个概念。

(1)词袋模型

在传统的词袋模型当中,对于每一个词采用one-hot稀疏编码的形式。假设目标语料中共有N个唯一确认的词,那么需要一个长度N的词典,词典的每一个位置表达了文本中出现的某一个词。在某一种特征表达下,比如词频、binary、tf-idf等,我们可以将任意词或者文本表达在一个N维的向量空间里。

(2)N-gram模型

N-gram是一种统计语言模型,其作用是根据前(n-1)个item来预测第n个item。N-gram被广泛地应用于语音识别、输入法、分词等任务,当n分别为1、2、3时,又分别称为一元语法(unigram)、二元语法(bigram)与三元语法(trigram)。现在一些学者用N-gram模型来构造分类任务的数据特征,作者本人也利用N-gram模型来构造过新闻突发事件判断的数据特征,其判断的效果还是相当不错。

特征降维与选择

在数据特征构造完成后,通常需要对特征数据集进行特征降维和特征选择。二者的目标都是要使得数据集的特征维数减少,但二者又存在一定的区别。数据降维,一般说的是维数约简(Dimensionality reduction)。它的思路是:将原始高维特征空间里的点向一个低维空间投影,从而使新空间的维度低于原特征空间,从而达到减少维数的目的。在这个过程中,特征发生了根本性的变化,原始的特征消失了(虽然新的特征也保持了原特征的一些性质)。而特征选择,是从 n 个特征中选择 d (d<n) 个出来,而其它的 n-d 个特征舍弃,因此新的特征只是原来特征的一个子集,没有被舍弃的 d 个特征没有发生任何变化。

特征降维

当特征数据集构造完成后,可能会出现特征矩阵过大,从而导致计算量大、训练时间长等一系列问题,因此降低特征矩阵维度也是必不可少的。机器学习中常见的特征降维方法:L1惩罚项的模型、主成分分析法(PCA)、线性判别分析(LDA)。PCA和LDA有很多的相似点,他们的共同原理是将原始样本映射到维度更低的样本空间中,PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。在自然语言处理中,常采用的方法就是主题模型。主题模型同时具备了降维和语义表达的效果,比如LSI、LDA、PLSA、HDP等统计主题模型。这些模型寻求文本在低维空间(不同主题上)的表达,在降低维度的同时,尽可能保留原有文本的语义信息,主题模型在处理中长度文本分类任务时特别有效。

特征选择

当特征数据集特征过多时,选择相对更有意义的特征来进行建模是很有必要的。去掉无关特征、保留相关特征的过程,换句话说,是从所有的特征中选择一个最好特征子集的过程。特征选择本质上可以认为是降维的过程。

1)Filter(过滤法):按照发散性或者相关性对各个特征进行评分,根据设定阈值或者待选择阈值的个数来选择特征。如:方差选择法、相关系数法、卡方检验法、互信息法。
方差选择法:使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。
相关系数法:使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。
卡方检验法:经典的卡方检验主要是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j时样本频数的观察值与期望的差距,从而构建统计量。
互信息法: 经典的互信息也是评价定性自变量对定性因变量的相关性的。

2)Wrapper(包装法):根据目标函数(通常是预测效果评分),每次选择若干特征或者排除若干特征。如:递归特征消除法。
递归特征消除法:递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

3)Embedded(嵌入法):先使用某些机器学习的算法模型进行训练,得到各个特征的权值系数,再根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
基于惩罚项的特征选择法:使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型。如:基于惩罚项的特征选择法、基于树模型的特征选择法。

基于树模型的特征选择法:树模型中(随机森林、GBDT和Xgboost)也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合树模型。

4)深度学习方法:从深度学习模型中选择某一神经层的特征用来进行最终目标模型的训练。


参考文献

  1. 数据挖掘十大算法:https://wizardforcel.gitbooks.io/dm-algo-top10/content/apriori.html
  2. 中文维基百科:https://zh.wikipedia.org/wiki/%E5%85%88%E9%AA%8C%E7%AE%97%E6%B3%95
  3. GitHub:https://github.com/BaiNingchao/MachineLearning-1
  4. 图书:《机器学习实战》
  5. 图书:《自然语言处理理论与实战》

完整代码下载

源码请进【机器学习和自然语言QQ群:436303759】文件下载:自然语言处理和机器学习技术QQ交流

作者声明

本文版权归作者所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。

白宁超 wechat
扫一扫关注微信公众号,机器学习和自然语言处理,订阅号datathinks!