形態要素解析器Sudachiを単体で使ってみる



Sudachiを単体で、フル辞書で使ってみた。この解析器にはモードがA,B,Cと三つあり、それぞれ分かちかたが異なる。

分かちの例

あまり良い例が思いつかないのだが、以下の解析を行ってみた。望みの結果になっていないものも含んでいる。

「ハリーポッターと偽ハリー・ポッターと真Harry Potter」
A:ハリー/ポッター/と/偽/ハリー/・/ポッター/と/真/Harry Potter
B:ハリー/ポッター/と/偽/ハリー/・/ポッター/と/真/Harry Potter
C:Harry Potter/と/偽/ハリー・ポッター/と/真/Harry Potter

「さっぽろテレビ塔」
A:さっぽろ/テレビ/塔
B:さっぽろ/テレビ塔
C:さっぽろテレビ塔

「カンヌ国際映画祭」
A:カンヌ/国際/映画/祭
B:カンヌ/国際/映画祭
C:カンヌ国際映画祭

「にっぽんの社長とニッポンの貧者と日本の対策」
A:日本/の/社長/と/日本/の/貧者/と/日本/の/対策
B:日本/の/社長/と/日本/の/貧者/と/日本/の/対策
C:日本/の/社長/と/日本/の/貧者/と/日本/の/対策

「ヴァイオリンとバイオリン、ヴぁいおりん、ヴィオロン、ヴィヨロン、ヴィオリン」
A:バイオリン/と/バイオリン/、/ヴ/ぁ/いおりん/、/ヴィオロン/、/ヴィヨロン/、/ヴィオリン
B:バイオリン/と/バイオリン/、/ヴ/ぁ/いおりん/、/ヴィオロン/、/ヴィヨロン/、/ヴィオリン
C:バイオリン/と/バイオリン/、/ヴ/ぁ/いおりん/、/ヴィオロン/、/ヴィヨロン/、/ヴィオリン

「エヴァンゲリオン緊急停止、エバンゲリオン起動」
A:エバンゲリオン/緊急/停止/、/エバンゲリオン/起動
B:エバンゲリオン/緊急/停止/、/エバンゲリオン/起動
C:エバンゲリオン/緊急/停止/、/エバンゲリオン/起動

「引っ越しの対応は引越し専門業者引越ヒッコッシャーへ」
A:引っ越し/の/対応/は/引っ越し/専門/業/者/引っ越し/ヒッコッシャー/へ
B:引っ越し/の/対応/は/引っ越し/専門/業/者/引っ越し/ヒッコッシャー/へ
C:引っ越し/の/対応/は/引っ越し/専門/業/者/引っ越し/ヒッコッシャー/へ

「サイトウさんには 斉藤、斎藤、齋藤、齊藤 などの表記バリエーションがあります。」
A:サイトウ/さん/に/は/ /斉藤/、/斎藤/、/齋藤/、/齊藤/ /など/の/表記/バリエーション/が/有る/ます/。
B:サイトウ/さん/に/は/ /斉藤/、/斎藤/、/齋藤/、/齊藤/ /など/の/表記/バリエーション/が/有る/ます/。
C:サイトウ/さん/に/は/ /斉藤/、/斎藤/、/齋藤/、/齊藤/ /など/の/表記/バリエーション/が/有る/ます/。

「練習に打込む、打ち込む」
A:練習/に/打つ/込む/、/打つ/込む
B:練習/に/打ち込む/、/打ち込む
C:練習/に/打ち込む/、/打ち込む

「シュミレーション → シミュレーション」
A:シミュレーション/ /→/ /シミュレーション
B:シミュレーション/ /→/ /シミュレーション
C:シミュレーション/ /→/ /シミュレーション

「天丼とかつ丼ではカツ丼の方が」
A:天/丼/と/かつ/丼/で/は/カツ/丼/の/方/が
B:天丼/と/カツ丼/で/は/カツ丼/の/方/が
C:天丼/と/カツ丼/で/は/カツ丼/の/方/が

「量子コンピューターはフォイマン型コンピュータよりも早く、AプリンターはBプリンタよりも遅い」
A:量子/コンピューター/は/フォイマン/型/コンピューター/より/も/早い/、/a/プリンター/は/b/プリンター/より/も/遅い
B:量子/コンピューター/は/フォイマン/型/コンピューター/より/も/早い/、/a/プリンター/は/b/プリンター/より/も/遅い
C:量子コンピューター/は/フォイマン/型/コンピューター/より/も/早い/、/a/プリンター/は/b/プリンター/より/も/遅い

「タバコと塩の博物館には塩害や盛塩についての情報もあるかも、煙草と塩の博物館?それともたばこと塩?」
A:タバコ/と/塩/の/博物/館/に/は/塩害/や/盛り/塩/に/つく/て/の/情報/も/有る/か/も/、/タバコ/と/塩/の/博物/館/?/其れ/と/も/タバコ/と/塩/?
B:タバコ/と/塩/の/博物館/に/は/塩害/や/盛り/塩/に/つく/て/の/情報/も/有る/か/も/、/タバコ/と/塩/の/博物館/?/其れ/と/も/タバコ/と/塩/?
C:タバコ/と/塩/の/博物館/に/は/塩害/や/盛り/塩/に/つく/て/の/情報/も/有る/か/も/、/タバコ/と/塩/の/博物館/?/其れ/と/も/タバコ/と/塩/?

プログラム

からexecutableとfull-dictionaryをダウンロードする。以下のようにファイルを配置する。

※ちなみに、以下で使うfull.dicは360MBある。

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'

repositories {
  jcenter()
}

sourceSets {
  main {
    java { srcDir 'src' }
  }
}

dependencies {
  compile fileTree(dir: './lib', includes: ['**/*.jar'])
}

テストプログラム

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.*;

import com.worksap.nlp.sudachi.*;
import com.worksap.nlp.sudachi.Dictionary;
import com.worksap.nlp.sudachi.Tokenizer.*;

public class Main {

  static String[]TESTS = new String[] {
      "ハリーポッターと偽ハリー・ポッターと真Harry Potter",
      "さっぽろテレビ塔",
      "カンヌ国際映画祭",
      "にっぽんの社長とニッポンの貧者と日本の対策",
      "ヴァイオリンとバイオリン、ヴぁいおりん、ヴィオロン、ヴィヨロン、ヴィオリン",
      "エヴァンゲリオン緊急停止、エバンゲリオン起動",
      "引っ越しの対応は引越し専門業者引越ヒッコッシャーへ",
      "サイトウさんには 斉藤、斎藤、齋藤、齊藤 などの表記バリエーションがあります。" ,
      "練習に打込む、打ち込む",
      "シュミレーション → シミュレーション",
      "天丼とかつ丼ではカツ丼の方が",
      "量子コンピューターはフォイマン型コンピュータよりも早く、AプリンターはBプリンタよりも遅い",
      "タバコと塩の博物館には塩害や盛塩についての情報もあるかも、煙草と塩の博物館?それともたばこと塩?"
  };

  public static void main(String[]args) throws IOException {
    String settings = Files.readString(Paths.get("sudachi_fulldict.json"));    
    try (Dictionary dict = new DictionaryFactory().create(settings)) {
        TokenizerTest tokenizer = new TokenizerTest(dict.create());

      Arrays.stream(TESTS).forEach(string -> {
        System.out.println("\n「" + string + "」");
        SplitMode[] modes = new SplitMode[] { SplitMode.A, SplitMode.B, SplitMode.C };
        Arrays.stream(modes).forEach(mode -> {
          List<Morpheme> tokens = tokenizer.split(mode, string);
          System.out.println(mode + ":" + tokens.stream().map(t -> t.normalizedForm()).collect(Collectors.joining("/")));
        });
      });
    }
  }

  static class TokenizerTest {
    final Tokenizer tokenizer;
    TokenizerTest(Tokenizer tokenizer) {
      this.tokenizer = tokenizer;
    }
    List<Morpheme>split(Tokenizer.SplitMode mode, String line) {
      List<Morpheme> tokens = tokenizer.tokenize(mode, line);
      return tokens;
    }
  }
}

参考