LoginSignup
36
37

More than 5 years have passed since last update.

neologd使って形態素解析したい。できれば依存関係とかは丸投げで。

Last updated at Posted at 2015-08-14

neologdって?

https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
要するに新語に対応しているipa辞書の拡張版

これをjavaで利用しようと思うと

  1. ビルドする環境構築
  2. 頑張ってmecab-ipadic-neologdをビルド
  3. java側からネイティブのmecabをバインディングしたりして呼び出し

みたいなことをしないといけない・・・
しかもネイティブビルドしたmecabを利用するので環境への依存関係が高く
さくっとサーバーにデプロイして利用みたいなことは難しい・・・

んじゃneologdの辞書だけpure javaのkuromojiで使えないかなと思って調べた。
http://d.hatena.ne.jp/Kazuhira/20150316/1426520209
あーめんどそう・・・

つーわけでさらに検索した結果

http://mocobeta-backup.tumblr.com/post/114318023832/neologd-kuromoji-lucene-4-10-4-branch
おー作って公開してくれてる。
でも自分でビルドするのか・・・
と思って下まで読んだら

Elasticsearch ユーザー向けには、以下でプラグインを公開してくださっているので、こちらをどうぞ。
https://github.com/codelibs/elasticsearch-analysis-kuromoji-neologd

やりたいことは形態素解析だけなんでluceneでもelasticsearchでもどっちでもいいのでこれを利用してみよう

依存関係処理

ここがめんどいのでいろいろ調べたわけです。
さくっとmavenつかってpom.xmlに以下を追加するだけ :thumbsup:

pom.xml
<dependency>
    <groupId>org.codelibs</groupId>
    <artifactId>elasticsearch-analysis-kuromoji-neologd</artifactId>
    <version>1.6.0</version>
</dependency>

超簡単、調べてよかった・・・

以下テストコード
KuromojiTest.java
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.JapaneseTokenizer;


public class KuromojiTest {

    /**
     * 分かち書きした文章をリストにして返す。
     * 
     * @param src
     * @return
     */
    private List<String> kuromojineologd(String src){
        List<String> ret = new ArrayList<>();
        try(JapaneseTokenizer jt = 
                // JapaneseTokenizerの引数は(ユーザー辞書, 記号を無視するか, モード)
                new JapaneseTokenizer(null, false, JapaneseTokenizer.Mode.NORMAL)){
            CharTermAttribute ct = jt.addAttribute(CharTermAttribute.class);
            jt.setReader(new StringReader(src));
            jt.reset();
            while(jt.incrementToken()){
                ret.add(ct.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ret;
    }

    /**
     * main
     * 自分をnewしてexecuteメソッド呼ぶだけ。
     * こうすることで他メソッドを作成するときに無駄にstatic化しなくてすむ
     * 
     * @param args
     */
    public static void main(String[] args) {
        new KuromojiTest().execute();
    }

    /**
     * 事実上のmain
     */
    public void execute(){
        System.out.println(kuromojineologd("東京スカイツリーできゃりーぱみゅぱみゅとDAIGOがロケしてた。"));
        System.out.println(kuromojineologd("ヨツンヴァインになれよ。あくしろよ。"));
    }
}
出力
[東京スカイツリー, で, きゃりーぱみゅぱみゅ, と, DAIGO, が, ロケ, し, て, た, 。]
[ヨツンヴァイン, に, なれ, よ, 。, あくしろよ, 。]

ネットスラングまで分かち書きできるとはたまげたなぁ(すっとぼけ

36
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
37