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

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

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

Kuromojiの導入

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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());
}

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
================================
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)を利用しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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なども多いので、実際には解析前にある程度フィルタすると、比較的いい結果が得られます。

Built with Hugo
テーマ StackJimmy によって設計されています。