ブログの記事本文からはてなダイアリーキーワードを抽出する
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
任意のブログのフィードから,キーワード抽出するとそのブログの性格に特化したなんかができそう.「はてな」以外の形態素解析も調べてみようかな.