基于深度学习的自然语言处理
上QQ阅读APP看书,第一时间看更新

1.4.2 文本预处理技术

以下是自然语言处理中最常用的文本预处理技术:

❏小写/大写转换

❏去噪

❏文本规范化

❏词干提取

❏词形还原

❏标记化

❏删除停止词

接下来分别介绍。

1.小写/大写转换

这是人们经常忘记使用的最简单有效的预处理技术之一。它要么将所有的大写字符转换为小写字符,以便整个语料库都是小写的;要么将语料库中的所有小写字符转换为大写字符,以便整个语料库都是大写的。

当语料库不太大,并且任务涉及同一个词由于字符的大小写,而作为不同的术语或输出识别时,这种方法特别有用,因为机器固有地将大写字母和小写字母作为单独的实体来处理。比如,“A”与“a”是不同的。这种输入大小写的变化可能导致不正确的输出或根本没有输出。

例如,包含“India”和“india”的语料库如果不应用小写化,机器会把它们识别为两个独立的术语,而实际上它们都是同一个单词的不同形式,并且对应于同一个国家。小写化后,仅存在一种“India”实例,即“india”,简化了在语料库中找到所有提到印度时的任务。

注意 所有的练习和活动主要在Jupyter Notebook上开发。读者需要在系统上安装Python 3.6和NLTK。

练习1-6可以在同一个Jupyter notebook上完成。

练习1:对一个句子执行小写转换

在本练习中,我们将采用一个包含大写字符和小写字符的输入句子,并将它们全部转换成小写字符。以下步骤将帮助你解决问题:

1)根据你的操作系统,打开cmd或其他终端。

2)导航至所需路径,并使用以下命令启动Jupyter notebook:

3)将输入句子存储在“s”变量中,如下所示:

4)应用lower()函数将大写字母转换为小写字符,然后打印新字符串,如下所示:

预期输出如图1-5所示。

图1-5 混合大小写句子的小写化输出

5)创建一个大写字符的单词数组,如下所示:

6)使用列表理解,对words数组的每个元素应用lower()函数,然后打印新数组,如下所示:

预期输出如图1-6所示。

图1-6 混合大小写的小写化输出

2.去噪

噪声是一个非常普遍的术语,对于不同的语料库和不同的任务,它可能意味着不同的东西。对于一个任务来说,被认为是噪声的东西可能对另一个任务来说是重要的,因此这是一种非常特定于领域的预处理技术。例如,在分析推文时,标签对于识别趋势和理解全球谈论的话题可能很重要,但是在分析新闻文章时标签可能并不重要,因此在后者的情况下标签将被视为噪声。

噪声不仅包括单词,还可以包括符号、标点符号、HTML标记(<、>、*、?)、数字、空白、停止词、特定术语、特定正则表达式、非ASCII字符(\W|\d+),以及解析词。

去除噪声是至关重要的,这样只有语料库的重要部分才能输入到模型中,从而确保准确的结果。这也有助于将单词转化为词根或标准形式。考虑以下示例。

如图1-7所示,删除所有符号和标点符号后,“sleepy”的所有实例都对应于单词的一种形式,从而能够更有效地预测和分析语料库。

图1-7 去噪输出

练习2:消除单词中的噪声

在本练习中,我们将采用包含附加噪声的单词的输入数组(例如标点符号和HTML标记),并将这些单词转换为干净、无噪声的形式。为此,我们需要使用Python的正则表达式库。该库有几个功能,允许我们过滤输入数据并删除不必要的部分,这正是噪声消除过程的目的。

注意 要了解有关“re”的更多信息,请访问https://docs.python.org/3/library/re.html

1)在同一个Jupyter notebook中,导入正则表达式库,如下所示:

2)创建一个名为“clean_words”的函数,该函数将包含从单词中删除不同类型噪声的方法,如下所示:

3)创建一个带有噪声的原始单词数组,如下所示:

4)对raw数组中的单词应用clean_words()函数,然后打印去噪后单词数组,如下所示:

预期输出,如图1-8所示。

图1-8 噪声去除结果输出

3.文本规范化

文本规范化是将原始语料库转换为规范和标准形式的过程,这基本上是为了确保文本输入在被分析、处理和操作之前保证一致。

文本规范化的示例是将缩写映射到其完整形式,将同一单词的多个拼写转换为单词的一个拼写,以此类推。

如图1-9和图1-10所示是错误拼写和缩写的规范形式的示例。

图1-9 各种拼写错误的规范形式

图1-10 缩写的规范形式

对于规范化来说,并没有标准的方法,因为它非常依赖于语料库和手头的任务。最常见的方法是使用字典映射,它涉及手动创建一个字典,将一个单词的所有不同形式映射到该单词,然后用一个标准形式的单词替换掉每个单词。

4.词干提取

在语料库上执行词干提取以将词语减少到词干或词根形式。说“词干或词根形式”的原因在于,词干提取的过程并不总是将词语简化为词根,有时只是将其简化为规范形式。

经过词干提取的词语被称为变形词。这些单词的形式与单词的根形式不同,以表示诸如数字或性别之类的属性。例如,“journalists”是“journalist”的复数形式。因此,词干提取将去掉“s”,将“journalists”变为其根形式,相关示例如图1-11所示。

图1-11 词干提取结果

词干提取有助于构建搜索应用程序,因为在搜索特定内容时,你可能还希望找到该事物的实例,即使它们的拼写方式不同。例如,读者如果在本书中搜索练习,则可能还需要在搜索中显示“Exercise”。

然而,词干提取并不总能提供所需的词干,因为它通过切断单词的末端起作用。词干分析器会将“troubling”减少到“troubl”而不是“trouble”,这对于解决问题没有帮助,因此词干提取不是常用的方法。使用时,Porter词干提取算法是最常用的算法。

练习3:对单词进行词干提取

在本练习中,我们将采用包含一个单词的各种形式的输入数组,并将这些单词转换为其词形。

1)在同一个Jupyter notebook中,导入nltk和pandas库以及Porter Stemmer,如下所示:

2)创建一个stemmer实例,如下所示:

3)创建一个包含相同单词的不同形式的数组,如下所示:

4)将词干分析器应用于words数组中的每个单词,并将它们存储在一个新数组中,如下所示:

5)以DataFrame的形式打印原始单词及其词干,如下所示:

预期输出如图1-12所示。

图1-12 词干提取结果

5.词形还原

词形还原是一个类似于词干提取的过程,它的目的是将一个词简化为词根形式。它的与众不同之处在于,它不仅仅删除单词的末尾以获取词根形式,而是遵循一个过程,遵守规则,并且经常使用WordNet进行映射以将单词返回到其根形式。(WordNet是一个英语语言数据库,由单词及其定义以及同义词和反义词组成。它被认为是词典和词库的合并。)例如,词形还原能够将“better”这个词转换为根形式“good”,因为“better”只是“good”的比较级形式。

虽然这种词形还原的质量使其与词干相比具有极高的吸引力和效率,但缺点是由于词形化遵循这种有组织的过程,因此需要花费更多的时间来完成词干提取。因此,当你使用大型语料库时,不建议使用词形还原。

练习4:对单词进行词形还原

在本练习中,我们将采用包含一个单词的各种形式的输入数组,并将这些单词转换为其根形式。

1)在与上一练习相同的Jupyter notebook中,导入WordNetLemmatizer并下载WordNet,如下所示:

2)创建一个lemmatizer实例,如下所示:

3)创建一个包含相同单词的不同形式的数组:

4)将lemmatizer应用于words数组中的每个单词,并将它们存储在新数组中,如下所示。words参数提供了lemmatize函数与它应该被词形还原的单词。pos参数是你想要词形还原的词性。“v”代表动词,因此lemmatizer会将单词缩减为最接近的动词形式:

5)以DataFrame的形式打印原始单词及其根形式,如下所示:

预期输出如图1-13所示。

图1-13 词形还原结果

6.标记化

标记化是将语料库分解为单个标记的过程。标记是最常用的单词。因此,此过程将语料库分解为单个单词,但也可以包括标点符号和空格等。

这项技术是最重要的技术之一,因为它是我们在下一章中学习的许多自然语言处理应用的先决条件,例如词性(Parts-of-Speech,PoS)标记。这些算法将标记作为输入,并且不能使用字符串或文本段落作为输入。

可以执行标记化以获得单个单词以及单个句子作为标记。让我们在以下练习中尝试这两种方法。

练习5:标记化单词

在本练习中,我们将取一个输入句子,并从中生成单个单词作为标记。

1)在同一个Jupyter notebook中,导入nltk:

2)从nltk中导入word_tokenize和punkt,如下所示:

3)将单词存储在变量中并对其应用word_tokenize(),然后打印结果,如下所示:

预期输出如图1-14所示。

图1-14 词标记化后的结果

如你所见,即使标点符号也被标记化并被视为单独的标记。

现在让我们看看如何标记句子。

练习6:标记化句子

在本练习中,我们将输入一个输入句子,并从中生成单个单词作为标记。

1)在同一个Jupyter notebook中,导入sent_tokenize,如下所示:

2)在变量中存储两个句子(我们上一个练习中的句子实际上是两个句子,所以我们可以用相同的句子来查看单词和句子标记之间的区别)并在其上应用sent_tokenize(),然后打印结果,如下所示:

预期输出如图1-15所示。

图1-15 标记句子的输出

如你所见,这两个句子形成了两个单独的标记。

7.其他技巧

有几种方法可以执行文本预处理,包括使用各种Python库(如BeautifulSoup)去除HTML标记。之前的练习旨在向你介绍一些技巧。根据手头的任务,你可能只需要使用其中的一个两个又或全部,包括对它们所做的修改。例如,在噪声消除阶段,你可能会发现有必要删除诸如“the”“and”“this”和“it”之类的单词。因此,你需要创建一个包含这些单词的数组,并通过for循环传递语料库,以仅存储不属于该数组的单词,从语料库中删除嘈杂的单词。另一种方法是在本章后面给出的,并在标记化后完成。

练习7:删除停止词

在本练习中,我们将使用一个输入句子并从中删除停止词。

1)打开Jupyter notebook并使用以下代码行下载“stopwords”:

2)将句子存储在变量中,如下所示:

3)导入stopwords并创建一组英文停止词,如下所示:

4)使用word_tokenize标记句子,然后将那些不出现在stop_words中的标记存储在数组中。然后,打印该数组:

预期输出如图1-16所示。

图1-16 移除停止词后的输出

此外,你可能需要将数字转换成它们的单词形式。这也是一种可以添加到噪声消除功能中的方法。此外,你还可能需要使用缩略库,该库用于扩展文本中现有的缩略。例如,contractions库将把“you're”转换成“you are”,如果这对你的任务是必要的,那么建议安装并使用这个库。

文本预处理技术超出了本章中讨论的技术,可以包括任务或语料库所需的任何东西。在某些情况下,有些词可能很重要,而在另一些情况下则不重要。