2012年03月13日

ruby+twitter+MeCab+google geocodingでなんかやってみよう

趣味でtwitterのリストからタイムラインを取ってきて、形態素解析して、場所を表す単語を取ってきて、それの緯度経度を表示するものをrubyで作りました。

例えば @tomo3141592653の僕(平田朋義)が
「東京駅に着きました」と発言したら、それを拾ってきて次のように出力します。

「東京 駅:
{"lat"=>35.689506, "lng"=>139.691701}
平田朋義@tomo3141592653
東京駅に着きました。」

解説はソースコード内のコメントで。


# -*- encoding: utf-8 -*-

require "MeCab"
require "twitter"
require "open-uri"
require "uri"

list =Twitter.list_timeline("tomo3141592653", "Suidobashi",:per_page=>300)
#@tomo3141592653が作ったSuidobashiリスト(うちのシェアハウスの住民リスト)のタイムラインを300件取ってくる。

c = MeCab::Tagger.new()

list.each do |li|
txt = li.text #例:東京駅に着きました。
word = c.parseToNode(txt) #形態素解析する。

# 形態素ごとループ
while word do
type = word.feature.split(",") # 品詞


if type[1].toutf8 == "固有名詞" and type[2].toutf8 == "地域" # 地域を表す単語のみ取ってくる。

location = word.surface #例:東京
next_word = word.next.surface #例:駅

json = open("http://maps.googleapis.com/maps/api/geocode/json?address=#{URI.escape(location)}&sensor=false")

#google geocodingにアクセスし geocoding結果を取ってくる。
#例:"http://maps.googleapis.com/maps/api/geocode/json?address=東京&sensor=false"

json = YAML.load(json.read) #jsonのパース

sleep(0.1)

#国名なら無視。
if json ==nil || json["status"] != "OK" || json["results"][0]["types"].index("country")
word = word.next
next
end

puts location + " "+next_word + ":" #例:東京 駅:
p json["results"][0]["geometry"]["location"] #例:{"lat"=>35.689506, "lng"=>139.691701}
puts li.user.name + "@"+ li.user.screen_name #例:平田朋義@tomo3141592653

puts txt #例:東京駅に着きました

puts ""

end

word = word.next # 次の形態素に移動
end

end #次のツイートに移動




実行結果、抜粋。

本町 駅:
{"lat"=>34.681936, "lng"=>135.498982}
やしまこ!@yashimako_
I'm at 岩本町駅 (S08) (千代田区, 東京都) http://t.co/aAPJCt3L


厚 焼き:
{"lat"=>35.3044432, "lng"=>135.1069231}
pooɟɐǝs@hnnhn
パーティによさそう / “【ハウツー】炊飯器でつくる「厚焼きホットケーキ」 | ライフ | マイナビニュース” http://t.co/FoVHoMHi

秋葉原 事件:
{"lat"=>35.698683, "lng"=>139.774219}
吉田俊文@tsfmysd
今週の長岡ルーマン2006の固有値をもっとも読んだ人は俺に違いない。コミュニケーション一元論が、とりわけ昨今のグローバル化による格差現象や、資本要素価格均等
化(≒利潤率均等化)現象、GM、サププライm、秋葉原事件を鑑みたときその説明力に疑念がありうるのはここにあるのじゃないか?

博多 つい:
{"lat"=>33.59135759999999, "lng"=>130.4148783}
吉田俊文@tsfmysd
土曜の夕方に深夜バス乗れば、朝目覚めて最終授業出席できるな…… 14の夜に博多ついて、15にお見舞いと赤ちゃんに会いにいって、16にばあちゃんちと犬の散歩して、17に家族と博多で飯くって、18時に博多駅にもどると。完璧かもしれない。

飯田橋 合同庁舎:
{"lat"=>35.702065, "lng"=>139.745015}
やしまこ!@yashimako_
窓口の人が前回と同じだとやりやすい (@ ハローワーク飯田橋 合同庁舎) http://t.co/a1P8hFo4

感想:
foursquare経由などの発言はほぼ確実に抽出できる。

精度を上げるにはNG単語リストを作ったほうが良さそう。
例:焼き、事件、都民、人
など



posted by hougi at 12:27| Comment(17) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。