【形態素解析】Igoを改造して品詞IDを取得する
Javaで日本語解析するのにIgoを使っていますが解析結果から各単語がどの品詞IDなのか欲しくなるときがあります。
igoの使い方
辞書登録の方法
Igoをそのまま使ってもsurfaceとfeatureとstartくらいしか情報がとれません。
「私は日本生まれです」これを解析してみます。
Tagger tagger = new Tagger("ipadic"); List<Morpheme> list = tagger.parse("私は日本生まれです"); for (Morpheme m : list) { String str = m.surface + "\t"+ m.feature + "\t"+ m.start ; System.out.println(str); }
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ 0
surface 私
feature 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
start 0
ここに品詞ID:1306が取れればいろいろと効率が良くなったりします。
以下のサイトからソースをダウンロードします。
http://sourceforge.jp/projects/igo/releases/のigo-0.4.5-src.tar.gz
Morpheme.java
package net.reduls.igo; /** * 形態素クラス */ public final class Morpheme { /** * 形態素の表層形 */ public final String surface; /** * 形態素の素性 */ public final String feature; /** * テキスト内での形態素の出現開始位置 */ public final int start; public final int rightId; //←追加 public Morpheme(String surface, String feature, int start, int rightId) { //←変更(rightIdを引数に追加) this.surface = surface; this.feature = feature; this.start = start; this.rightId = rightId; //←追加 } }
public List<Morpheme> parse(CharSequence text, List<Morpheme> result) { for (ViterbiNode vn = parseImpl(text); vn != null; vn = vn.prev) { final String surface = text.subSequence(vn.start, vn.start + vn.length).toString(); final String feature = wdc.wordData(vn.wordId); result.add(new Morpheme(surface, feature, vn.start, vn.rightId)); //←変更(vn.rightIdを引数に追加) } return result; }
変更はこれだけ。
build.xmlが含まれているのでこいつを実行するだけでjarが出来上がります。
このjarを使ってもう一度、解析してみます。
Tagger tagger = new Tagger("ipadic"); List<Morpheme> list = tagger.parse("私は日本生まれです"); for (Morpheme m : list) { String str = m.surface + "\t"+ m.feature + "\t"+ m.start + "\t" + m.rightId; System.out.println(str); }
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ 0 1306
surface 私
feature 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
start 0
rightId 1306