文本预处理的一般步骤和方法

标签:#文本处理##文本挖掘##预处理# 时间:2017/11/29 09:58:51 作者:小木

文本预处理是一件极其耗费时间的事情,不仅繁琐而且涉及的细节很多,处理不好对后面的事情的影响很大。本文将简要介绍文本预处理的一般步骤和方法。

中文和英文的文本预处理有一点差异,一般情况下,我们对文本预处理的目标,都是将文本转变成结构化的数据形式。通常情况下,为了方便我们经常会使用向量空间模型(Vector Space Model,VSM)来表示文本。VSM假设文档之间的词语之间的顺序不影响文本的表达,将文本表示成词语及其频率的向量形式。举个简单的例子,假设我们有两个文本,分别如下(一行对应一个文本):

  1. I am a student. I have an apple.
  2. You are a teacher. You like apples.

当然正常情况下,一个文档比上述的一句话要长得多,这里我们只是举个例而已。最终,我们将会把模型变成如下形式的向量:

i am a student have an apple you are teacher like apples
Doc1 2 0 1 1 1 1 1 0 0 0 0 0
Doc2 0 0 1 0 0 0 0 2 1 1 1 1

一行是一个向量,每个单词在当前文档中出现的次数当做向量中对应位置的值。当然这种处理还差很多,比如,上述文档中,am/a/an等单词其实都是停用词,对于后续的任务来说一般都是多余的需要去掉。下面我们描述一下需要对文档进行预处理工作的一些内容。

一、中文分词

看名字就知道这是针对中文的处理方式,一般情况下,中午都是由标点符号隔开的句子组成,句子中间没有任何空格,我们对中文很熟悉,可以轻易的将句子中的单词分割出来,但是对于计算机来说,需要通过算法将单词切割开来才能做后续的预处理工作。对于中文的分词来说,目前技术上比较成熟,对于一般的通用的文本分词准确率都很高,对于特殊领域或者特殊句子,可以通过添加词库的方式强行将字合到一起。目前中文分词的程序主要有:

  1. NLPIR中文分词软件,早先由身在中科院的张华平开发,现在跳槽到北理工(前段时间干了一件惹了大家都不高兴的事情,呵呵,有才也得做正确的事啊),包括C语言版本、Java版本和Python版本。
  2. Jieba分词,非常不错的一块分词软件,立志做中文最好的分词工具,原生是Python语言写的,也有用Java实现的。
  3. THULAC中文分词,这是由清华大学自然语言实处理与社会人文计算实验室推出的一款中文分词工具,包含C++版本,Java版本,Python版本等。

上述三种分词都是老牌或者是学术派的分词工具。随着云计算和人工智能的发展,各家公司为了争取用户都发布了自己的分词工具:

  1. PullWord由清华大学梁斌博士开发,梁斌博士很不错,参加过他举办的西瓜大会,在年轻的码农和学生里面比较有号召力,PullWord是由他基于深度学习开发的中文在线抽词工具,由于梁斌有大量的数据,对于新词的发现应该是不错的。
  2. 百度分词API,百度云计算开放的分词API接口,速度不错,准确率很高。很容易使用。
  3. 阿里云的分词API,这个我没用过不好评价。

上述分词都是比较著名且效果应该都不错的,只不过大公司的分词API以后可能会转向收费,使用还是慎重。

二、词形还原(Lemmatisation)和词干抽取(Stemming)

这两个工作是英文文本处理中特有的,二者很像但是有些许不同。举个例子:

  1. beautiful 和 beautifully 词形还原的结果是 beautiful 和 beautifully
  2. good, better 和 best 词形还原的结果是 good, good 和 good.
  3. beautiful 和 beautifully 词干抽取的结果 beauti
  4. good, better 和 best 词干抽取的结果 good, better 和 best

可以看到词形还原和词干抽取都是将英文单词的不同形式转换成统一的方式,只不过词干抽取是去除词语的形态等,将词语变成它的词干形式的过程,而词形还原是指将一组词语变成他们词干的形式的过程。这些工作对文本后面的分类聚类应该是有好处的。但是这样的操作对文本主题建模后不一定利于人们的理解,因为主题下单词如果都是beauti这种形式,看起来会让人有点难以理解(也许是本人英语不够,词根展现的主题我是觉得非常不易于理解)。但是,这两项工作都是把表达相同含义的单词变成统一的形式,对与文档的维度约减很重要,因为本质上述同一个词根的词语含义相近,作为特征的话也是相关的,所以合到一起是有助于后续工作的。

三、词性标注

这个过程是将词语的词性标注出来的过程,也就是名词、动词、形容词等。这项工作并不是预处理中必备的,但是它有的时候可以帮助我们简化一些操作。例如,对于词性标注的结果中,通常以下词性的词语都可以去掉:

词性符号 词性结果
w 标点符号
r 代词
c 并列连词
u 助词
y 语气词
m 数词
q 量词
m 数词
p 介词

上述表格第一列是通常词性标注对应的标注的符号,第二列是对应的词性结果。一般来说,中文的分词结果都会包含这个词性标注的结果,英文则需要程序额外进行标注。这些并不是严格按照这个标准来去掉,有些词语比如说副词可能是需要保留的,去掉的只是部分副词而已。这个要根据具体的任务来。

三、去除停用词

一般情况下,去除停用词需要一个停用此表,常见的停用此表大家去网上搜一搜就行了,很多,对于具体的任务也要具体对待。在这里我们着重说一下需要处理的其他的内容。因为现在的文本都是包含了很多的信息的,对于很多信息我们有时候也需要清洗转换之后才能用。通常需要清洗的内容如下:

3.1、超链接

这种一般需要去除掉,他对我们的文本处理一般没有什么用处(在某些情况下,可以抽取出来当做打文本标签的特征也是可以的)。

3.2、Latex符号

现在很多文本还包括了Latex内容,Latex内容一般是在两个符号之间的,一般都是数学表达,这些内容在某些时候要去掉。

3.3、尖括号内容

尖括号通常包含了缩写,这些内容有些时候需要,有些时候也可以去除。因为通常尖括号的内容在之前都已经解释了,这部分内容如果不去掉,在后续文本中如果展示出来,但是没有任何说明的话通常也会让人难以理解。所以对于这个尖括号的处理通常也要注意。

3.4、话题处理

随着社交媒体的兴起,类似使用##表达话题的方式也频繁出现,对于这部分内容通常可以当做一个单词对待。在英文中,通常都是没有空格符号表示的,如果不加处理,在最后的展示中可能让人难以理解。在中文中,可能是比较长的一句话,也有可能是短的几个词语,把这种信息抽取出来可以在后续的展示中告诉别人,这是一个话题的名称将会避免很多难以理解的词语的出现。

3.5、英文中’s的处理

这种情况通常会出现在没有做词干抽取和词形还原的情况下,’s会和其他单词一起出现,影响后续文本处理任务,注意处理

3.6、数字、非拉丁字母、非中文的情况

对于某些场景来说我们不需要出了特定语言外的内容出现,比如说数字可以去掉,非拉丁字母有时候也需要去掉等。对于大量中文来说,某些时候去掉除中文意外的字符也是有效的处理方式。

四、向量空间表示

到这里预处理基本结束了,剩下的就是将文档转换成向量空间模型的形式了。