欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~
介绍
文本已成为最常见的表达形式之一。我们每天都要发送电子邮件、短信、推文、更新状态。因此,非结构化文本数据变得非常普遍,分析大量文本数据现在是了解人们的想法的关键方法。
微博上的推文帮助我们找到热门新闻主题。淘宝的评论帮助用户购买评价最高的产品。这些例子都是自然语言处理(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