内容


向 Watson 询问 Twitter 提供的信息,第 1 部分

获取您的 Twitter 凭证

系列内容:

此内容是该系列 4 部分中的第 # 部分: 向 Watson 询问 Twitter 提供的信息,第 1 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:向 Watson 询问 Twitter 提供的信息,第 1 部分

敬请期待该系列的后续内容。

您是否想知道 Twitter 上的用户对某个特定主题的情绪?您是否想知道 Twitter 控们对最新的爆炸性新闻有何看法?在本教程系列中,您将学习如何快速构建一个从 Twitter 中获取数据的应用程序,然后借助 IBM Watson 服务(比如 Tone Analyzer、Visual Recognition 和 Alchemy),使用这些数据来获得认知洞察。完成本系列后,您将了解如何将 Watson starter 包部署在 IBM Bluemix 上,将能够扩展 Watson starter 包来满足特定的业务需求。

本系列分为四个部分:

  • 第 1 部分:设置 Bluemix 环境并从 Twitter 中提取数据。
  • 第 2 部分:使用 Watson Tone Analyzer 分析推文文本,以了解其中包含的情绪(生气、害怕、高兴、悲伤或厌恶)。
  • 第 3 部分:分析推文图片,以便对图片进行分类和识别,甚至在未提供图像描述时也能执行这些操作。
  • 第 4 部分:分析推文文本,了解围绕特定词汇的情感。

构建您的应用程序需要做的准备工作

运行应用程序获取代码

备注:示例应用程序没有指定密码,所以无需在这里输入密码就可以启动 iPython IDE。单击 Log in。您将被转到应用程序的登录页,该登录页是一个 iPython 框架。

1

获取您的 Twitter 凭证

本教程使用推文作为数据源。要通过编程方式从 Twitter 中拉取推文,需要使用 Twitter API,为此,您需要获得 OAuth 凭证。

  1. 如果还没有 Twitter 帐户,请注册一个帐户。
  2. 按照这些说明获取访问令牌。完成上述操作后,您会拥有以下四种凭证:用户密钥(consumer key)、用户密钥机密(consumer key secret)、访问令牌(access token)和访问令牌机密(access token secret)。将这些凭证保存在方便的地方,因为以后的一个步骤将需要它们。
2

设置 Bluemix 环境

Bluemix 是一个云开发环境。当您将代码放在 Bluemix 上时,构建和部署就会在云上自动完成。在本教程中,将会使用一些 Python 库,但不需要将它们安装在本地计算机上的任何地方,或者将它们上传到您的 Bluemix 帐户。当 Bluemix 编译您的代码时,它会通过 pip 程序自动为您安装这些库。

本教程使用了 iPython 框架,以便您在执行步骤、试验代码和根据自己的需要修改代码时,有一个类似 IDE 的 shell。

在这一步骤中,将会创建一个 Bluemix 应用程序,让它准备好接受您将编写和运行的代码。如果您使用之前提供的“获取代码”选项部署了 iPython starter 包,请跳到步骤 2.5。

  1. 如果您没有 Bluemix 帐户,请注册该帐户。
  2. 登录之后,在 Bluemix 仪表板上,单击左侧 Cloud Foundry 应用程序选项。 Bluemix Compute 图标
  3. 单击 Python 选择 Python 运行时。
  4. 为应用程序指定一个名称并单击 创建。等待使用默认的 starter 代码构建和部署应用程序。在载入您的应用程序期间,抽点时间阅读一下向 Bluemix 存储库推送代码的机制。可通过两种方式将代码推送到 Bluemix。您可以在本地编写和测试代码,然后通过 Cloud Foundry 命令行接口将代码推送到 Bluemix。或者,您可以在 Bluemix Web 编辑器上编写代码,通过与 Bluemix 集成的 Git 存储库管道推送更改。在本教程中,您将使用 Git 存储库管道。
  5. 创建并载入您的应用程序时,可以单击 查看应用程序 来查看它。您会看到一个 Python starter Application 的消息。
  6. 返回到前面的 Start Coding 页面。单击 Overview
  7. 单击左测“概述”选项,在该页面上单击“持续交付”下的 添加按钮,让您的应用程序使用 Bluemix 的自动“提交-推送-部署”管道,从而创建 Git 存储库。 Add Git 推送按钮
    Add Git 推送按钮
  8. 确保已选中 使用起动器应用程序包填充存储库,并启用 Build 和 Deploy Pipeline 复选框,然后单击 继续。显示成功消息时,单击 关闭。如果现在查看持续交付 部分,就会看到您的 Git 存储库的 URL 和一个 Edit code 按钮。您现在可以通过浏览器本身来编辑应用程序的代码了。应用程序的 Git URL
    应用程序的 Git URL
  9. 单击 编辑代码。您的工作区已设置好,Web IDE 编辑器页面已打开。花费一点时间看看为您的应用程序填充的默认文件,了解这些文件的用途:
    • .git 和 launchConfigurations:您的应用程序要正确地使用 Bluemix,这两个文件夹中的所有文件都是必不可少的。不要更改或重命名这些文件夹中的任何文件。
    • static:这个文件夹是一个可选的文件夹,其中包含了不会在编译不同构建版本之间更改的文件。每次编辑应用程序代码和重新部署应用程序时,您添加到根文件夹的所有非代码文件和您写入所创建的其他所有文件夹的所有文件都会被覆盖。因此,如果需要持久保存任何文件,可将它们保留在 static 文件夹中。通常,所有登录页 HTML、CSS、图像文件和其他类似文件都存储在 static 文件夹中。
    • .cfignore、.gitignore 和 .CHANGELOG.md:这些文件是默认的存储库文件。不要编辑或重命名它们。
    • License.txt:此文件是一个可选的文本文件,供您记载用于分发应用程序的许可。
    • Manifest.yml:此文件是一个必备文件,它会告诉 Bluemix 更多应用程序信息。您可能需要在以后的一个阶段编辑此文件,但就现在而言,保留文件中的默认值就足够了。
    • Procfile:此文件告诉 Bluemix,在将您的应用程序部署到为您分配的服务器时,要运行哪些代码。您的根文件夹可能包含多个代码文件,但您通常只使用一个文件作为启动点。可在 Procfile 中指定该文件。
    • README.md:此文件是一个可选文件,其中记录了应用程序用户的必要操作的说明。
    • requirements.txt:Bluemix 使用此文件查看您的代码与任何外部库是否存在依赖关系。如果此文件中列出了一些库,而且这些库可从 pip 安装,那么 Bluemix 将自动签出该库,并使用它们编译您的代码。您不需要分开上传这些库。
    • server.py:如果从头创建您的应用程序,就会存在此文件。该文件是一个代码文件,您可以删除它并将它替换为自己的代码。在删除此文件之前,请花一些时间看看它。它包含用于在运行您的应用程序的端口上显示某个网页的代码。如果在 Bluemix 上运行应用程序,则会从环境变量中获取主机和端口值。如果在本地运行应用程序,端口默认为 8080。
    • hello_world.py:如果您使用了 “获取代码” 选项来部署应用程序,就会存在此文件。该文件包含一个简单的 HelloWorld 脚本,用于测试您的部署(操作说明在应用程序随带的 README.md 文件中)。

    接下来,您将编辑其中的三个文件。

  10. 编辑默认文件,以便您可以将该应用程序用于本教程。您必须修改三个文件:requirements.txt、Procfile 和 manifest.yml。
    • requirements.txt:对于本教程,您需要两个 Python 库。一个是 ipython[notebook],它提供了一个交互式的 Python shell。第二个库是用于拉取推文的 twitter 库。如果计划执行本教程中可选的第 5 步,则需要另外三个库。这三个库是:matplotlib、wordcloud 和 Pillow。单击 requirements.txt 文件编辑它,添加所有这些库,将每个库放在一个新行上:显示库的文件
    • Procfile:因为将要使用 iPython 框架,所以必须告诉 Bluemix 这是用于启动应用程序的文件。为此,请将 Procfile 的内容替换为以下代码行。
      web: ipython profile create; echo "c.NotebookApp.password = '$( python -c 'from IPython.lib import passwd; import os; print passwd(os.environ.get("PASSWORD", ""))' )'" >> ~/.ipython/profile_default/ipython_notebook_config.py; cd content; ipython notebook --port=$VCAP_APP_PORT --ip=$VCAP_APP_HOST --no-mathjax

      确保所有代码在一行上,而且没有任何换行符。

    • manifest.yml:指定您的 Python 代码的 buildpack(构建包)。如果未指定 buildpack,则会使用 Bluemix 上的最新 buildpack。指定 buildpack 的优势在于,您可以确保您的应用程序正常工作,而且部署不会由于任何 buildpack 升级而失败。将下面这行附加到文件末尾处:
      buildpack: "https://github.com/cloudfoundry/python-buildpack.git#v1.5.5"
      该屏幕显示了 buildpack 行
      该屏幕显示了 buildpack 行
  11. 提交您的更改并重新部署应用程序。您是在云存储库的本地分支中对文件执行这些更改的。现在,必须将这些更改推送到远程 Git 主存储库,并重新编译该应用程序。在左侧的导航栏中,单击 Git Repository 图标。 Git 存储库图标

    此时显示了更改的文件,其中包括 Procfile 和 requirements.txt。输入一条提交消息并单击 Commit。完成提交后,更改会显示在左侧的 Outgoing 下。单击 Push

  12. 应用程序的编译和重新部署会自动开始,您可以在 Build and Deploy 页面上观察进度。 Bluemix 仪表板右上角的图像
    Bluemix 仪表板右上角的图像

    如果编译未自动开始,在 Build Stage 磁贴上单击 Run 图标。等待编译完成,查看部署阶段是否会自动开始。如果该阶段未自动开始,请单击 Deploy Stage 磁贴上的 Run 图标。编译更改并部署您的应用程序后,应用程序 URL 会显示在 Deploy Stage 磁贴上,旁边有一个绿色圆圈。

  13. 单击应用程序 URL。应用程序的 iPython 框架将会启动并提示您输入密码。回想一下您编辑 Procfile 文件的步骤。因为没有指定密码,所以无需在这里输入密码就可以启动 iPython IDE。单击 Log in。您将被转到应用程序的登录页,该登录页是一个 iPython 框架。

现在可以开始编写和运行您的代码了,无需在每次更改代码时重新部署您的应用程序。

3

从 Twitter 中获取实时推文

您已准备好从 Twitter 流将实时推文拉入您的应用程序中。Twitter 通过三种方式提供公开的推文:

  • Firehose:当时传输的所有推文
  • Sample:在当时传输的推文的随机采样
  • Filter:当时与您指定的过滤器匹配的所有推文

在本教程中,您将拉取经过过滤的推文,以便有一个小型、可管理的数据集来供您试验。您将向 Twitter 验证自己,获取特定用户的推文,并将这些推文存储在一个文件中供以后使用。然后,您将浏览这些推文,只从推文中提取文本。

  1. 登录到您的应用程序(您应用程序的 URL 显示在应用程序的 Overview 页面上)。如果在上一步之后立即执行这一步,该页面应该已经打开。
  2. 单击 New > Python 2 创建一个记事本(notebook)。 创建一个 Python 记事本
    创建一个 Python 记事本

    在学习本教程的过程中,您将使用此记事本编写、运行和存储 Python 代码。记事本的寿命很短;它们不会持久保存到重新部署应用程序后。因此,如果计划将代码更改推送到 Git 存储库,一定要下载您的记事本。请注意,一种好的做法是为您编写的所有代码都保留一个本地副本。

  3. 不断编写代码并测试它。记事本中的每个单元可以包含可独立运行的代码,但以前的运行单元的输出会保留在内存中,供以后的单元使用。
    1. 导入需要的库。在此阶段,您需要两个库:twitter 和 json。
      		import json
      		from twitter import TwitterStream, OAuth
    2. 向 Twitter 验证您自己。您需要使用在第 1 步中获得的凭证。
    		CONSUMER_KEY = raw_input('Enter the Twitter  consumer key: ')
    		CONSUMER_SECRET = raw_input('Enter the Twitter  consumer key secret: ')
    		ACCESS_TOKEN = raw_input('Enter the Twitter  access token: ')
    		ACCESS_SECRET = raw_input('Enter the Twitter  access token secret: ')
    		
    		oauth = OAuth(ACCESS_TOKEN, ACCESS_SECRET, CONSUMER_KEY, CONSUMER_SECRET)
  4. 拉取一些推文。因为 Watson 服务(您将在以后使用)需要大量的文本语料才能正常工作,所以请确保您选择了经常发表推文的用户。对于本教程,我们将拉取一个用户 ID 为 14677919 的用户的推文。
    		twitter_stream = TwitterStream(auth=oauth)
    		iterator = twitter_stream.statuses.filter(follow="14677919")
  5. 将 Twitter 返回的数据转储到一个文件中供以后使用。另外,也可以将推文打印到控制台,以便查看发生的事情。
    		i = 50
    			#
    			# the number of tweets to read
    			# a small number so that the code runs faster
    			#
    		tweets = open("./static/tweets.json", "w")
    			#
    			# write to the static folder so that the file persists
    			#
    		for tweet in iterator:
    		    tweet_raw = json.dumps(tweet)
    		    print >> tweets, tweet_raw
    				#
    				# write the entire tweet to a file, for use later
    				#
    		    tweet_text = json.loads(tweet_raw.strip())
    		    if 'text' in tweet_text:
    		        print tweet['text'].encode('utf-8')  
    				#
    				# so that only the text of the tweet
    				# is displayed on the console
    				# no need to see everything
    				#
    		    i -= 1
    		    if i == 0:
    		        break
    		
    		tweets.close()

您拉取了某个用户的推文的完整内容,并将它们保存到一个文件。在这一步之后,您不再需要连接到 Twitter。

您现在已准备好处理推文了。在接下来的几步中,因为将要分析推文的文本(而不是推文包含的其他数据),所以将会只提取推文的文本并清理它。

4

清理挖掘到的数据

推文传输到控制台时,您会注意到,文本包含一些执行任何文本分析都用不到的字符串。例如,词汇“RT”与情感分析(sentiment analysis)无关,也不是表示 URL 的短语。在这一步中,清理推文数据,以便 Watson 服务(您将在本系列的后续教程中用到该服务)可以更好地分析文本。

继续后面的操作之前,请查看您在上一步中生成的 JSON 文件。

一个 JSON 格式的推文
一个 JSON 格式的推文

推文包含的所有信息都被保存为一个有多个嵌套实体组成的 JSON 对象。推文的结构已在 Twitter 开发人员文档中解释。这是推文对象的一种形象表示。

您感兴趣的是 text 节点。在这一步中,将会提取该节点的内容,并将它写入一个文件供以后使用。您可以包含一个 print 语句来显示写入该文件的文本,这是一个可选操作。

	# clean up the tweets to remove punctuations, hashtags, and other unwanted stuff #
	
	import json
	
	end_strip = [".", ",", "?", "/", "!", "*", ":", ")", "'", '"']
	start_strip = [":", "*", "(", "'", '"']
	
	words = [] # a list to contain all the words in all the tweets
	
	tweets_file = open('./static/tweets.json', 'r')
	for line in tweets_file:
	    tweet = json.loads(line)
	    #print tweet
	    if 'text' in tweet:
	        tweet_text = tweet['text']
	        #print tweet
	        for word in tweet_text.split():
	            word = word.lower()
	            if word == "rt": # do not add to list if word is "rt"
	                break
	            for item in end_strip:
	                if word.endswith(item):
	                    word = word[:-1]
	            for item in start_strip:
	                if word.startswith(item):
	                    word = word[1:]
	            words.append(word)
	
	tweets_file.close()
	
	prefix_list = ("http", "@", "t.co", "bit.ly")
	# do not reckon words that start with any of the strings in the prefix list
	for word in words[:]:
	    if word.startswith(prefix_list):
	        words.remove(word)
	
	text = ""
	for word in words:
	    #print word
	    text = text + " " + word
	#print text
	text = text.encode('utf-8')
	
	# write the text to a file, for later use
	textfile = open("./static/tweets_text.txt", "w")
	textfile.write(text)
	textfile.close()
	
	print "Done cleaning up tweets."

运行代码。在将推文的文本写入文本文件时,您会看到它们显示在了页面上。完成代码运行时,您会获得一个文本文件,其中仅包含推文文本,清理了标点符号和不必要的词汇。

5

测试数据

您从 Twitter 中挖掘的文本可能非常多,以至于无法快速直观地查看文本中是否存在任何不相关的词汇。一个执行快速检查的有趣方式是将文本转换为文字云,文字云将突出显示出现次数更多的词汇。

这一步完全是可选的。即使跳过这一步,教程的其他部分也能正常执行。

  1. 您使用 matplotlib 库生成一个文字云图像。但是,因为您希望生成的图像显示在浏览器页面上的 iPython 记事本中(而不是默认的 matplotlib 后端),所以,应该首先在您的代码中发出以下命令并运行单元代码。
    		%matplotlib inline
  2. 现在,生成文字云。
    		# generate a word cloud #
    		
    		f = open("./static/tweets_text.txt", "r")
    		text = f.read()
    		
    		from wordcloud import WordCloud
    		wordcloud = WordCloud().generate(text)
    		
    		import matplotlib.pyplot as plt
    		plt.imshow(wordcloud)
    		plt.axis("off")
    		
    		wordcloud = WordCloud(max_font_size=40, relative_scaling=.5).generate(text)
    		
    		plt.imshow(wordcloud)
    		plt.axis("off")
    		plt.show()

结束语

在本教程中,您设置了一个交互式的 Bluemix 环境,用于挖掘推文和清理推文,以便使用 Watson 服务进一步处理它们。在本教程系列的后续部分中,会将此数据提供给 Watson 服务并获取认知洞察。

此外,这里还提供了一些扩展本教程代码的选项。

  • 您已将推文保存到一个文件中供以后使用。在业务场景中,存储库文件可能无法保存大量数据。试着调整您的代码,以将数据保存到存储系统(比如 Object Storage)并从中读取数据。
  • 您拉取了某个特定用户的推文。可以调整代码,围绕关键词、哈希标签(hashtags)或其他用户来拉取推文。试验您最感兴趣的主题区域,看看推文提供了哪些信息。
  • 在本教程系列的后续部分中,将会使用一个 Watson 服务来从图片中获取直观洞察。考虑探索推文的结构,调整您的代码来从推文提取图片并存储它们。
  • 您可能还想查看其他允许数据采集的社交网站,并扩展此应用程序从这些网站中获取数据。例如,Instagram、StackOverflow、GitHub 和 YouTube 拥有可供您使用的 API 端点。

相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=认知计算
ArticleID=1043055
ArticleTitle=向 Watson 询问 Twitter 提供的信息,第 1 部分: 获取您的 Twitter 凭证
publish-date=12072016