Index > Senを使って文章をわかちがきする(Java)
Tue, March 28, 2006

Senを使って文章をわかちがきする(Java)

Java で実装された形態素解析器である Sen を使って日本語を単語単位に分割する実験。
java.text.BreakIteratorとの違いも比較してみます。

SenとBreakIteratorとで違いを比較

以下の例文を区切る場合を実験してみる。

我輩は猫である。
名前はまだ無い。
どこで生まれたのかとんと見当が付かぬ。

BreakIteratorを使った場合

import java.io.*;
import java.util.*;
import java.text.*;

public class BreakIteratorTest{

    static private String TEXT="我輩は猫である。名前はまだ無い。どこで生まれたのかとんと見当が付かぬ。";

    static private ArrayList getStringPerWords(String string) {

        ArrayList list = new ArrayList();

        BreakIterator boundary = BreakIterator.getWordInstance(Locale.JAPAN);//単語単位で分割
        boundary.setText(string);
        int start = boundary.first();
        for (int end = boundary.next(); end != BreakIterator.DONE;
            start = end, end = boundary.next()) {
            String word = string.substring(start, end);
            list.add(word);
        }

        return list;
    }
    static public void main(String[] s){
        try{
            PrintWriter pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream("log"),"EUCJP"));

            BreakIteratorTest test=new BreakIteratorTest();
            ArrayList list=test.getStringPerWords(TEXT);
            for(int i=0; i<list.size(); i++){
                String token=(String)list.get(i);
                pw.println(token);
            }

            pw.close();
        }
        catch(Exception ex){
        }
    }

}

実行結果

我輩
は
猫
である
。
名前
はまだ
無
い
。
どこで
生
まれたのかとんと
見当
が
付
かぬ
。

Senを使った場合

import java.io.*;

import net.java.sen.StringTagger;
import net.java.sen.Token;


public class SenTest{

    static private String TEXT="我輩は猫である。名前はまだ無い。どこで生まれたのかとんと見当が付かぬ。";

    private String senxml;
    public SenTest(String senxml){
        this.senxml=senxml;
    }
    public Token[] getTokens(String string) { 
        Token[] tokens; 
        try { 
            StringTagger stringtagger=StringTagger.getInstance(this.senxml); 
            tokens = stringtagger.analyze(string); 
        }
        catch (IOException ex) { 
            ex.printStackTrace(); 
            return new Token[0]; 
        } 
        return tokens;
    }

    static public void main(String[] s){
        try{
            PrintWriter pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream("log"),"EUCJP"));

            SenTest test=new SenTest("/home/moca/local/sen/conf/sen.xml");
            Token[] tokens=test.getTokens(TEXT);
            for(int i=0; i<tokens.length; i++){
                Token token=tokens[i];
                pw.println(token.toString());
            }

            pw.close();
        }
        catch(Exception ex){
        }
    }
}

※ /usr/home/local/sen にSenがインストールされていることが前提です。

実行結果

我輩
は
猫
で
ある
。
名前
は
まだ
無い
。
どこ
で
生まれ
た
の
か
とんと
見当
が
付か
ぬ
。

やはりSenで処理した方が自然な区切りに近い。

 Twitter
follow me on Twitter
 Categories