はじめに
Python の jdepp で自然言語処理を行い、その結果を Graphviz を使って可視化する際に、
日本語が文字化けしてしまう問題に直面しました。
Graphviz は、グラフを描画するための強力なツールですが、
日本語のフォントが正しく設定されていないため、日本語が文字化けしてしまいます。

文字化けしたグラフ
公開されている多くの記事では、jdepp と Graphviz を使って日本語を表示する方法が紹介されていますが、
環境のせいなのか、実際に試してみると文字化けが発生します。
この記事では、jdepp と Graphviz を使って日本語を表示する方法と、
文字化けを解消するための具体的な方法を紹介します。
動作環境
Python環境
| Python | v3.11.8 |
| python-graphviz | v0.20.3 |
| jagger | v0.1.20 |
| jdepp | v0.1.8 |
インストール
$ pip install graphviz jagger jdepp
ホストOS環境
| OS | Windows11 Pro 24H2 |
| Graphviz | v12.2.1 (64bit) [URL] |
モデル
| kwdlc | v0.1.0 [URL] |
| knbc-mecab | v0.1.0 [URL] |
解決方法
以下のコードは、Python の jdepp+Graphviz を使って、日本語を正しく表示することができます。
このコードでは、graphviz.Source オブジェクトを使用し、dot 言語のテキストに
日本語フォントを指定することで、文字化けを防いでいます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import graphviz import jagger import jdepp def main(): tagger = jagger.Jagger() tagger.load_model('model/kwdlc/patterns') parser = jdepp.Jdepp() parser.load_model('model/knbc') nlp = lambda x: parser.parse_from_postagged( '\n'.join(t.surface() + '\t' + t.feature() for t in tagger.tokenize(x)) + '\nEOS\n') doc = nlp('吾輩はここで始めて人間というものを見た') print(doc) print(jdepp.to_tree(str(doc))) dot = jdepp.to_dot(str(doc)) jdot = '' for line in dot.split('\n'): if line.startswith('digraph jdepp {'): jdot += line + '\n' jdot += ' graph [fontname="MS Gothic"]\n' jdot += ' node [fontname="MS Gothic"]\n' jdot += ' edge [fontname="MS Gothic"]\n' else: jdot += line + '\n' print(jdot) graph = graphviz.Source(jdot, engine='dot', encoding='utf-8') graph.view() if __name__ == '__main__': main() |
コードの説明
- ライブラリのインポート
プログラムの冒頭で、graphviz, jagger, jdepp をインポート - 自然言語処理のモデル読込
jagger と jdepp にモデルを読込み、日本語のテキストを解析 - dot 言語のテキストにフォントを追加 [★ポイント]
jdepp.to_dot メソッドで生成された dot テキストに、日本語フォント (MS Gothic) を追加
jdot に代入し、以降はこれを使用 - Graphviz でグラフを表示
graphviz.Source を使用して、フォントが設定された dot テキストを表示
実行結果
紹介した Python コードで「吾輩はここで始めて人間というものを見た」という文章を入力に、
jdepp と jager で自然言語処理して Graphviz で表示した結果です。

文字化しないブラフ
さいごに
この方法を使うことで、Python で Graphviz を使用して日本語を正しく表示できます。
特に、jdepp を使用して日本語の係り受け解析の結果を可視化する際に、
文字化けを防ぐことができます。
日本語の自然言語処理の結果を可視化する際に、ぜひ参考にしてみてください。
参考
- Qiita:jdepp-pythonで日本語(二文節間)係り受け解析
- Qiita:Graphvizのコマンドで日本語が文字化けして困った
- Zenn:C++ 高速日本語係り受け解析 J.DepP(ジョニーデップ)の Python binding のメモ