🥗

形態素解析の可視化ツール「ViSudachi」を使ってみる

2021/11/03に公開約8,100字

当記事は、ViSudachiの開発初期に書かれたものです。今はより簡単に利用することができます。以下の記事もご参照ください:

https://zenn.dev/sorami/articles/11b721929d70af

概要

WorksApplications/ViSudachi: A tool for visualizing the internal structures of morphological analyzer Sudachi

  • 形態素解析器Sudachiの解析結果を可視化するツール ViSudachi が開発中らしい
  • GitHubで公開されていたので使ってみた(2021年11月3日。まだ公式発表はされていない)
  • kagome や janome にもラティス可視化機能はあるよ

形態素解析の可視化とは

多くの形態素解析器では、全ての解析候補を表現する「ラティス」というデータ構造を構築し、その上での「最短経路」を探す問題として解析を定式化しています(最小コスト法)。単語の出現しやすさや並びやすさをコストとして、それらの可能性の中から、もっともそれらしいもの(コストが最小の経路)を選択しています。

そのラティスと経路を可視化することで、なぜその解析結果が選ばれたのか、他にはどのような候補がありコストはどれくらい違うのかなどを確認することができます。

これは、形態素解析器用学習コーパスの修正や、ユーザー辞書見出しのコスト調整といった作業の助けとなります(ちなみに現代ではほとんどの場合において、CRFなどの機械学習手法によってコストを推定しますが、それ以前の時代には、人間の専門家がこれらの値を設定・調整していたそうです)。

解析アルゴリズムの詳細は、以下の記事が参考になります;

より詳しく知りたい方は、以下の書籍も参考になるでしょう;

また、MeCabやSudachiなどほとんどの解析器は、上記のようにラティスを使った最小コスト法により解析していますが、KyTeaVAporetto といった解析器は「点予測」という異なるアルゴリズムを使っています。詳細は工藤本第6章などをご覧ください。

可視化ツール「ViSudachi」が開発中らしい

ViSudachiを使ってみよう

Sudachiの準備

# Sudachiのビルド
$ git clone git@github.com:WorksApplications/Sudachi.git
$ cd Sudachi
$ mvn package -P executable-package
# `executable-package` というプロフィールを指定すると、依存するjarがコピーされる
# `mvn package` だけだと、実行時に `javax.json` 等がない、となる

# 辞書ファイルの用意
# ビルド済み辞書ファイルはここで公開されている: http://sudachi.s3-website-ap-northeast-1.amazonaws.com/sudachidict/
$ wget http://sudachi.s3-website-ap-northeast-1.amazonaws.com/sudachidict/sudachi-dictionary-latest-core.zip
$ unzip sudachi-dictionary-latest-core.zip
$ cp sudachi-dictionary-20210802/system_core.dic .

# 動くことを確認
$ echo この先生きのこる | java -jar target/sudachi-0.5.3-SNAPSHOT.jar
この先  名詞,普通名詞,一般,*,*,*        この先
生きのこる      動詞,一般,*,*,五段-ラ行,終止形-一般     生き残る
EOS

ViSudachiの準備: バックエンド(Spring Boot)

Sudachiインスタンスをつくり、 tokenizer.dumpInternalStructures() するもの。

$ git clone git@github.com:WorksApplications/ViSudachi.git
$ cd ViSudachi

Gradleが入っている前提: 必要があれば brew install gradle などとする)

$ gradle wrap
# gradle/wrapper/gradle-wrapper.jar が作成される

build.gradle を編集し、前工程でビルドしたSudachiのjarファイルなどを明示的に指定する;

Before

...
dependencies {
	implementation 'com.worksap.nlp:sudachi:0.5.3-SNAPSHOT'
	implementation 'org.springframework.boot:spring-boot-starter-web'
  	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
...

After

dir: 'WorksApplications/Sudachi/target' の箇所に、前段でビルドしたSudachiのtargetディレクトリを指定する)

...
dependencies {
	implementation(fileTree(
		dir: 'WorksApplications/Sudachi/target',
		include: ['sudachi-0.5.3-SNAPSHOT.jar', 'javax.json-1.1.jar', 'jdartsclone-1.2.0.jar']
	))
	implementation 'org.springframework.boot:spring-boot-starter-web'
  	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
...
$ ./gradlew bootJar

BUILD SUCCESSFUL in 1s
5 actionable tasks: 1 executed, 4 up-to-date

ViSudachiの準備: フロントエンド(React)

yarnが入っている前提)

$ cd frontend
$ yarn install

ViSudachiの起動

バックエンド

system_core.dic ファイルを実行ディレクトリに置いておく)

$ java -jar build/libs/visudachi-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.6)

2021-11-04 00:56:08.687  INFO 57889 --- [           main] c.w.nlp.visudachi.ViSudachiApplication   : Starting ViSudachiApplication using Java 17.0.1 on tsuetate with PID 57889 (WorksApplications/ViSudachi/build/libs/visudachi-0.0.1-SNAPSHOT.jar started by sorami in WorksApplications/ViSudachi)
2021-11-04 00:56:08.689  INFO 57889 --- [           main] c.w.nlp.visudachi.ViSudachiApplication   : No active profile set, falling back to default profiles: default
2021-11-04 00:56:09.444  INFO 57889 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-11-04 00:56:09.455  INFO 57889 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-11-04 00:56:09.456  INFO 57889 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.54]
2021-11-04 00:56:09.514  INFO 57889 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-11-04 00:56:09.514  INFO 57889 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 774 ms
2021-11-04 00:56:09.841  INFO 57889 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-04 00:56:09.849  INFO 57889 --- [           main] c.w.nlp.visudachi.ViSudachiApplication   : Started ViSudachiApplication in 1.527 seconds (JVM running for 1.872)
2021-11-04 00:56:11.300  INFO 57889 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-04 00:56:11.301  INFO 57889 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-11-04 00:56:11.303  INFO 57889 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms

フロントエンド

$ cd frontend
$ yarn start
# Reactアプリが起動される

http://localhost:3000/ へおもむろにアクセスする。

ViSudachiの使い方

入力欄にテキストを入れると、ラティスと最短経路が濃い緑色で表示されます。各ノードには「出現コスト(最後の行)」、ノード間には「連接コスト(灰色線の上にある数値)」が表示されています。パスの合計コストも入力欄の下に表示されます。

任意のノードをクリックすると、「そのノードを含む最短経路」が表示されます。その際には、全体最短経路にあるノードは黄色になります。合計コストが全体最短経路からどれくらい増えたかも (+40) というような形で表示されます。

上記の例では、 外国人参政権 と入力し、 人参(ID:284184)🥕 というノードをクリックしたときの状態です。全体での最短経路は、黄色で表示されている 外国人参政権(ID:1059843) です。それに対して、「人参」を含む最短経路は 外国 人参 政権 と濃い緑色で表示されています。また、この場合には合計コストが全体最短経路よりも2,308大きいことも確認できます。

余談: その他の可視化ツール

ViJUMAN, ViCha, VisualMorphs

NAIST松本研では「形態素解析視覚化システム ViJUMAN & ViCha」が開発されていた。いまはもうメンテされていない(参考: 公開ツール - NAIST Computational Linguistics)。

VisualMorphsは、コーパス作成支援GUIツール。 GiNZA開発者の松田寛さんが松本研在籍時に開発(参考: (松田 2000) 品詞タグ付きコーパス作成支援環境の構築)。

(これらツールについて、私は伝聞でしか知らないので、もし情報が間違っていたらご指摘ください)

ViSudachiはこれらにインスパイアされている(参考: GitHub README)。

kagome (Go製の形態素解析器)

形態素解析のコマンドを利用する|実践:形態素解析 kagome v2

lattice モードでは、解析過程のラティスを Graphviz の dot 形式で表示することが可能です。

kagome lattice

(図出典: github.com/ikawaha/kagome

janome (Python製の形態素解析器)

Welcome to janome's documentation! (Japanese) — Janome v0.4 documentation (ja)

-g オプションをつけると,解析後にラティスグラフがファイルに出力されます。

janome lattice

(図出典: janome公式ドキュメント - ラティス可視化

Enjoy Visualization!

Discussion

ログインするとコメントできます