Hatena::Grouphatenadeveloper

人力検索はてなおとなり質問API

ja/question/apis/neighbor

人力検索はてなおとなり質問API

本ドキュメントに関する注意事項

本ドキュメントは、人力検索はてなにおける『人力検索はてなおとなり質問API』の実装を解説するためのものです。

API仕様の解説

質問本文を送信すると、キーワード抽出の後人力検索はてなの質問データベースを検索し、似た質問を返信する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>

サンプルプログラム

外部アプリケーションにおいて、文章から似た質問を検索するサンプルスクリプトは以下のようになります。

Perl 版

#!/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;

Ruby 版

文字コードは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

変更履歴

  • 2006年 3月23日 ドキュメント公開
  • 2006年 3月13日 リリース