🤖

形態素解析器Sudachiをpythonファイルで使ってみた

2021/12/01に公開

はじめに

大学の卒業研究にて、自然言語処理(方言)を題材にやる中で、形態素解析器Sudachiに出会ったので、それについていじってみた結果を書いていきます。

前提
プログラミング初心者の学生です。動けばいいんです。動けば。精神でやっています。

Sudachiとは

「ワークスアプリケーションズ徳島人工知能NPL研究所」という会社が作っているオープンソースのツールです。
詳しくは、こちら
pythonで簡単に使えるsudachipyってのがあるので、これを使いました。

自分の環境

macbookpro m1 macOS Monterey 12.0.1
Python 3.9.1 ( venv )

始め方

このチュートリアル通りにインストールして、辞書もインストールすればOKです。
(https://github.com/WorksApplications/SudachiPy/blob/develop/docs/tutorial.md)

python test.pyで実行したい!

python test.pyで実行したかった私はいろいろ調べながら頑張りました。

SudachiやSudachipyのGithubを読んでもCLI上で動かす方法しか基本的に書いていないので、プログラミング未経験の私は全くわかりませんでした。
なので、まず、pythonのファイル上で記述して実行できることを目標にしました。

さっそくやってみた

from sudachipy import tokenizer
from sudachipy import dictionary

# トークナイザの作成
config_path = "../lib/python3.9/site-packages/sudachipy/resources/sudachi.json"
tokenizer_obj = dictionary.Dictionary(config_path=config_path, dict_type="full").create() #sudachidict_full優先

独自に追加の辞書(ユーザー辞書)を作成した場合、それをGithubにある方法でバイナリ化をし、配置することが必要になります。
→ 詳しくはこのzenn ( https://zenn.dev/sorami/articles/6bdb4bf6c7f207#設定ファイルによるユーザー辞書の指定 )

config_path = "/path/to/sudachi.json" として、Dictionaryの中で指定することで辞書を使えるようになるらしいのですが、一向に辞書が反映されないと思っていたら、パスの問題でした。
自分は、config_path = "../lib/python3.9/site-packages/sudachipy/resources/sudachi.json" にsudachi.json ファイルがあったので、ここに繋いであげることでうまくいきました。

実行その1

・すもももももももものうち
・東京特許許可局
・りんごジュース

この3つは、形態素解析の機能を確かめるために、解析器関係なく、よく使われている文字列です。
これを試してみましょう。
以下では、A・B・Cの3つのモードの検証をしています。

text = "すもももももももものうち、東京特許許可局、りんごジュース"

mode = tokenizer.Tokenizer.SplitMode.A
print(mode,"==>",[t.surface() for t in tokenizer_obj.tokenize(text, mode)])
# SplitMode.A ==> ['すもももももも', 'もも', 'の', 'うち', '、', '東京', '特許', '許可', '局', '、', 'りんご', 'ジュース']

mode = tokenizer.Tokenizer.SplitMode.B
print(mode,"==>",[t.surface() for t in tokenizer_obj.tokenize(text, mode)])
# SplitMode.B ==> ['すもももももも', 'もも', 'の', 'うち', '、', '東京', '特許', '許可', '局', '、', 'りんご', 'ジュース']

mode = tokenizer.Tokenizer.SplitMode.C
print(mode,"==>",[t.surface() for t in tokenizer_obj.tokenize(text, mode)])
# SplitMode.C ==> ['すもももももも', 'もも', 'の', 'うち', '、', '東京特許許可局', '、', 'りんご', 'ジュース']

実行その2

以下では、モードC(最大分割単位)にて分割を行い、得られるすべての情報を出力しています。

mode = tokenizer.Tokenizer.SplitMode.C
tokens = tokenizer_obj.tokenize(text,mode)
print(tokens,"====")
outputArray = []
for t in tokens:
    outputArray = t.surface(),t.part_of_speech(),t.reading_form(),t.normalized_form()
    print(outputArray)

出力結果

すもももももももものうち、東京特許許可局、りんごジュース ====
('すもももももも', ['名詞', '固有名詞', '一般', '*', '*', '*'], 'スモモモモモモ', 'すもももももも')
('もも', ['名詞', '普通名詞', '一般', '*', '*', '*'], 'モモ', 'もも')
('の', ['助詞', '格助詞', '*', '*', '*', '*'], 'ノ', 'の')
('うち', ['名詞', '普通名詞', '副詞可能', '*', '*', '*'], 'ウチ', '内')
('、', ['補助記号', '読点', '*', '*', '*', '*'], '、', '、')
('東京特許許可局', ['名詞', '固有名詞', '一般', '*', '*', '*'], 'トウキョウトッキョキョカキョク', '東京特許許可局')
('、', ['補助記号', '読点', '*', '*', '*', '*'], '、', '、')
('りんご', ['名詞', '普通名詞', '一般', '*', '*', '*'], 'リンゴ', '林檎')
('ジュース', ['名詞', '普通名詞', '一般', '*', '*', '*'], 'ジュース', 'ジュース')

CLI上で動かすと、

echo "外国人参政権" | sudachipy -a
=> 外国人参政権	名詞,普通名詞,一般,*,*,*	外国人参政権	外国人参政権	ガイコクジンサンセイケン	0

と出力されるのでそれをファイルで実行した時にも使いたかったんですね。

得られた情報をoutputArray の中に追加していき、それぞれの形態素情報を取得できました。
t.surface(),t.part_of_speech(),t.reading_form(),t.normalized_form()

ちなみに、SudachiのSlackユーザーコミュニティで質問したところ、解析結果後の得られるすべての情報は、これだけではありませんでした。
こちらを読むとすべての出力操作方法が書かれていますので、参考にしてください
https://worksapplications.github.io/sudachi.rs/python/

特にここですね。表層形や読み方以外にも、辞書にあるのか、ないのか、辞書内一意のIDなどが表示できます
https://worksapplications.github.io/sudachi.rs/python/api/sudachipy.html#wordinfo

まとめ

これで、とりあえずtest.pyのファイルを実行すれば、出力できるようなりました。
とりあえず、品詞情報も込みでpythonでも出力したかったので、よかったです。
めでたしめでたし

はじめてzennを書きました。
これからも頑張ります!

参考にしたサイト

https://evrythingonmac.blogspot.com/2019/12/sudachipy-sudachidictfull-update.html
https://ohke.hateblo.jp/entry/2019/03/09/101500

Discussion