如何在 Python 3 中使用自然语言工具包(NLTK)处理语言数据

简介

文本通信已成为最常见的表达形式之一。我们每天都会发送电子邮件、短信、发推文,并更新我们的状态。因此,非结构化文本数据变得非常普遍,分析大量文本数据现在是理解人们思想的关键途径之一。

Twitter 上的推文帮助我们发现世界上的热门新闻话题。亚马逊上的评论帮助用户购买评分最高的产品。这些组织和结构化知识的例子代表了自然语言处理(NLP)任务。

NLP 是计算机科学的一个领域,专注于计算机和人类之间的交互。NLP 技术用于分析文本,为计算机理解人类语言提供了一种方式。NLP 应用的一些例子包括自动摘要、主题分割和情感分析。

本教程将介绍如何使用 Python 的自然语言工具包(NLTK)。

先决条件

在进行本教程之前,您应该已经安装了 Python 3,并在计算机上设置了本地编程环境。如果还没有安装,您可以按照适用于您操作系统的相应安装和设置指南进行设置。

为了充分利用本教程,您应该对 Python 编程语言有一定的了解。

步骤 1 — 导入 NLTK

在我们开始使用 Python 进行工作之前,让我们确保 NLTK 模块已安装。在命令行上,通过运行以下命令检查 NLTK 是否已安装:

python -c "import nltk"

如果 NLTK 已安装,此命令将顺利完成,没有错误。现在,让我们确保您已安装最新版本:

python -c "import nltk; print(nltk.__version__)"

您应该已安装版本 3.2.1,因为我们将使用需要此版本的 NLTK 的 Twitter 包。

如果 NLTK 未安装,您将收到错误消息:


Traceback (most recent call last): File "", line 1, in  ImportError: No module named 'nltk'

错误消息表明 NLTK 未安装,因此请使用 pip 下载该库:

pip install nltk

接下来,我们将下载本教程中将要使用的数据和 NLTK 工具。

步骤 2 — 下载 NLTK 的数据和标注器

在本教程中,我们将使用可以通过 NLTK 下载的 Twitter 语料库。具体来说,我们将使用 NLTK 的 twitter_samples 语料库。让我们通过命令行下载语料库,如下所示:

python -m nltk.downloader twitter_samples

如果命令成功运行,您将收到以下输出:


[nltk_data] Downloading package twitter_samples to
[nltk_data]     /Users/sammy/nltk_data...
[nltk_data]   Unzipping corpora/twitter_samples.zip.

接下来,下载词性标注器(POS 标注器)。词性标注 是将文本中的单词标记为特定的词性标签(名词、动词、形容词、副词等)的过程。在本教程中,我们将具体使用 NLTK 的 averaged_perceptron_tagger。平均感知器标注器使用感知器算法来预测给定单词最可能的词性标签。让我们下载标注器,如下所示:

python -m nltk.downloader averaged_perceptron_tagger

如果命令成功运行,您将收到以下输出:


[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data]     /Users/sammy/nltk_data...
[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.

让我们再次确认语料库是否已正确下载。在您的终端中,打开 Python 交互环境:

python

在 Python 的交互环境中,导入 twitter_samples 语料库:

from nltk.corpus import twitter_samples

NLTK 的 twitter 语料库目前包含从 Twitter 流 API 检索的 20,000 条推文样本。完整的推文存储为以换行分隔的 JSON。我们可以使用 twitter_samples.fileids() 方法查看语料库中存在多少个 JSON 文件:

twitter_samples.fileids()

我们的输出将如下所示:


[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']

使用这些文件 ID,我们可以返回推文字符串:

twitter_samples.strings('tweets.20150430-223406.json')

运行此命令将返回大量输出。通常会看起来像这样:


[u'RT @KirkKus: Indirect cost of the UK being in the EU is estimated to be costing Britain \xa3170 billion per year! #BetterOffOut #UKIP'...]

现在我们知道我们的语料库已成功下载。因此,让我们使用快捷键 ctrl + D 退出 Python 交互环境。

现在我们已经可以访问 twitter_samples 语料库,我们可以开始编写一个处理推文的脚本。

我们脚本的目标是统计出现在 twitter_samples 语料库的正面子集中的形容词和名词的数量:

  • 名词 在其最基本的定义中通常被定义为人、地方或事物。例如,电影汉堡 都是名词。统计名词可以帮助确定正在讨论多少个不同的主题。

  • 形容词 是修饰名词(或代词)的词,例如:可怕的 电影,有趣的 书,或 美味的 汉堡。统计形容词可以确定正在使用何种类型的语言,例如:意见往往包含比事实更多的形容词。

您稍后可以扩展此脚本以统计正面形容词(很棒的令人愉快的快乐的 等)与负面形容词(无聊的糟糕的悲伤的 等)的数量,这可以用于分析关于产品或电影的推文或评论的情感。该脚本提供的数据可以进一步用于决定与该产品或电影相关的决策。

我们将在下一步开始编写我们的脚本。

步骤 3 —— 对句子进行分词

首先,在您选择的文本编辑器中创建我们将要使用的脚本,并将其命名为 nlp.py

在我们的文件中,让我们首先导入语料库。然后让我们创建一个 tweets 变量,并将 positive_tweets.json 文件中的推文字符串列表分配给它。

from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')

当我们首次加载推文列表时,每条推文都表示为一个字符串。在确定推文中的哪些词是形容词或名词之前,我们首先需要对推文进行分词。

分词 是将字符串序列分解为词、关键词、短语、符号和其他元素(称为 标记)的行为。让我们创建一个名为 tweets_tokens 的新变量,将分词后的推文列表分配给它:

from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

这个新变量 tweets_tokens 是一个列表,列表中的每个元素都是一个标记列表。现在我们有了每条推文的标记,我们可以使用适当的词性标记对这些标记进行标记。

步骤 4 —— 对句子进行标记

为了访问 NLTK 的词性标注器,我们需要导入它。所有的导入语句都必须放在脚本的开头。让我们将这个新的导入语句放在我们的其他导入语句下面。

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

现在,我们可以对我们的每个标记进行标记。NLTK 允许我们使用 pos_tag_sents() 一次性完成所有操作。我们将创建一个新变量 tweets_tagged,用于存储我们的标记列表。这一新行可以直接放在我们当前脚本的末尾:

tweets_tagged = pos_tag_sents(tweets_tokens)

为了了解标记后的标记是什么样子,这是我们的 tweets_tagged 列表中第一个元素的样子:

[(u'#FollowFriday', 'JJ'), (u'@France_Inte', 'NNP'), (u'@PKuchly57', 'NNP'), (u'@Milipol_Paris', 'NNP'), (u'for', 'IN'), (u'being', 'VBG'), (u'top', 'JJ'), (u'engaged', 'VBN'), (u'members', 'NNS'), (u'in', 'IN'), (u'my', 'PRP$'), (u'community', 'NN'), (u'this', 'DT'), (u'week', 'NN'), (u':)', 'NN')]

我们可以看到,我们的推文被表示为一个列表,对于每个标记,我们都有关于它的词性标记的信息。每个标记/标记对都保存为一个元组。

在 NLTK 中,形容词 的缩写是 JJ

NLTK 标注器使用不同的标记来标记单数名词 (NN) 和复数名词 (NNS)。为了简化起见,我们将只统计单数名词,通过跟踪 NN 标记。

在下一步中,我们将统计在我们的语料库中 JJNN 出现的次数。

步骤 5 —— 统计词性标记

我们将使用一个累加器(计数器)变量来跟踪 JJNN 出现的次数,并且每次找到一个标记时都会不断地将其添加到累加器中。首先让我们在脚本的底部创建我们的计数器,并将其首先设置为零。

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

创建了变量之后,我们将创建两个 for 循环。第一个循环将遍历列表中的每条推文。第二个循环将遍历每条推文中的每个标记/标记对。对于每个标记对,我们将使用适当的元组索引查找标记。

然后,我们将检查标记是否与字符串 'JJ''NN' 匹配,使用条件语句。如果标记匹配,我们将添加 (+= 1) 到相应的累加器中。

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

完成两个循环后,我们应该得到语料库中形容词和名词的总数。为了查看我们的脚本找到了多少形容词和名词,我们将在脚本的末尾添加打印语句。

...

for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

print('形容词的总数 = ', JJ_count)
print('名词的总数 = ', NN_count)

到目前为止,我们的程序将能够输出语料库中找到的形容词和名词的数量。

第六步 — 运行 NLP 脚本

保存你的 nlp.py 文件并运行它,查看我们找到了多少形容词和名词:

python nlp.py

请耐心等待,脚本运行可能需要几秒钟的时间。如果一切顺利,当我们运行脚本时,应该会得到以下输出:


形容词的总数 =  6094
名词的总数 =  13180

如果你的输出看起来一样,那就意味着你已经成功完成了本教程。恭喜你!

完整的代码

对于我们的完整代码,我们应该添加一些注释,以便他人和我们未来的自己能够更容易地理解。我们的脚本如下所示:


# 导入数据和标记器
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

# 加载标记化的推文
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

# 对标记化的推文进行标记
tweets_tagged = pos_tag_sents(tweets_tokens)

# 设置累加器
JJ_count = 0
NN_count = 0

# 遍历推文列表
for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

# 打印形容词和名词的总数
print('形容词的总数 = ', JJ_count)
print('名词的总数 = ', NN_count)

在本教程中,我们使用了通过 NLTK 下载的 Twitter 语料库,但你也可以读取自己的数据。要熟悉在 Python 中读取文件,请查看我们的指南“如何在 Python 3 中处理纯文本文件”。

你可能也对处理真实的 Twitter 数据感兴趣。你可以通过阅读“如何创建 Twitter 应用”来了解更多关于访问 Twitter API 的信息。然后,你可以查看我们的指南“如何使用 Python 3 和 Tweepy 库创建 Twitterbot”,该指南展示了如何使用 Tweepy Python 库收集包含特定标签的推文。你收集的数据随后可以使用 NLTK 进行分析。

从这里,你可以扩展代码以计算复数和单数名词,对形容词进行情感分析,或者使用 Python 和 matplotlib 对数据进行可视化。

结论

在本教程中,你学习了一些使用 Python 中的 NLTK 库进行文本分析的自然语言处理技术。现在你可以在 Python 中下载语料库、标记化、标记和计算词性标记。你可以利用本教程来简化在 Python 中处理自己的文本数据的过程。

你可能感兴趣的:(Python,python,开发语言)