質問本文を送信すると、キーワード抽出の後人力検索はてなの質問データベースを検索し、似た質問を返信するAPIです。
APIはXML-RPC APIを用いて実装を行っており、メソッド名および指定可能な各属性は、以下の通りです。
- uri
- http://q.hatena.ne.jp/xmlrpc
- encoding
- utf8
- methodName
- question.getSimilarQuestion
- parameters
- 以下を参照
- content(string): 検索する質問本文を指定します。
- threshold(int): キーワード重複のしきい値を指定します。省略可能でデフォルトは2です。
- limit(int): 出力する質問の最大数を指定します。省略可能でデフォルトは5です。
<?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>question.getSimilarQuestion</methodName> <params> <param> <value> <struct> <member> <name>content</name> <value><string>代官山付近でおいしいランチを食べられるお店を教えてください。</string></value> </member> </struct> </value> </param> </params> </methodCall>
<?xml version="1.0" encoding="utf-8"?> <methodResponse> <params> <param> <value> <array> <data> <value> <struct> <member> <name>qid</name> <value><int>1108690883</int></value> </member> <member> <name>content</name> <value><string>渋谷、代官山、恵比寿近辺のランチで あなたの超お気に入りのお店を教えて下さい。ただし、もちろんたくさん行ったことのあるお店をお願いします。</string></value> </member> <member> <name>uri</name> <value><string>http://q.hatena.ne.jp/1108690883</string></value> </member> </struct> </value> <value> <struct> <member> <name>qid</name> <value><int>1063560945</int></value> </member> <member> <name>content</name> <value><string>以前王様のブランチで古着屋のローズ???という店が代官山?に出店すると聞いた記憶があるのですが、いつ出来るのでしょうか?できれば正確な場所もお願いします。</string></value> </member> <member> <name>uri</name> <value><string>http://q.hatena.ne.jp/1063560945</string></value> </member> </struct> </value> </data> </array> </value> </param> </params> </methodResponse>
外部アプリケーションにおいて、文章から似た質問を検索するサンプルスクリプトは以下のようになります。
#!/usr/bin/perl use strict; use warnings; use XMLRPC::Lite; use utf8; binmode STDOUT, ':utf8'; my $content = '代官山付近でおいしいランチを食べられるお店を教えてください。'; my $res = XMLRPC::Lite ->new ->proxy('http://q.hatena.ne.jp/xmlrpc') ->call( 'question.getSimilarQuestion', { content => XMLRPC::Data->type( 'string', $content ), threshold => 2, limit => 5, }); if ( my $fault = $res->fault ) { warn "$_ => $fault->{$_}" for ( keys %$fault ); } else { for ( @{$res->result} ) { printf "%9s : %s\n", 'qid', $_->{qid}; printf "%9s : %s\n", 'uri', $_->{uri}; printf "%9s : %s\n", 'content', $_->{content}; print "----\n"; } } exit;
文字コードはutf8で保存して実行する必要があります。
#!/usr/bin/env ruby require 'uri' require 'xmlrpc/client' module Hatena module Question class SimilarSearch SERVICE_URI = 'http://q.hatena.ne.jp/xmlrpc' def initialize uri = URI SERVICE_URI @server = XMLRPC::Client.new uri.host, uri.request_uri end def search(content, options = {}) options = { :content => content, :threshold => 2, :limit => 5 }.update options @server.call 'question.getSimilarQuestion', options end end end end if $0 == __FILE__ $KCODE = "u" require 'pp' similar = Hatena::Question::SimilarSearch.new similar.search('代官山付近でおいしいランチを食べられるお店を教えてください。', :limit => 3 ).each do |result| pp result end end