🤖

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

2021/12/01に公開約3,200字

はじめに

現在、大学の関係でsudachiを使っており、test.pyを実行して、欲しい解析情報を出力させたかったのですが、結構時間がかかったので、ここに書いておきます。

非NLPerでまったくちんぷんかんぷんで、プログラミングも数ヶ月前からpythonをやってる程度ですが、なんとかここまで辿り着いたので、残しておきます。

Sudachiとは

徳島にある会社が作っているOSSです。
詳しくは、こちら
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で実行したかった私はいろいろ調べながら頑張りました。

結果、こうすればいいっぽいです。

importとか

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優先

実行その1

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

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()
これで、それぞれの形態素情報を取得できました。

まとめ

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

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

参考にしたサイト

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

Discussion

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