来源:KDnuggets
编译:Bing
编者按:上篇文章中,作者Matthew Mayo讲到处理文本数据的基本框架,今天我们继续就框架进行讨论,探讨分析的第二个步骤——数据预处理。
相关阅读: 文本数据分析(一):基本框架
在文本数据分析基本框架中,我们涉及到了六个步骤:
数据收集
数据预处理
数据挖掘和可视化
模型构建
模型评估
虽然框架需要迭代,但是我们先将其看作是一个线性的过程:
很显然,文本数据预处理位于框架的第二步,这一步所包含的详细步骤有以下两个:
在原始文本语料上进行预处理,为文本挖掘或NLP任务做准备
数据预处理分为好几步,其中有些步骤可能适用于给定的任务,也可能不适用。但通常都是标记化、归一化和替代的其中一种(tokenization, normalization, substitution)。
通常,我们会选取一段预先准备好的文本,对其进行基本的分析和变换,遗留下更有用的文本数据,方便之后更深入、更有意义的分析任务。接下来将是文本挖掘或自然语言处理工作的核心工作。
所以再次重复以便,文本预处理的三个主要组成部分:
标记化(tokenization)
归一化(normalization)
替换(substitution)
在下面介绍预处理方法的过程中,我们需要时刻牢记这三个概念。
接下来,我们将介绍这个框架的概念,而不涉及工具。在下一篇文章中我们会降到这些步骤的安装过程,看看它们是如何在Python中实现的。
1.标记化(Tokenization)
标记化是将文本中的长字符串分割成小的片段或者tokens的过程。大段文字可以被分割成句子,句子又可以被分割成单词等等。只有经过了tokenization,才能对文本进行进一步的处理。Tokenization同样被称作文本分割或者词法分析。有时,分割(segmentation)用来表示大段文字编程小片段的过程(例如段落或句子)。而tokenization指的是将文本变为只用单词表示的过程。
这一过程听起来很直接,但事实并非如此。在较大的文本中如何识别句子?你的第一反应一定是“用标点符号”。
的确,下面的句子用传统的分割方法很容易理解:
The quick brown fox jumps over the lazy dog.
但是下面这句呢:
Dr. Ford did not ask Col. Mustard the name of Mr. Smith’s dog.
还有这个:
“What is all the fuss about?” Asked Mr. Peters.
上面的都只是简单的句子,那么单词又怎样呢?
This full-time student isn’t living in on-campus housing, and she’s not wanting to visit Hawai’i.
我们应该意识到,许多策略不只是针对句子分割,而是针对分割的边界确定之后应该做什么。例如,我们可能会采用一种分割策略,它能够(正确地)将单词“she’s”的tokens之间特定边界标识识别为撇号(单独用空格标记的策略不足以识别这一点)。但是我们可以从多种策略中选择,例如是将标点符号保留在单词的某一部分中或是一同舍弃。其中一种方法似乎是正确的,并且似乎不会构成实际的问题。但是仔细想想,在英语中我们还需要考虑其他特殊情况。
即,当我们将文本分割成句子时,是否应该保留句末分隔符?我们是否在意句子在哪里结束?
再进一步处理之前,文本需要进行归一化。归一化指的是一系列相关的任务,能够将所有文本放在同一水平区域上:将所有文本转化成同样的实例,删除标点,将数字转换成相应的文字等等。对文本进行归一化可以执行多种任务,但是对于我们的框架,归一化有3个特殊的步骤:
词干提取(stemming)
词形还原(lemmatizatiion)
其他
词干提取是删除词缀的过程(包括前缀、后缀、中缀、环缀),从而得到单词的词干。
词形还原与词干提取相关,不同的是,词形还原能够捕捉基于词根的规范单词形式。
例如,对“better”一词进行词干提取,可能无法生成另一个词根的词。然而对其进行词形还原,就得到:
词形还原和词干提取是文本预处理的主要部分,所以这两项一定要认真对待。他们不是简单地文本操作,而要依赖语法规则和对规则细致的理解。
然而,还有许多其他步骤可以帮助处理文本,让它们变成平等的地位,其中有一些只是简单地替换或删除。其他重要的方法包括:
将所有字母变成小写
删除数字(或者将数字换成对应的文字)
删除标点(者通常是tokenization的一部分,但是仍然需要在这一步做)
删除空白格
删除默认停止词
停止词是那些在对文本进一步与处理之前需要过滤掉的单词,因为这些单词并不影响整体意义。例如“the”、“and”、“a”这些词。下面的例子就表明,即使删除停止词,句子的意思也很容易理解。
删除特定的停止词
删除稀疏的特定词语(尽管不是必须的)
在这里,我们应该清除文本预处理很大程度上依赖于预先建立的词典、数据库和规则。在我们下一篇用Python进行预处理的文章中,你会发现这些支持工具会非常有用。
噪声消除延续了框架的替代任务。虽然框架的前两个主要步骤(标记化和归一化)通常适用于几乎任何的文本或项目,噪声去除是预处理框架中一个更加具体的部分。
再次记住,我们的处理过程并不是线性的,其中的过程必须以特定的顺序进行,视具体情况而定。因此,噪声消除可以发生在上述步骤之前或之后,或者是某个时刻。
具体来说,假设我们从网上获取了一个语料库,并且以原始的web格式存储,那么我们可以认为文本很大程度上可能有HTML或XML标签。尽管这种对元数据的思考可以作为文本收集或组装的过程中的一部分,但它取决于数据是如何获取和收集的。在上一篇文章中,我简单讲述了如何从维基百科中获取原始数据并搭建语料库。由于我们控制了数据收集的过程,因此在这时处理噪声也是可行的。
但情况并非总是如此。如果你正在使用的语料库很嘈杂,你必须处理它。数据分析的效果80%都在于数据的准备。
好消息是,此时可以用到模式匹配:
删除文件标题、页脚
删除HTML、XML等标记和元数据
从其他格式(如JSON)或数据库中提取有价值的数据
如果你害怕正则表达式,这可能会成为文本预处理的一部分
噪声消除和数据收集之间的界限很模糊,因此噪声消除必须在其他步骤之前进行。例如,从JSON结构中获取的文本显然要在tokenization之前消除噪音。
在下一篇文章中,我将动手实际操作文本预处理任务,特定的任务噪声将被清除。敬请期待!
原文地址:www.kdnuggets.com/2017/12/general-approach-preprocessing-text-data.html