介绍
基于文本的通信已成为最常见的表达形式之一. 我们每天发电子邮件、短信、推特,并更新我们的状态. 因此,非结构化文本数据已经变得极为常见,分析大量文本数据现在是理解人们的想法的关键方式。
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
标签来计算单一称号。
在下一步中,我们将计算JJ
和NN
在整个身体中出现的次数。
步骤5 - 计算 POS 标签
我们将跟踪使用累积(数)变量出现的JJ
和NN
的次数,我们将不断添加每当我们找到一个标签。
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
环节。 第一环节**将在列表中的每个推文中迭代。
然后我们将检查标签是否匹配字符串JJ
或NN
使用 条件陈述。
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标签。