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

介绍

基于文本的交流已经成为最常见的表达形式之一。我们每天发送电子邮件,短信,鸣叫和更新我们的状态。结果,非结构化文本数据变得非常普遍,并且分析大量文本数据现在是了解人们正在想什么的关键方式。 Twitter上的推文帮助我们在世界上找到热门新闻话题。亚马逊评论帮助用户购买最好的产品。组织和构造知识的这些例子表示自然语言处理(NLP)任务。 NLP是一个计算机科学领域,专注于计算机和人类之间的交互。 NLP技术用于分析文本,为计算机提供了一种理解人类语言的方式。 NLP应用程序的几个示例包括自动摘要,主题分段和情绪分析。 本教程将介绍使用 自然语言工具包(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的数据和标签

在本教程中,我们将使用一个Twitter语料库,我们可以通过NLTK下载。具体而言,我们将与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变量的过程:名词,动词,形容词,副词等,在本教程中,我们将专门使用NLTK的 averaged_perceptron_tagger 。平均感知器标记器使用感知器算法来预测哪个POS标记最有可能给出该单词。让我们下载标签,像这样:
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的twitter语料库目前包含从Twitter Streaming API检索的20,000条tweets样本。全鸣叫存储为线分隔 JSON 。 我们可以使用JSON看到文件中存在多少胼 twitter_samples.fileids()方法:
twitter_samples.fileids()
我们的输出将如下所示:
Output[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']
使用这些文件的ID那么我们就可以返回鸣叫 字符串
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'...]
我们现在知道我们的语料库被成功下载。因此,让我们退出使用快捷Python的交互式环境 ctrl + D 。 现在我们已经进入 twitter_samples语料库,我们可以开始编写脚本来处理的tweet。 我们的脚本的目标将是计算有多少形容词和名词出现在的正子 twitter_samples文集:
  • 一个名词 ,在其最基本的定义,通常被定义为一个人,地方或事物。 例如, 一部电影 ,一本书 ,一个汉堡都是名词。计数名词可以帮助确定正在讨论多少不同的主题。
  • 一个形容词是修饰名词(或代词),例如一个词: 恐怖的电影,一个有趣的书,或美味的汉堡。计数形容词可以确定正在使用哪种类型的语言,即意见倾向于包括比事实更多的形容词。
你以后可以把这个脚本扩展来算正面的形容词( 伟大的真棒快乐 ,等等)与负形容词( 无聊的瘸腿的悲伤等),它可以用来分析Twitter或评论的情绪有关产品或电影。此脚本提供了可反过来通知与该产品或电影相关的决策的数据。 我们将在下一步开始我们的脚本。

第3步 - 令牌化句子

首先,在你选择的文本编辑器创建,我们将要使用的脚本并调用它 nlp.py 。 在我们的文件中,我们首先导入语料库。然后,让我们创建一个 tweets 变量并分配给它的 列表从鸣叫串 positive_tweets.json文件。
nlp.py
from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')
当我们首先加载我们的推文列表时,每个推文都表示为一个字符串。在我们确定我们的tweets中的哪些单词是形容词或名词之前,我们首先需要对我们的tweets进行标记。 符号化是分手一系列字符串成片如文字,关键字,短语,符号等元素,被称为 令牌的行为。 让我们创建一个名为新变量 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 ,是一个列表,其中列表中的每个元素是令牌的列表。现在我们有每个tweet的令牌,我们可以用适当的POS标签标记令牌。

第4步 - 标记句子

为了访问NLTK的POS标记器,我们需要导入它。所有import语句必须在脚本的开头。让我们把这个新的import在我们的其他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')]
我们可以看到,我们的tweet表示为一个列表,对于每个令牌,我们有关于它的POS标签的信息。每个标记/标签对被保存为一个 元组 。 在NLTK,为 形容词 ,缩写为 JJ 。 该NLTK恶搞标志着 单数名词NN )比 复数名词 (不同的标签 NNS )。 为了简化,我们将只通过跟踪的数单数名词 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循环。 第一个循环将通过列表中的每个迭代鸣叫。 第二个循环将通过在每个鸣叫每个标记/标签对迭代。对于每个对,我们将使用适当的元组索引来查找标记。 然后,我们会检查,看是否符合标签或者字符串 '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的API“ 如何创建一个Twitter的应用程序 。” 然后,您可以查看我们的指南 “如何创建与Python 3和Tweepy库的Twitterbot” ,它展示了如何使用Tweepy Python库收集鸣叫,其中包括一定的散列标签。然后可以使用NLTK分析您收集的数据。 从这里,你可以扩展代码来算二者复数和单数名词,形容词做的情感分析,或显示数据 Python和matplotlib

结论

在本教程中,您学习了一些自然语言处理技术,以使用Python中的NLTK库来分析文本。现在,您可以在Python中下载语法,标记,标记和计数POS标记。您可以利用本教程来简化在Python中使用自己的文本数据的过程。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏