読者です 読者をやめる 読者になる 読者になる

web系な備忘録

私が忘れてもブログがあるもの

はてなキーワードAPIを使って特徴語抽出

 ツイートを形態素解析してカテゴリ分類したい! ということで、簡易的に特徴語のカテゴリを得る方法を考えます。
トピックモデルとかそれらしいアルゴリズムを使うのが本筋かもしれませんが、もっと単純に「芸能ジャンルの単語が多いから芸能ジャンルのツイート」みたいなのでいいんですよね。量も多くないし(1時間最大100ツイート)。
ということで、はてなキーワード自動リンクAPIを使って、文章中のワードのカテゴリを調べていきます。

はてなキーワード自動リンクAPIとは

 はてなの記事って、それっぽい語句に勝手にリンクが張られてますよね。はてなキーワード自動リンクAPIは、文章を与えると、そのようなリンクを自動で生成してくれるAPIです。
詳細:はてなキーワードAPI - Hatena Developer Center

 いわゆるリンクを生成するだけでなく、リンクを張るべき単語をxml形式で返してくることもできます。今回はこちらを使います。
はてなキーワードAPIはカテゴリを返してくれないので今回は使えません)

目標

 ツイート中に含まれる名詞とそのカテゴリを得る

コード(Java

 XML-RPC APIという、ブログサービスによくあるAPIに対応しているということで、XML-RPCのライブラリを使います。ws-xmlrpc - Apache XML-RPCからダウンロードして解凍、lib以下のjarファイルをライブラリに追加します。私の場合は以下を追加。
commons-logging-1.1.jar
ws-commons-util-1.0.2.jar
xmlrpc-client-3.1.3.jar
xmlrpc-common-3.1.3.jar
xmlrpc-server-3.1.3.jar

コード参考:XML-RPC してみる - bluepapa32’s Java Blog

String text = "解析したい文章";

// URL設定
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL("http://d.hatena.ne.jp/xmlrpc"));

// XmlRpcClient生成
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);

// パラメータ設定
Map<Object, Object> params = new HashMap<Object, Object>();
params.put("body", text);     // 解析したい文章
params.put("mode", "lite");     // 省略するとリンクタグ付きの文章が返ってくるモードに
params.put("score", 10);     // キーワードのスコア(詳細不明。閾値を設定しておくとどうでもいい語が返ってくることがなくなる気がする)

HashMap<Object, Object> result = (HashMap)client.execute("hatena.setKeywordLink", new Object[]{params});

Object[] wordlist = (Object[]) result.get("wordlist");
for(Object word:wordlist){
     System.out.println(word);
}

textに

を入れると、以下のような出力結果になります。

{refcount=7, score=61, word=はてなキーワード, cname=hatena}
{refcount=79, score=69, word=プリキュア, cname=anime}
{refcount=78, score=69, word=プリキュア, cname=science}
{refcount=36, score=22, word=サイエンス, cname=science}
{refcount=1062, score=24, word=アニメ, cname=anime}
{refcount=2, score=28, word=bit.ly, cname=web}

 できた!ヽ(゚∀゚)ノ

 あとは適当に計算式を立ててカテゴリを決めれば超簡易カテゴリ分類になるでしょう。
 ちなみに、はてなキーワードのカテゴリははてなキーワード - 話題の言葉がわかる、みんなで編集するキーワードの下部にある20種類です。

 wikiのデータを使ったカテゴリ分類も試したのでまたそのうち。