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