形態要素解析器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;
}
}
}