ツイまんだら : 形態素解析器KuromojiをProcessingで使ってみる

久しぶりにツイまんだらをしています。
ツイまんだらは、こちらのエントリーにある個人的に取り組んでいるTwitterのVisualizingです。

前回は形態素解析に取り合えずYahoo!の日本語形態素解析サービスを使ったのですが、使用回数制限があったりしてちょっと使いにくいので、ローカルで利用できるJavaライブラリのKuromojiを使ってみました。

Kuromojiの導入

Kuromojiはこちらの公式サイトからDLできます。Apacheライセンスで開発されていて、LuceneやSolrの形態素解析器として利用されていたりするようです。(自分はあまりこの辺門外漢で詳しくないですが…)
辞書が内包されていて、jarファイル1つで手軽に利用できるので便利です。

Processingで利用するには前回のエントリでメモしておいた方法で、jarをProcessingがLibraryとして処理できるところに配置、リネームします。 これで利用準備は完了です。適当な言葉で動作確認してみます。

import org.atilika.kuromoji.Token;
import org.atilika.kuromoji.Tokenizer;
import java.util.*;

Tokenizer tokenizer = Tokenizer.builder().build();
List<Token> tokens = tokenizer.tokenize("あのイーハトーヴォのすきとおった風");

for (Token token : tokens) {
    println("================================");
    println("PartOfSpeech:" + token.getPartOfSpeech());
    println("surfaceForm:" + token.getSurfaceForm());
    println("baseForm:" + token.getBaseForm());
}

以下のように出力されます。

================================  
PartOfSpeech:連体詞,*,*,*  
surfaceForm:あの  
baseForm:あの  
================================  
PartOfSpeech:名詞,一般,*,*  
surfaceForm:イーハトーヴォ  
baseForm:null  
================================  
PartOfSpeech:助詞,格助詞,一般,*  
surfaceForm:の  
baseForm:の  
================================  
PartOfSpeech:動詞,自立,*,*  
surfaceForm:すきとおっ  
baseForm:すきとおる  
================================  
PartOfSpeech:助動詞,*,*,*  
surfaceForm:た  
baseForm:た  
================================  
PartOfSpeech:名詞,一般,*,*  
surfaceForm:風  
baseForm:風  

Tweetを解析する

これを使って、Tweetを解析してみます。
TwitterとのやりとりにはTwetter4j(4.0.1)を利用しています。

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey("consumerKey");
cb.setOAuthConsumerSecret("consumerSecret");
cb.setOAuthAccessToken("accessToken");
cb.setOAuthAccessTokenSecret("accessSecret");
Twitter twitter = new TwitterFactory(cb.build()).getInstance();

Tokenizer tokenizer = Tokenizer.builder().build();
try {
    List<Status> statuses;
    String user = "tomoyukim";
    Paging p = new Paging();
    p.setCount(200);
    statuses = twitter.getUserTimeline(user, p);

    println("Showing @" + user + "'s user timeline.");
    for (Status status : statuses) {
        List<Token> tokens = tokenizer.tokenize(status.getText());
        for (Token token : tokens) {
          String[] hinshi = token.getPartOfSpeech().split(",");
          if(hinshi[0].equals("動詞") || hinshi[0].equals("名詞")){
            String word = token.getSurfaceForm();

            println("================================");
            println("PartOfSpeech:" + hinshi[0]);
            println("surfaceForm:" + token.getSurfaceForm());
          }
        }
    }
} catch (TwitterException e) {
    e.printStackTrace();
    println("Failed to get timeline: " + e.getMessage());
}

ここでは、自分の過去200件のTweetを取ってきて順次バラバラにしています。ちょっと多いので品詞を名詞と動詞に絞っています。

Kuromojiのサイトにいくと、解析のモードやユーザ辞書の追加などもできるようなので、適宜カスタマイズすると精度の調整ができそうです。 あと、Tweetはいろいろと特殊な文言やURLなども多いので、実際には解析前にある程度フィルタすると、比較的いい結果が得られます。