Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 编程 > Ruby > 正文

使用Ruby和Twitter来进行数据挖掘(1)

时间:2015-01-29 11:52 来源:网络整理 作者:51ou.com 阅读:

  2008年10月,我像许多人一样满怀好奇地创建了一个Twitter帐户。像大多数人一样,我与一些朋友建立了连接,做一些随机的搜索来更好地理解这一服务。使用140个字符来进行沟通,这看起来好像不太可能是一个受欢迎的想法,但一件无关的事情却让我看到了Twitter的真正价值所在。

  2009年7月初,我的网站托管服务提供商熄火了,在进行了一番随意的网络搜索后,我发现信息指向了西雅图Fisher Plaza的一场火灾,这场火是罪魁祸首。传统的基于web的信息源更新很慢,没有提供何时服务会恢复正常的指示。然而,在搜索了Twitter之后,我找到了一些个人帐户对事件的描述,包括了现场实时发生的情况。例如,在我的托管服务恢复正常之前不久,就有一条消息说有柴油发电机位于大厦的外面。

  当时我就意识到了Twitter的真正强大之处在于个人以及组织之间的公开的和实时的信息交流。然而,在这一表象下面,则是一个关于用户行为的信息宝库,以及在局部和全局层面上的发展趋势。我使用了Ruby语言和Twitter gem这一Twitter的API包装器来在简单的脚本语境中探讨挖掘的实现,并说明了如何使用其他的web服务和应用来为数据的可视化构建一个简单的混搭应用程序。

  Twitter以及一些API

  尽管早期的网络涉及的是人-机器的交互,但现在的网络已涉及机器-机器之间的交互,这种交互是使用web服务来支持的。大部分受欢迎的网站都有这样的服务存在——从各种各样的Google服务到LinkedIn、Facebook和Twitter等。通过web服务创建的API,外部的应用可以查询或是操纵网站上的内容。

  web服务可以使用多种方式来实现。目前最流行的做法之一是表述性状态转移(Representational State Transfe, REST)。REST的一种实现是通过为人熟知的HTTP协议,允许HTTP作为RESTful架构的媒介存在(使用诸如GET、PUT、POST、DELETE一类的标准HTTP操作)。Twitter的API是作为这一媒介之上的一个抽象来进行开发的。在这一做法中,没有涉及REST、HTTP或是XML或JSON一类的数据格式的知识,而是代之以清晰地整合到了Ruby语言中的基于对象的接口。

  Ruby和Twitter的一个快速展示

  让我们来探讨一下如何在Ruby中使用Twitter API。首先,我们需要获取所需的资源,如果你像我一样在用Ubuntu Linux®的话,就使用apt框架。

  若要获取最新的完整的Ruby分发版本(大约13MB的下载量),使用这一命令行:

  $ sudo apt-get install ruby1.9.1-full 

  接着使用gem实用程序来抓取Twitter gem:

  $ sudo gem install twitter 

  现在你已经有了这一步骤所需的一切了,我们继续,测试一下Twitter的包装器。这一示例使用一个名为交互式的Ruby外壳(Interactive Ruby Shell,IRB)的外壳程序,该外壳程序允许实时地执行Ruby命令以及使用语言进行实验。IRB有着非常多的功能,不过我们只用它来做一些简单的实验。

  清单1展示了与IRB的一个会话,该会话被分成了三段以便于阅读。第一段(001和002行)通过导入必需的运行时元素来做好环境方面的准备(require方法加载并执行指定的库)。接下来的一段(003行)说明的是使用Twitter gem来显示从IBM® developerWorks®发出的最新tweet消息。如所展示的那样,使用Client::Timeline模块的user_timeline方法来显示一条消息,这第一个例子说明了Ruby的“链方法”的功能。user_timeline方法返回一个有着20条消息的数组,接着链入到方法first中,这样做是为了从数组中提取出第一条消息(first是Array类的一个方法),接着从这一条消息中提取出文本字段,通过puts方法把它放到输出中。

  接下来的一段(004行)使用了用户定义的位置字段,这是一个不限形式的字段,用户可以在其中提供有用的或是无用的位置信息。在这一例子中,User模块抓取了位置字段所限定的用户信息。

  最后一段(从005行开始)研究了Twitter::Search模块,这一搜索模块提供了极其丰富的用来搜索Twitter的接口。在这一例子中,首先是创建一个搜索实例(005行),接着在006行指定一个搜索,搜 LulzSec用户在最近发出的包含了why这一词的消息,结果列表已经过删减和编辑。搜索设置会一直存在在那里,因为搜索实例保持着所定义的过滤条件,你可以通过执行search.clear来清除这些过滤条件。

  清单1. 通过IRB来实验Twitter API

  $ irb  
  irb(main):001:0> require "rubygems"
  => true
  irb(main):002:0> require "twitter"
  => true
  irb(main):003:0> puts Twitter.user_timeline("developerworks").first.text  
  dW Twitter is saving #IBM over $600K per month: will #Google+ add to that?> 
  ;#Tech #webdesign #Socialmedia #webapp #app
  => nil
  irb(main):004:0> puts Twitter.user("MTimJones").location  
  Colorado, USA  
  => nil
  irb(main):005:0> search = Twitter::Search.new
  => #<Twitter::Search:0xb7437e04 @oauth_token_secret=nil, 
  @endpoint=";,   
  @user_agent="Twitter Ruby Gem 1.6.0",   
  @oauth_token=nil, @consumer_secret=nil,   
  @search_endpoint=";,   
  @query={:tude=>[], :q=>[]}, @cache=nil, @gateway=nil, @consumer_key=nil,   
  @proxy=nil, @format=:json, @adapter=:net_http<   
  irb(main):006:0> search.containing("why").to("LulzSec").  
  result_type("recent").eachdo |r| puts r.text end
  @LulzSec why not stop posting <bleep> and get a full time job! MYSQLi isn't   
  hacking you <bleep>.  
  ...  
  irb(main):007:0> 

  接下来,我们来看一下Twitter中的用户的模式,你也可以通过IRB来实现这一点,不过我重排了结果的格式,以便简化对Twitter用户的内部结构的说明。清单2给出了用户结构的输出结果,这在Ruby中是一个Hashie::Mash。这一结构很有用,因为其允许对象有类方法的哈希键访问器(公开的对象)。正如你从清单2中看到的那样,这一对象包含了丰富的信息(用户特定的以及渲染的信息),其中包括了当前的用户状态(带有地理编码信息)。一条tweet消息中也包含了大量的信息,你可以使用user_timeline类来轻松地可视化生成这一信息。

  清单2. Twitter用户的内部解析结构(Ruby视角)

  irb(main):007:0> puts Twitter.user("MTimJones")  
  <#Hashie::Mash 
  contributors_enabled=false   
  created_at="Wed Oct 08 20:40:53 +0000 2008"   
  default_profile=false default_profile_image=false   
  description="Platform Architect and author (Linux, Embedded, Networking, AI)."
  favourites_count=1   
  follow_request_sent=nil   
  followers_count=148   
  following=nil   
  friends_count=96   
  geo_enabled=true   
  id=16655901 id_str="16655901"   
  is_translator=false   
  lang="en"   
  listed_count=10   
  location="Colorado, USA"   
  name="M. Tim Jones"   
  notifications=nil   
  profile_background_color="1A1B1F"   
  profile_background_image_url="..."
  profile_background_image_url_https="..."   
  profile_background_tile=false   
  profile_image_url=";   
  profile_image_url_https="..."   
  profile_link_color="2FC2EF"   
  profile_sidebar_border_color="181A1E" profile_sidebar_fill_color="252429"   
  profile_text_color="666666"   
  profile_use_background_image=true   
  protected=false   
  screen_name="MTimJones"   
  show_all_inline_media=false   
  status=<#Hashie::Mash 
  contributors=nil coordinates=nil   
  created_at="Sat Jul 02 02:03:24 +0000 2011"   
  favorited=false   
  geo=nil   
  id=86978247602094080 id_str="86978247602094080"   
  in_reply_to_screen_name="AnonymousIRC"   
  in_reply_to_status_id=nil in_reply_to_status_id_str=nil   
  in_reply_to_user_id=225663702 in_reply_to_user_id_str="225663702"   
  place=<#Hashie::Mash 
  attributes=<#Hashie::Mash> 
  bounding_box=<#Hashie::Mash 
  coordinates=[[[-105.178387, 40.12596],   
  [-105.034397, 40.12596],   
  [-105.034397, 40.203495],   
  [-105.178387, 40.203495]]]   
  type="Polygon"
  >   
  country="United States" country_code="US"   
  full_name="Longmont, CO"   
  id="2736a5db074e8201"   
  name="Longmont" place_type="city"   
  url=";
  >   
  retweet_count=0   
  retweeted=false   
  source="web"   
  text="@AnonymousIRC@anonymouSabu@LulzSec@atopiary@Anonakomis Practical reading   
  for future reference... LULZ \"Prison 101\" ; truncated=false
  >  
  statuses_count=79   
  time_zone="Mountain Time (US & Canada)"   
  url="", "w")  
  my_file.puts "<!DOCTYPE html>  
  my_file.puts "<html>< head>  
  my_file.puts "<meta name=\"viewport\" content=\"initial-scale=1.0, user-scalable=no\"/>"
  my_file.puts "<style type=\"text/css\">"
  my_file.puts "html { height: 100% }"
  my_file.puts "body { height: 100%; margin: 0px; padding: 0px }"
  my_file.puts "#map_canvas { height: 100% }"
  my_file.puts "</style>"
  my_file.puts "< script type=\"text/javascript\""
  my_file.puts "src=\"\">"
  my_file.puts "</script>"
  my_file.puts "<script type=\"text/javascript\">"
  my_file.puts "function initialize() {"
  my_file.puts "var latlng = new google.maps.LatLng(" + lat.to_s + ", " + long.to_s + ");"
  my_file.puts "var myOptions = {"
  my_file.puts "zoom: 12,"
  my_file.puts "center: latlng,"
  my_file.puts "mapTypeId: google.maps.MapTypeId.HYBRID"
  my_file.puts "};"
  my_file.puts "var map = new google.maps.Map(document.getElementById(\"map_canvas\"),"
  my_file.puts "myOptions);"
  my_file.puts "}"
  my_file.puts "</script>"
  my_file.puts "</head>"
  my_file.puts "<body initialize()\">"
  my_file.puts "<div id=\"map_canvas\" style=\"width:100%; height:100%\"></div>"
  my_file.puts "</body>"
  my_file.puts "</html>"
  else
  puts "no geolocation data available."
  end

  清单12中的脚本执行起来很简单:

  $ ./where-am-i.rb MTimJones 

  最终得出的HTML文件可以通过浏览器来渲染,像这样:

  $ firefox test.html 

感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《使用Ruby和Twitter来进行数据挖掘(1)》技术文章,《使用Ruby和Twitter来进行数据挖掘(1)》详细使用和说明,有时《使用Ruby和Twitter来进行数据挖掘(1)》可能不完善、敬请谅解!如果《使用Ruby和Twitter来进行数据挖掘(1)》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
验证码:点击我更换图片