ツイまんだら : 形態素解析器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なども多いので、実際には解析前にある程度フィルタすると、比較的いい結果が得られます。