社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

腾讯云加社区 • 5 年前 • 533 次点击  
阅读 23

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

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

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

介绍

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

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

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

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

准备

首先,您应该安装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),第一时间获取更多海量技术实践干货哦~

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


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/pQziYDwkWJ
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/21422
 
533 次点击