2012年4月14日土曜日

【Java】WikipediaシソーラスAPIを使う【wikipedia】

Wikipediaシソーラスを使う。

企画しているAndroid道で作る練習アプリのネタで、Wikipediaシソーラスを使おうかなって考えました。

と言うのも、なんか
  • AndroidやJavaの基本機能の練習はやりたい
  • でも、作って面白いものにしたい
  • 誰かに自慢できる感じのもの
  • ちょっと、斜め上を目指した感じ

のアプリを作ろうとおもったから。ランダムにWikipediaの項目を表示するアプリはあるけれど、シソーラス検索するアプリは無ってことで、オリジナリティもあるし。

早速、SIGWPからWikipediaAPIのソースをDLしてきました。

実は、WikipediaAPIへのチャレンジは2回目。卒研の時も、このライブラリを使おうと思ったけど、なぜか上手く行かず。

仕方なく、WEBにで提供されている検索結果のHTMLを解析する荒業に出ました。

まあ、理由は色々とあるのですが、そもそも公式でリファレンスを配布していないことも原因の一つかと。

Apache/Axisくらい使えるよね? って感じでしょうか。いや、いいんですけど。

公式サイトに設定されているコードの例もどうやら古いバージョンのものらしく、掲載されているクラスもメソッドも無い。

どうにか、ソースを読んで使えるようになりました。シソーラス単語と関連度を取得するコードが以下。

public class Main {
 // private static final String TAG = Main.class.getSimpleName();

 /**
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  ServiceStub serviceStub = new ServiceStub();

  GetTopCandidateIDFromKeyword keyword = new GetTopCandidateIDFromKeyword();
  keyword.setKeyword("サクラ大戦");
  keyword.setLanguage("Japanese");

  GetTopCandidateIDFromKeywordResponse response = serviceStub
    .getTopCandidateIDFromKeyword(keyword);

  GetThesaurusDS getThesaurusDS = new GetThesaurusDS();
  getThesaurusDS.setLanguage("Japanese");
  getThesaurusDS.setIFrom(response
    .getGetTopCandidateIDFromKeywordResult());

  GetThesaurusDSResponse resp = serviceStub
    .getThesaurusDS(getThesaurusDS);
  GetThesaurusDSResult_type0 result = resp.getGetThesaurusDSResult();
  OMElement element = result.getExtraElement();
  XMLStreamReader reader = element.getXMLStreamReader();
  try {
   while (reader.hasNext()) {
    reader.next();
    if (reader.isStartElement()) {
     String tagName = reader.getName().toString();
     if (tagName.equals("l_weight") || tagName.equals("name")) {
      reader.next();
      System.out.println(reader.getText());
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
   System.out.println("error");
  } finally {
   try {
    reader.close();
   } catch (Exception e) {

   }
  }
  System.out.println("end");
 }


XMLの解析でちょっと手こずったりしましたが、何とかうまくいきました。

得られるデータは、関連度順でソートされているようです。ですが、今回は関連度は利用するつもりは無いのでこの順番を維持したまま返してやる仕組みを作ればいいかなと。

しかし、与えられているメソッドの名前はどうにかなりませんかね・・・。getGethogehogeとか、もうね。

0 件のコメント:

コメントを投稿