久しぶりにツイまんだらをしています。
ツイまんだらは、こちらのエントリーにある個人的に取り組んでいる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なども多いので、実際には解析前にある程度フィルタすると、比較的いい結果が得られます。