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

来自菜鸟教程
跳转至:导航、​搜索

介绍

基于文本的交流已成为最常见的表达形式之一。 我们每天通过电子邮件、短信、推特和更新我们的状态。 因此,非结构化文本数据变得极为普遍,分析大量文本数据现在是了解人们在想什么的关键方法。

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

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

本教程将介绍使用 Natural Language Toolkit (NLTK):Python 的 NLP 工具。

先决条件

对于本教程,您应该安装 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,你会收到一个错误信息:

OutputTraceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'

错误信息表明没有安装 NLTK,所以使用 pip 下载库:

pip install nltk

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

第 2 步 — 下载 NLTK 的数据和标记器

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

python -m nltk.downloader twitter_samples

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

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

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

python -m nltk.downloader averaged_perceptron_tagger

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

Output[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 的推特语料库目前包含从推特流 API 检索到的 20,000 条推文样本。 完整的推文存储为行分隔的 JSON。 我们可以使用 twitter_samples.fileids() 方法查看语料库中存在多少 JSON 文件:

twitter_samples.fileids()

我们的输出将如下所示:

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

使用这些文件 ID,我们可以返回推文 strings

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

运行它会返回很多输出。 它通常看起来像这样:

Output[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 语料库的正子集中:

  • 名词,在其最基本的定义中,通常被定义为人、地点或事物。 例如,moviebookburger 都是名词。 计数名词可以帮助确定正在讨论多少不同的主题。
  • 形容词是修饰名词(或代词)的词,例如:恐怖电影、有趣书或美味[ X148X] 汉堡。 计数形容词可以确定正在使用的语言类型,即 意见往往包含比事实更多的形容词。

您可以稍后扩展此脚本以计算正面形容词(greatawesomehappy 等)与负面形容词(boringlamesad 等),例如,可用于分析关于产品或电影的推文或评论的情绪。 该脚本提供的数据可以反过来为与该产品或电影相关的决策提供信息。

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

第 3 步 - 标记句子

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

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

nlp.py

from nltk.corpus import twitter_samples

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

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

Tokenization是将一系列字符串分解成单词、关键字、短语、符号等元素的行为,称为tokens。 让我们创建一个名为 tweets_tokens 的新变量,我们将为其分配标记化的推文列表:

nlp.py

from nltk.corpus import twitter_samples

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

这个新变量 tweets_tokens 是一个列表,其中列表中的每个元素都是一个标记列表。 现在我们有了每条推文的标记,我们可以用适当的 POS 标签标记这些标记。

第 4 步 - 标记句子

为了访问 NLTK 的 POS 标记器,我们需要导入它。 所有 import 语句 必须放在脚本的开头。 让我们把这个新的导入放在我们的另一个导入语句下。

nlp.py

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')]

我们可以看到我们的推文被表示为一个列表,并且对于每个令牌,我们都有关于其 POS 标签的信息。 每个令牌/标签对保存为 元组

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

NLTK 标记器使用与 复数名词 (NNS) 不同的标记标记 单数名词 (NN)。 为简化起见,我们将仅通过跟踪 NN 标签来计算单数名词。

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

第 5 步 — 计算 POS 标签

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

nlp.py

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 循环first 循环 将遍历列表中的每条推文。 第二个循环 将遍历每条推文中的每个标记/标签对。 对于每一对,我们将使用适当的元组索引来查找标签。

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

nlp.py

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

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

nlp.py

...

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('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

此时,我们的程序将能够输出在语料库中找到的形容词和名词的数量。

第 6 步 — 运行 NLP 脚本

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

python nlp.py

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

OutputTotal number of adjectives =  6094
Total number of nouns =  13180

如果您的输出看起来相同,则表示您已成功完成本教程。 恭喜!

完成的代码

对于我们完成的代码,我们应该添加一些注释,以便其他人和我们未来的自己更容易遵循。 我们的脚本如下所示:

nlp.py

# Import data and tagger
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

# Load tokenized tweets
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

# Tag tagged tweets
tweets_tagged = pos_tag_sents(tweets_tokens)

# Set accumulators
JJ_count = 0
NN_count = 0

# Loop through list of tweets
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 total numbers for each adjectives and nouns
print('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

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

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

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

结论

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