ブログの記事本文からはてなダイアリーキーワードを抽出する

zuzara - ブログの記事本文を抽出するAPI:TSUBUAN と,はてなダイアリーキーワード自動リンクAPIマッシュアップしてみた.

イカなコード.記事はコレをつっこんでみた.

require 'xmlrpc/client'
require 'net/http'
require 'kconv'

Net::HTTP.version_1_2

text = ""

# ブログ記事本文を TSUBUAN API で抽出
host = 'zuzara.dyndns.org'
url  = 'http://d.hatena.ne.jp/ooolong/20070420/1177083969'
path = '/api/tsubuan?url=' + url

Net::HTTP.start(host, 80) { |http|
  @res = http.get(path).body
}
text = @res


#はてなダイアリーキーワード抽出
params = {'body' => text,
          'mode' => 'lite',
	  'score' => 20}

@URI = "http://d.hatena.ne.jp/xmlrpc"

client = XMLRPC::Client.new2(@URI)
res = client.proxy("hatena").setKeywordLink(params)

items = []
res['wordlist'].each { |item|
  items.push({
    :cname => item['cname'],
    :score => item['score'],
    :refcount => item['refcount'],
    :word => item['word'].tosjis})
}

items.each { |item|
  puts "#{item[:score]} : #{item[:refcount]} : " + item[:cname] + " : " + item[:word] 
}

結果はこんな感じ.

100 : 3 : book : 「へんな会社」のつくり方
64 : 317 : hatena : はてなダイアリー
60 : 215 : web : トラックバック
88 : 4 : hatena : 株式会社はてな
100 : 0 :  : スレッショルド
42 : 360 : elec : プログラミング
60 : 215 :  : トラックバック
78 : 97 : web : アフィリエイト
70 : 21 : movie : トラフィック
70 : 21 : web : トラフィック
70 : 21 : music : トラフィック
57 : 48 : web : Webサービス
100 : 20 : web : RSSリーダ
70 : 11 : web : Permalink
50 : 25 : hatena : 近藤さん
28 : 116 :  : トレンド
50 : 25 :  : 近藤さん
30 : 172 : web : ブロガー
44 : 29 :  : 疑心暗鬼
21 : 249 :  : セミナー
75 : 1 : hatena : 伊藤直也
27 : 4700 : web : ブログ
71 : 117 : web : Web2.0
72 : 116 : hatena : はてブ
50 : 871 : hatena : はてな
56 : 52 : idol : NANA
30 : 76 : book : 投影
56 : 52 : comic : NANA
56 : 52 : music : NANA
34 : 347 :  : 哲学
62 : 12 :  : MBA
42 : 3 :  : CTO
26 : 14 :  : RR
26 : 47 : elec : TB
26 : 14 : music : RR
45 : 19 :  : IQ
26 : 47 : web : TB
26 : 14 : game : RR

特定のブログエントリ(URL)から,はてなキーワードを抽出できた.

はてブAPIで遊んでみる

はてなブックマークAPIを使ってRubyのお勉強.

はてなブックマーク件数取得API

このAPIは,XML-RPC プロトコルなので,Ruby 1.8の標準ライブラリ XMLRPC4R を使用する.実際には,XMLRPC::Client クラス.

URLで取得する場合.
require 'xmlrpc/client'

urls = ["http://d.hatena.ne.jp/",
        "http://b.hatena.ne.jp/",
        "http://d.hatena.ne.jp/ooolong/20070420/1177083969"]

@URI = "http://b.hatena.ne.jp/xmlrpc"

client = XMLRPC::Client.new2(@URI)
res = client.proxy("bookmark").getCount(*urls)

res.each do |url, count|
  puts "#{count} : \t #{url}"
end

実行結果はこんな感じ.

123 :      http://d.hatena.ne.jp/
231 :      http://d.hatena.ne.jp/ooolong/20070420/1177083969
949 :      http://b.hatena.ne.jp/
Site毎に取得する場合.
require 'xmlrpc/client'

site = "http://d.hatena.ne.jp/ooolong/"
@URI = "http://b.hatena.ne.jp/xmlrpc"

client = XMLRPC::Client.new2(@URI)
res = client.proxy("bookmark").getTotalCount(site)

p res

はてなブックマークエントリー情報取得API

このAPIは,任意のURLをGETリクエストすると,結果をJSON形式で返してくれる.ので,まず JSON Library for ruby をインストール.

JSON Library for ruby のインストール
>gem install json

Ruby標準ライブラリ net/http を使用する.

require 'json'
require 'net/http'
require 'kconv'

Net::HTTP.version_1_2

host = 'b.hatena.ne.jp'
url  = 'http://d.hatena.ne.jp/ooolong/20070420/1177083969'
path = '/entry/json/' + url

# startでHTTPセッションを開始し,GETリクエストを送信
Net::HTTP.start(host, 80) { |http|
  @res = http.get(path).body
}

# ()抜きしてからパースしないと,JSONに怒られる
json = JSON.parse(@res.sub!(%r!^\((.*)\)$!) { $1 })

# コメントのみ配列に詰める
comments = []
json['bookmarks'].each { |item|
  if item['comment'] != ''
    comments.push({
      :date => item['timestamp'][0..9],
      :user => item['user'],
      :cmnt => item['comment'].tosjis})
  end
}

puts json['title'].tosjis
puts json['count']
puts json['screenshot']
comments.each { |item|
    puts item[:date] + " : " + item[:user] + " : " + item[:cmnt]
}

実行結果はこんな感じ.

脱・下流エンジニア (仮) - はてなと考えるにっぽんのWeb2.0
231
http://screenshot.hatena.ne.jp/images/120x90/1/4/b/a/1/294de4ef526cd0618f9320e23059562820e.jpg
2007/04/23 : libkazz : web開発者の心得っぽいこと,
2007/04/23 : ag-commerce : WD Live!(Web Designing主催セミナー)「株式会社はてなと考えるにっぽんのWeb2.0.そのサービスとサイト運営 伊藤直也氏 × 須賀正明氏」に参加してきた.
2007/04/23 : ro-man : はてなの提灯持ちなんて、はてなじゃない
2007/04/23 : gbs01 : 脱・下流エンジニア (仮) - はてなと考えるにっぽんのWeb2.0
2007/04/23 : hiro_y : 「サービスとかアイデアのコアになる哲学がぶれなければよい」
2007/04/22 : uzuki-first : >意外だったのは,どんな新しいWebサービスがあるのかって特に日々チェックしたりしないらしい. ここに哲学がある。
2007/04/22 : takayukii : 参考になる。伊藤直也の話。
2007/04/22 : kusigahama : あー
2007/04/22 : sasada : とても素晴らしい講演。あとは、ちゃんと実行してね(はぁと ooolongさん、レポートありがとうございました。
2007/04/22 : osisi :  <開発者が作る・少人数で作る・短い時間でつくる>
2007/04/22 : rsyudou : 継続しないサービスは流行らないの法則。知らなかった。
2007/04/22 : rytich : とにかく早く作ってリリース運営しながらいじる
2007/04/22 : tsupo : むしろあまり見ないようにしている / 長い間妄想していると,だんだん自分のアイデアに対して疑心暗鬼になったりしてくる
2007/04/22 : masui : 伊藤氏の講演記録。経験と合致する。こまめに手を入れてないと何故かユーザが離れる。
2007/04/22 : serimaryo : 自戒の意味もこめてブクマ
2007/04/21 : denken : 
2007/04/21 : onk : 「1人で作る」
2007/04/21 : ezookojo :  「いっぱいトラフィックが来たら…」 → まず来ない
2007/04/21 : samurai20000 : マネジメントもやってる。サービスの開発は基本一人
2007/04/21 : ysano2005 : 「コードを書けない人から命令されても人は動かないとも…,これ激しく同感.」
2007/04/21 : p4life :  はてなフィロソフィ
2007/04/21 : naoya :  感想ありがとうございます。

はてなダイアリーキーワード自動リンクAPI

はてなダイアリーキーワード自動リンクAPI

テキストファイルを読み込んで,はてなキーワードを抽出するスクリプトを書いてみた.テキストファイルに使用したのは,このエントリ

require 'xmlrpc/client'
require 'kconv'

text = ""

File::open(ARGV[0]) {|f|
  f.each {|line|
    text << line
  }
}

params = {'body' => text,
               'mode' => 'lite',    # これ一応,非公開らしい
               'score' => 20}

@URI = "http://d.hatena.ne.jp/xmlrpc"

client = XMLRPC::Client.new2(@URI)
res = client.proxy("hatena").setKeywordLink(params)

items = []
res['wordlist'].each { |item|
  items.push({
    :cname => item['cname'],
    :score => item['score'],
    :refcount => item['refcount'],
    :word => item['word'].tosjis})
}

items.each { |item|
  puts "#{item[:score]} : #{item[:refcount]} : " + item[:cname] + " : " + item[:word]
}

結果はこんな感じ.(score : refcount : カテゴリ : キーワード)

60 : 215 : web : トラックバック
60 : 215 :  : トラックバック
100 : 46 :  : Silverlight
28 : 396 :  : エントリー
70 : 11 : web : Permalink
37 : 90 : book : アルファ
39 : 94 : web : リンク集
29 : 54 : web : Internet
37 : 90 : music : アルファ
37 : 90 :  : アルファ
50 : 24 : elec : Apollo
41 : 79 :  : script
33 : 54 : elec : アドビ
71 : 119 : web : Web2.0
41 : 79 : music : SCRIPT
100 : 6 : elec : Flex2
25 : 1 :  : どうR
72 : 99 : elec : Adobe
75 : 419 : geography : Java
75 : 23 : elec : CNET
23 : 723 : elec : 仕様
75 : 419 : elec : Java
26 : 10 : science : RIA
26 : 10 : web : RIA
35 : 223 : elec : MS
35 : 223 : anime : MS
35 : 223 : game : MS
35 : 223 :  : MS

任意のブログのフィードから,キーワード抽出するとそのブログの性格に特化したなんかができそう.「はてな」以外の形態素解析も調べてみようかな.