ツイートに含まれるハッシュタグや URL の情報を取得する方法 (日本語ハッシュタグへの対応などの仕様変更に自動で対応できるように)

先日、twitter が日本語のハッシュタグに対応 して、何かと便利になったような気がします。 ただ、残念ながら twitter クライアントや twitter 関係の web サービスではまだ日本語のハッシュタグに対応できていないところもあるようです。 例えば とぅぎゃったー とかもそうですね。 (PHP あるあるのとぅぎゃったーまとめ を見ていて日本語ハッシュタグへの非対応に気づきました。)

Entities 情報を利用してハッシュタグや URL 情報を取得する

さて、日本語ハッシュタグに対応できていないのは、それぞれのサービスが独自にツイート内容からハッシュタグを抽出するようにしているからだと思います。 日本語ハッシュタグも抽出できるようにそれぞれのサービスがハッシュタグ抽出の方法を変更すれば今回は対応できますが、twitter の仕様が変更されればまたそのつど対応していかなければいけません。

そのような方法をとるのではなく、twitter が提供している twitter entities (詳しくは後述) の情報を利用して、ツイート内容に含まれるハッシュタグや URL の情報を取得しましょう! というのがこの記事の内容です。

Tweet Entities って?

ツイートの内容には、URL やハッシュタグ、メディア (画像などの URL?) などの情報が含まれている場合があります。 それらを自前の方法で解析する代わりに、twitter 側で解析した情報を利用できれば便利ですよね。 Twitter 側で解析した情報を提供するためのものが tweet entities です。 詳細は下記ページ。

Tweet entities の情報を使うと自前の解析を行う必要がなくなるので、ハッシュタグや URL に関する twitter 側の仕様が変更されても何も対応せずに済むようになります。

使い方は?

Tweet entities が提供される場合、されない場合は以下です。

  • REST API では、include_entities パラメータを true にしてリクエストした場合に提供される
  • Streaming API では、常に自動的に提供される
  • Search API では提供されない

Search API では使えませんが、Streaming APIREST API では使えます。 REST API の場合は、上に書いてあるように、リクエスト時に include_entities パラメータを true にしなければいけません。

詳しいデータ構造などは公式ページを見てください。

使用例

Ruby での使用例を書いておきます。 id = 93119620260704256 のツイートに含まれるハッシュタグの情報を取得する例です。

# ruby 1.9.2 を使用
# サンプルコードのため手抜き多々; 実際に使う場合は例外処理などすること

require 'net/http'
require 'uri'
require 'json'

# ツイートの情報を取得するための URL 
# (tweet entities を取得するために include_entities パラメータを true に)
url_str = 'http://api.twitter.com/1/statuses/show/93119620260704256.json?include_entities=true'

# JSON 文字列を取得し, パースする
res = Net::HTTP.get_response( URI.parse( url_str ) )
json = JSON.parse res.body

# ツイートの内容を表示
puts json['text']

# ハッシュタグを表示
json['entities']['hashtags'].each do |hashtag|
  puts '-- hashtag --'
  # 2 つの要素から成る配列. ハッシュタグの開始文字の直前の index と終了位置の直後の index を示す
  # ('#' も含む)
  puts "indices: #{hashtag['indices']}"
  # ハッシュタグのテキスト ('#' は含まれない)
  puts "text: #{hashtag['text']}"
  # ツイート内容からハッシュタグを抜き出す
  s = hashtag['indices'][0] # ハッシュタグの開始文字の直前の index
  e = hashtag['indices'][1] # ハッシュタグの終了文字の直後の index
  puts json['text'][ s...e ]
end

このプログラムを実行すると、以下のように表示されるはずです。

ブログ更新「#なでしこジャパン」 http://t.co/gU9KQiG サッカー女子ワールドカップ決勝戦にお いて秒間ツイート数(TPS)の最高記録を更新!
-- hashtag --
indices: [6, 15]
text: なでしこジャパン
#なでしこジャパン

まとめ

というわけで tweet entities を使いましょう!