入门系列之:Python3 如何使用NLTK处理语言数据

欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~python

本文由冰糖葫芦 发表于云+社区专栏算法

介绍

文本已成为最多见的表达形式之一。咱们天天都要发送电子邮件、短信、推文、更新状态。所以,非结构化文本数据变得很是广泛,分析大量文本数据如今是了解人们的想法的关键方法。数据库

微博上的推文帮助咱们找到热门新闻主题。淘宝的评论帮助用户购买评价最高的产品。这些例子都是天然语言处理(NLP)任务的体现。编程

NLP属于计算机科学领域,主要作人机互动。NLP技术用于分析文本,为计算机提供了一种理解人类语言的方法。NLP应用程序的一些例子包括自动文本摘要、主题分隔和情感分析。json

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

准备

首先,您应该安装Python 3,并在计算机上设置一个本地编程环境。要充分利用本教程,您应该先熟悉Python编程语言,能够参考腾讯云开发手册Python中文开发文档和使用腾讯云Python开发环境直接上机实验。微信

第一步,导入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 "<string>", line 1, in <module> ImportError: No module named 'nltk'
复制代码

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

$ pip install nltk
复制代码

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

第二步,下载NLTK的数据和标记器

在本教程中,咱们将使用一个Twitter语料库,该语料库可经过NLTK下载。具体来讲,咱们将使用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标记器。POS标记是对文本中的单词进行标记的过程,使其与特定POS标记对应:名词,动词,形容词,副词等。在本教程中,咱们将使用NLTK的平均感知器标记器。平均感知器标记器使用感知器算法来预测最可能给出该单词的POS标签。让咱们下载该标记器,以下所示:

$ 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 Streaming 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语料库的子集中出现形容词和名词的数量:

  • 名词,根据它最基本的定义,一般指一我的、地方或者事物。例如,电影书籍汉堡都是名词。计算名词能够帮助肯定正在讨论的主题数量。
  • **形容词,**是修饰名词(或代词)的词,例如:一个恐怖的电影,有趣的书,或者美味的汉堡。计算形容词能够决定使用什么类型的语言。

您能够稍后扩展此脚本以计算正面形容词(伟大的使人敬畏的快乐的等)与负面形容词(无聊蹩脚悲伤等),可用于分析推文的情绪或关于产品或电影的评论。此脚本提供的数据能够反过来用于与该产品或电影相关的决策。

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

第三步,把句子分词

首先,在您选择的文本编辑器中,建立咱们将要使用的脚本并调用它nlp.py。

在咱们的文件中,首先导入语料库。而后建立一个tweets变量并从positive_tweets.json文件把它分配到推文字符串列表。

nlp.py
from nltk.corpus import twitter_samples
tweets = twitter_samples.strings('positive_tweets.json')
复制代码

当咱们第一次加载推文列表时,每条推文都用一个字符串来表示。在咱们肯定推文中哪些词是形容词或名词以前,咱们首先须要对咱们的推文进行分词。

Tokenization是将一系列字符串分解为单词、关键字、短语、符号和其余元素,咱们称之为分词。让咱们建立一个名为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标签标记这些分词。

第四步,标记句子

为了访问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')
复制代码

如今,咱们能够标记每一个token 。NLTK容许咱们使用如下方式一次完成全部操做:pos_tag_sents()。咱们将建立一个新变量tweets_tagged,来存储标记列表。这个新行能够直接放在咱们当前脚本的末尾:

tweets_tagged = pos_tag_sents(tweets_tokens)
复制代码

要想知道标记的token长什么样,这是咱们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')]
复制代码

咱们能够看到咱们的推文被表示为一个列表,对于每一个token,咱们都有关于其POS标签的信息。每一个token/标记对都保存为元组。

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

所述标记器NLTK标记单数名词(NN),复数名词(NNS)。为简化起见,咱们只会经过跟踪NN标记来计算单数名词。

在下一步中,咱们将计算在咱们的语料库中出现多少次JJ和NN。

第五步,计算POS标签

咱们将使用累加器(计数)变量跟踪JJ并NN出现的次数,并在每次找到标记时不断添加该变量。首先让咱们在脚本的底部建立计数,咱们将首先设置为零。

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循环。第一个循环将迭代列表中的每一个推文。第二个循环将经过每一个推文中的每一个token /标签对进行迭代。对于每对,咱们将使用适当的元组索引查找标记。

而后,使用条件语句检查标签是否匹配字符串'JJ'或'NN'。若是标记匹配,咱们将add(+=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
复制代码

在两个循环完成后,语料库中会看到形容词和名词的总数。想要查看咱们的脚本找到多少个形容词和名词的话,在脚本末尾添加print语句。

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)
复制代码

如今,咱们的程序可以输出在语料库中找到的形容词和名词的数量了。

第六步,运行NLP脚本

保存nlp.py文件并运行它来查看咱们找到多少个形容词和名词:

$ python nlp.py
复制代码

请耐心等待,脚本运行可能须要几秒钟。若是一切顺利,当咱们运行脚本时,咱们应该获得如下输出:

Total 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语料库,但您能够读取本身的数据。如今,您能够扩展代码以计算复数和单数名词,对形容词进行情感分析,或使用matplotlib可视化您的数据。

结论

在本教程中,您学习了一些天然语言处理技术,以使用Python中的NLTK库分析文本。如今,您能够在Python中下载语料库、token 、标记和计数POS标记。您能够利用本教程来简化在Python中处理本身的文本数据的过程。若是您对NLP感兴趣, 能够访问腾讯云学院天然语言处理相关课程


参考文献:《How To Work with Language Data in Python 3 using the Natural Language Toolkit (NLTK)》

问答

使用NLP进行句子压缩?

相关阅读

Nginx的安装和配置疑难解答

如何备份你的MySQL数据库

MySQL 8.0 版本功能变动介绍

此文已由做者受权腾讯云+社区发布,原文连接:https://cloud.tencent.com/developer/article/1161355?fromSource=waitui

欢迎你们前往腾讯云+社区或关注云加社区微信公众号(QcloudCommunity),第一时间获取更多海量技术实践干货哦~

海量技术实践经验,尽在云加社区

相关文章
相关标签/搜索