nkjmkzk.net

powered by Kazuki Nakajima

Chatterで訊く。世界中から答えを得る。多言語翻訳とQ&Aサイト連携で実現する世界の知恵袋

Chatterで「興味のあるフィード」とはどのようなものでしょうか?

第三者から発せられる情報は、受け取る側にとってその関心値は様々でしょう。
ただし、自身が「質問」したことに対する「回答」には誰しも高い関心を持つことは必然だと思います。

Chatterを導入している組織では、全社に対して、あるいは特定のグループに対して質問をおこない、意見を募るような使い方は極めてポピュラーだと言えるでしょう。通常こういったコミュニケーションは社内に閉じておこなわれることになります。社内だけで十分な回答を得られるケースもありますが、残念ながらレスポンスが得られないケースもあるでしょう。

そんなときに、該当する知見を社内外問わず収集することができれば、よりレスポンスを得られる可能性が高まります。

例えば、オープンなテクノロジーであるjQueryに関して使用方法を誰かに質問したいとします。組織によっては社内にエキスパートがいるかもしれませんが、オープンなソフトウェアなので社外のパブリックサイトに豊富な情報は蓄積されているであろうことは想像に難くありません。さらにjQueryは海外の開発者が立ち上げたソフトウェアなので日本ではなく、海外サイトの方が多くの情報を見つけることができるはずです。

日本人技術者の多くはある程度英語の読み書きは可能でしょう。しかし、英語サイトを積極的にブラウズしたい人は多くないのではないでしょうか。結果的に、英語サイトの情報を定常的に検索対象に入れる技術者は限られていると思います。

そこで、日本語でChatterに質問すれば社内外、国内外のエキスパートから回答が得られる。そんな仕組みが実現できれば、それは次世代のQ&Aシステムを構築できる、そんな可能性を感じませんか。

その仕組みに近しいデモアプリを作ってみました。ITの技術的な質問をChatterに日本語で投稿すると、類似するQ&Aを海外のQ&Aサイトから収集してくるというものです。

使い方は、まずChatterの標準画面で質問文を日本語で投稿します。そして、文末に「=>stackoverflow」と追加します。

そのままChatterに投稿されます。

ほどなくして画面をリロードすると、コメントに類似Q&Aが返信されてきます。

アーキテクチャーは下図のようになります。

質問文を翻訳する部分にGoogle Translate APIを使用し、海外のIT関連Q&AサイトとしてStackOverflowを使用しています。また、Heroku上に中間サーバとなるアプリを稼働させています。これは、Chatterフィードの書き込みからトリガーでHTTPコールアウトを発行する場合、非同期しか選択肢がないためです。非同期のコールアウトでは、コール先からレスポンスを取得することができません。したがって一旦Heroku上の中間サーバに処理を委任するという形をとっています。

それぞれの処理内容をみていきましょう。

  1. 標準のChatter画面で質問を日本語で投稿します。文末には「=>stackoverflow」と追加します。
  2. トリガーが起動し、フィードの本文中に=>stackoverflowの文字列を検出するとHeroku上で稼働している中間サーバに類似質問取得リクエストを非同期で送信します。
  3. リクエストを受け取った中間サーバはまずGoogle Translate APIを利用して質問文を英語に翻訳します。これは類似質問を検索するStackOverflowが英語サイトであるためです。
  4. 英語翻訳された質問文をStackOverflowの類似質問検索APIに送信し、類似質問を取得します。
  5. StackOverflowから返された類似質問を元のChatterフィードのコメントとして投稿します。

このデモアプリを「すごいQA for Chatter」としてパッケージングしてAppExchangeにアップロードしておきました。

https://login.salesforce.com/packaging/installPackage.apexp?p0=04tE0000000DKiB

このパッケージを既存のSalesforce組織にインストールすれば、その組織のChatterで上記のQ&Aをおこなうことができます。

*このパッケージはデモ用途専用です。各サーバ間の通信にはHTTPが用いられています。ご注意ください。

この仕組みは既存の類似Q&Aを取得するというものにとどまっています。これを一歩進めて、実際に英語翻訳したQ(質問)をStackOverflowに投稿し、A(回答) が投稿されればそれを検出して日本語翻訳し、Chatterコメントにフィードバックするような仕組みも十分可能でしょう。

現在、StackOverflow(厳密にはStackExchange API)で提供されているAPIは読み込み専用となっており、書き込み(質問投稿)のAPIは残念ながら用意されていません。これが提供されれば上記仕組みはすぐに実現可能でしょう。あるいはYahoo Answers等、書き込みAPIが用意されているサービスを検討するというのも一つの手だと思います。

このようなアイデアを発展させることで、あるサイトに登録されたユーザー、という枠にとらわれず、Socialなつながりで有機的な連鎖をおこすような次世代のQ&Aサイトが出来上がることを妄想している次第です。

最後にそれぞれの処理でキーとなるコードをAPIコールをメインにご紹介しておきます。

Chatterフィード書き込み時に発火し、必要に応じてQ&A処理を起動するトリガー

trigger feedItem_to_stackoverflow on FeedItem (after insert) {
    for (feedItem fi : Trigger.new) {
        if (fi.body.contains('=>stackoverflow')){
            string instanceUrl = URL.getSalesforceBaseUrl().toExternalForm();
            string sid = UserInfo.getSessionId();
            string fi_json = System.JSON.serialize(fi);
            chatter_stackoverflow.request_similar(sid, instanceUrl, fi_json);
        }
    }
}

Herokuの中間サーバに類似QA取得リクエストを送信するApexクラス

public with sharing class chatter_stackoverflow {
    @future(callout=true)
    public static void request_similar(string sid, string instanceUrl, string object_json){
        Http http_protocol = new Http();
        HttpRequest http_request = new HttpRequest();
        
        // Set the endpoint URL.
        instanceUrl = EncodingUtil.urlEncode(instanceUrl, 'UTF-8');
        sid = EncodingUtil.urlEncode(sid, 'UTF-8');
        String endpoint = 'http://dev.nkjmkzk.net/chatter/api.php?service=stackoverflow&sid=' + sid + '&instanceUrl=' + instanceUrl;
        http_request.setEndPoint(endpoint);
       
        // Set the HTTP verb to GET.
        http_request.setMethod('POST');
        
        // Set body
        http_request.setBody(object_json);
        
        // set callout timeout to 60sec(max)
        http_request.setTimeout(60000);
       
        // Send the HTTP request and get the response.
        // The response is in JSON format.
        if (!Test.isRunningTest()){
        	http_protocol.send(http_request);
        }
    }
}

Heroku(php)の中間サーバからGoogle Translate APIを呼び出して英語翻訳を取得するREST APIのURL

https://www.googleapis.com/language/translate/v2?format=text&key=あなたのAPI KEY&q=英語翻訳する質問文&target=en

Heroku(php)の中間サーバからStackExchange APIを呼び出して類似QAを取得するREST APIのURL

http://api.stackexchange.com/2.0/similar?order=desc&sort=relevance&title=英語翻訳した質問文&site=stackoverflow

Heroku(php)の中間サーバからChatter REST APIを呼び出して類似QAをコメントにフィードバックするREST APIのURL

https://インスタンス.salesforce.com/services/data/v25.0/chatter/feed-items/親フィードのID/comments?text=類似QAのタイトル

without comments

Written by 中嶋 一樹

6月 29th, 2012 at 2:44 pm

Posted in Uncategorized

Tagged with ,

Leave a Reply