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

介绍

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

Twitter上的推文有助于我们找到世界上最流行的新闻主题。Amazon上的评论有助于用户购买最佳评级的产品。这些组织和结构化知识的例子代表了自然语言处理(NLP)任务。

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

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

前提条件

对于本教程,你应该有Python 3安装,以及在你的计算机上设置的本地编程环境. 如果不是这样,你可以通过遵循 适当的安装和设置指南为你的操作系统来设置。

要充分利用本教程,您应该熟悉 Python 编程语言

步骤 1 - 导入 NLTK

在我们开始在Python工作之前,让我们确保安装了NLTK模块,在命令行上,通过运行以下命令检查NLTK:

1python -c "import nltk"

** 如果安装了 NLTK**,这个命令将完全没有错误,现在,让我们确保您安装了最新版本:

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

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

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

1[secondary_label Output]
2Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'

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

1pip install nltk

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

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

在本教程中,我们将使用一个可以通过NLTK下载的Twitter尸体。具体来说,我们将与NLTK的twitter_samples尸体一起工作。

1python -m nltk.downloader twitter_samples

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

1[secondary_label Output]
2[nltk_data] Downloading package twitter_samples to
3[nltk_data]     /Users/sammy/nltk_data...
4[nltk_data]   Unzipping corpora/twitter_samples.zip.

接下来,下载部分语音(POS)标签器。 POS标签 是标记文本中的单词与特定POS标签相符的过程:名词,口号,附加词,口号等 在本教程中,我们将特别使用NLTK的averaged_perceptron_tagger

1python -m nltk.downloader averaged_perceptron_tagger

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

1[secondary_label Output]
2[nltk_data] Downloading package averaged_perceptron_tagger to
3[nltk_data]     /Users/sammy/nltk_data...
4[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.

让我们再检查一下,是否下载了正确的Corpus。在您的终端中,打开Python的交互环境:

1python

在Python的互动环境中,导入twitter_samples字符串:

1from nltk.corpus import twitter_samples

NLTK的twittercorpus目前包含从Twitter流API中获取的2万条推文样本,完整的推文被存储为线分隔的(JSON)(https://andsky.com/tech/tutorials/an-introduction-to-json)。

1twitter_samples.fileids()

我们的产出将是这样的:

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

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

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

运行这将返回大量的输出. 它通常会看起来像这样:

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

现在我们知道我们的尸体被 succesively下载了,所以让我们用短语ctrl +D离开Python的交互环境。

现在我们可以访问twitter_samples组件,我们可以开始编写一个脚本来处理推文。

我们的脚本的目标将是计算twitter_samples团体的积极子集中出现的附加词和名词的数量:

  • noun,在其最基本的定义,通常被定义为一个人,地方,或事物. 例如,一个 movie,一个 book,和一个 _burger_都是名词。 计数名词可以帮助确定有多少不同的主题正在被讨论
  • 一个 adjective是修改一个名词(或名词)的单词,例如:一个 horrible 电影,一个 funny 书,或一个 delicious burger。

您可以稍后扩展此脚本以计算积极的附加词(great, awesome, happy,等等)与负的附加词(boring, lame, sad,等等),这些可以用来分析关于产品或电影的推文或评论的情绪,例如。

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

步骤3 - Tokenizing 句子

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

在我们的文件中,让我们先导入尸体,然后创建一个‘tweets’ 变量并分配给它从‘positive_tweets.json’文件的 tweet 字符串的 列表

1[label nlp.py]
2from nltk.corpus import twitter_samples
3
4tweets = twitter_samples.strings('positive_tweets.json')

当我们第一次加载我们的推文列表时,每个推文都以一个字符串表示。

Tokenization是将一系列字符串分解为字,关键字,短语,符号和其他元素,这些元素称为 tokens

1[label nlp.py]
2from nltk.corpus import twitter_samples
3
4tweets = twitter_samples.strings('positive_tweets.json')
5tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

这个新的变量,‘tweets_tokens’,是一个列表,列表中的每个元素都是一个代币列表.现在我们有每个推文的代币,我们可以用相应的POS标签标记代币。

步骤4 - 标记句子

为了访问NLTK的POS标签,我们需要导入它. 所有 导入声明必须在脚本的开始。

1[label nlp.py]
2from nltk.corpus import twitter_samples
3from nltk.tag import pos_tag_sents
4
5tweets = twitter_samples.strings('positive_tweets.json')
6tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

现在,我们可以标记我们每个代币。NLTK允许我们使用: pos_tag_sents(). 我们将创建一个新的变量 tweets_tagged,我们将使用它来存储我们的标记列表。

1tweets_tagged = pos_tag_sents(tweets_tokens)

要想了解标记代币的外观,这里是我们 tweets_tagged 列表中的第一个元素的外观:

1[(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 标签器标记 单一称号 (NN) 与 多重称号 (NNS) 不同的标签。 为了简化,我们只会通过跟踪 NN 标签来计算单一称号。

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

步骤5 - 计算 POS 标签

我们将跟踪使用累积(数)变量出现的JJNN的次数,我们将不断添加每当我们找到一个标签。

1[label nlp.py]
2from nltk.corpus import twitter_samples
3from nltk.tag import pos_tag_sents
4
5tweets = twitter_samples.strings('positive_tweets.json')
6tweets_tokens = twitter_samples.tokenized('positive_tweets.json')
7
8JJ_count = 0
9NN_count = 0

在我们创建变量后,我们将创建两个 for 环节。 第一环节**将在列表中的每个推文中迭代。

然后我们将检查标签是否匹配字符串JJNN使用 条件陈述

 1[label nlp.py]
 2from nltk.corpus import twitter_samples
 3from nltk.tag import pos_tag_sents
 4
 5tweets = twitter_samples.strings('positive_tweets.json')
 6tweets_tokens = twitter_samples.tokenized('positive_tweets.json')
 7
 8JJ_count = 0
 9NN_count = 0
10
11for tweet in tweets_tagged:
12    for pair in tweet:
13        tag = pair[1]
14        if tag == 'JJ':
15            JJ_count += 1
16        elif tag == 'NN':
17            NN_count += 1

在这两个循环完成后,我们应该在我们的体内有附加词和称号的总数. 要查看我们的脚本找到多少附加词和称号,我们将添加印刷陈述到脚本的末尾。

 1[label nlp.py]
 2...
 3
 4for tweet in tweets_tagged:
 5    for pair in tweet:
 6        tag = pair[1]
 7        if tag == 'JJ':
 8            JJ_count += 1
 9        elif tag == 'NN':
10            NN_count += 1
11
12print('Total number of adjectives = ', JJ_count)
13print('Total number of nouns = ', NN_count)

在此时,我们的程序将能够输出在尸体中发现的附加词和名词的数量。

第6步:运行NLP脚本

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

1python nlp.py

如果一切顺利,当我们运行我们的脚本时,我们应该得到以下输出:

1[secondary_label Output]
2Total number of adjectives =  6094
3Total number of nouns =  13180

如果你的输出看起来相同,这意味着你已经成功完成了这个教程。

完成代码

对于我们完成的代码,我们应该添加一些评论,以便让其他人和我们未来的自我更容易遵循。

 1[label nlp.py]
 2# Import data and tagger
 3from nltk.corpus import twitter_samples
 4from nltk.tag import pos_tag_sents
 5
 6# Load tokenized tweets
 7tweets_tokens = twitter_samples.tokenized('positive_tweets.json')
 8
 9# Tag tagged tweets
10tweets_tagged = pos_tag_sents(tweets_tokens)
11
12# Set accumulators
13JJ_count = 0
14NN_count = 0
15
16# Loop through list of tweets
17for tweet in tweets_tagged:
18    for pair in tweet:
19        tag = pair[1]
20        if tag == 'JJ':
21            JJ_count += 1
22        elif tag == 'NN':
23            NN_count += 1
24
25# Print total numbers for each adjectives and nouns
26print('Total number of adjectives = ', JJ_count)
27print('Total number of nouns = ', NN_count)

在本教程中,我们已经使用了通过NLTK下载的Twitter corpus,但您可以在自己的数据中阅读。

您可以通过阅读[如何创建Twitter应用程序](https://andsky.com/tech/tutorials/how-to-create-a-twitter-app)来了解更多有关访问Twitter API的信息,然后您可以查看我们的指南如何使用Python 3和Tweepy图书馆创建Twitterbot(https://andsky.com/tech/tutorials/how-to-create-a-twitterbot-with-python-3-and-the-tweepy-library),该指南显示如何使用Tweepy Python库收集包含特定哈希标签的推文。

从这里,您可以扩展代码以计算多数和单数符号,对附加词进行情绪分析,或使用 Python 和 matplotlib可视化数据。

结论

在本教程中,您了解了一些自然语言处理技术,以使用Python中的NLTK库来分析文本. 现在您可以下载Corpora,tokenize,tag,并在Python中计算POS标签。

Published At
Categories with 技术
comments powered by Disqus