lucene-gosenを試してみる その1

2年くらい前は結構Solr使ってたんだけど↓今では遠い昔のようであんまり記憶にございません、とw

 
またSolrをイジるようになるかも的な感じなので、久しぶりにググってたら、
↓をのブログを発見して、lucene-gosenってとてもナイスっぽい感じなのでイジってみました。
Java製形態素解析ライブラリ「lucene-gosen」を試してみる
 
■ lucene-gosenを単体で動かす
 
とりあえずSolr行く前に上記のブログに習ってlucene-gosenを単体で試してみます。
http://code.google.com/p/lucene-gosen/にアクセスしてみると、
↓のようにSolr3.5~って感じになっているようです。

 
ダウンロードページに行くと↓がダウンロード出来るようになっています。
・Naist(奈良先端科学技術大学院大学)のChasen辞書付きのjar
・IPA(独立行政法人 情報処理推進機構)の辞書付きのjar
・辞書なしのjar

 
Naistは職場でお世話になってるid:tullioの母校という事でそっちにしてみました。
 
とりあえずMavenでjarファイル落としてきたいわけなんですが、
↓のチケットみるとまだって事なんですかね~
Issue 20: Register maven central repository
 
ってことで↓こんな感じでローカルにインストールしましたよ、と。
#Maven3じゃないの?とかそういうのは置いておいてw

>C:apache-maven-2.2.1binmvn install:install-file -DgroupId=org.apache.lucene -DartifactId=lucene-gosen-naist-chasen -Dversion=1.2.1 -Dpackaging=jar -Dfile=C:UsersoreoreDownloadslucene-gosen-1.2.1-naist-chasen.jar
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.2/maven-install-plugin-2.2.pom

Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.2/maven-install-plugin-2.2.jar

[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-digest/1.0/plexus-digest-1.0.pom

Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.7/plexus-components-1.1.7.pom

Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-digest/1.0/plexus-digest-1.0.jar

[INFO] [install:install-file {execution: default-cli}]
[INFO] Installing C:UsersoreoreDownloadslucene-gosen-1.2.1-naist-chasen.jar to C:Usersoreore.m2repositoryorgapachelucenelucene-gosen-nais
t-chasen1.2.1lucene-gosen-naist-chasen-1.2.1.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Fri Feb 10 18:37:44 JST 2012
[INFO] Final Memory: 4M/122M
[INFO] ------------------------------------------------------------------------

 
でもって、pom.xmlに↓のように定義を入れてやります。

<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-gosen-naist-chasen</artifactId>
  <version>1.2.1</version>
</dependency>

 
↓みたいなコード書いてanalyzeしようとしたら、なんかdeprecatedとか言われて、、

 
↓ソースみてみたら、あー、そーゆー風な感じなんですねぇ的な。
#こーやってソース追ってるだけで、フィルター的に前処理とか後処理とか
#ちゃんとしてるよねぇって気がしてきたりします。

  /**
   * Decompose a string into its most likely constituent morphemes
   *
   * @param surface The string to analyse
   * @return An array of {@link Token}s representing the most likely morphemes
   * @throws IOException
   */
  public List<Token> analyze(String surface, List<Token> reuse) throws IOException {
    Sentence sentence = new Sentence(surface.toCharArray());
    filterPreProcess(sentence);

    List<Token> tokens = viterbi.getBestTokens(sentence, reuse);

    tokens = filterPostProcess(tokens);

    return tokens;
  }

  /**
   * @deprecated use {@link #analyze(String, List)} instead.
   */
  @Deprecated
  public List<Token> analyze(String surface) throws IOException {
    return analyze(surface, new ArrayList<Token>());

 
形態素解析した結果を出力してみます。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

public class App
{
    public static void main( String[] args )
    {
        // 辞書は内包されてるのでnullでOKみたいです。
        StringTagger tagger = SenFactory.getStringTagger(null);
        String str = "今夜はみんなでカレーを食べに行きます。";
        List tokens = new ArrayList();
        try {
			tokens = tagger.analyze(str, tokens);
		} catch (IOException e) {
			e.printStackTrace();
		}
        // 名詞だけ抽出してみる
        for (Token token : tokens) {
        	if (token.getMorpheme().getPartOfSpeech().contains("名詞")) {
                System.out.println("= = = = =");
                System.out.println("surface : " + token.getSurface());
                System.out.println("partOfSpeech : " + token.getMorpheme().getPartOfSpeech());
                System.out.println("readings : " + token.getMorpheme().getReadings());
        	}
        }
    }
}

イイ感じです。

= = = = =
surface : 今夜
partOfSpeech : 名詞-副詞可能
readings : [コンヤ]
= = = = =
surface : みんな
partOfSpeech : 名詞-代名詞-一般
readings : [ミンナ]
= = = = =
surface : カレー
partOfSpeech : 名詞-一般
readings : [カレー]

 

Apache Solr入門 ―オープンソース全文検索エンジン
関口 宏司 三部 靖夫 武田 光平 中野 猛 大谷 純
技術評論社
売り上げランキング: 26985

コメント

  1. […] « lucene-gosenを試してみる その1 […]

  2. […] Checkここのところ↓のようにlucene-gosenをいじっていますが、 lucene-gosenを試してみる その1 lucene-gosenを試してみる その2 […]

タイトルとURLをコピーしました