日本語自然言語処理を行う際に、形態素解析をどうするかという問題はいつもつきまとってきます。
今回記事を書こうと思ったのは、Vaporettoなる形態素解析器を見かけたからです。 こちらに興味が湧いたのと、他の形態素解析器と比較してみたくなったので、やってみた次第です。
そんなわけで、今回は形態素解析で色々使って実験してみたのでそのメモです。
Vaporetto
Vaporetto is a fast and lightweight pointwise prediction based tokenizer. This repository includes both a Rust crate that provides APIs for Vaporetto and CLI frontends.
Rust製の軽量で高速な形態素解析器ってことですね。 形態素解析の中身については全くわかってないんですが、論文があるので詳しくはそちらをご参照ください。
https://www.anlp.jp/proceedings/annual_meeting/2022/pdf_dir/D2-5.pdf
とりあえず動かしてみる
READMEに書いてあるとおりに動かしてみます。
インストールとは別にモデルファイルのダウンロードが必要みたいで、それを読み込んで使うのが一番カンタンにつかう方法みたいですね。
速度比較
形態素解析の速度についてやんわり試してみたいと思います。
比較対象は、こちらの記事を参考に下記を比較してみたいと思います。
- Mecab
- Sudachi
- Juman++ (今回Jumanはやってないです)
あたりと比較してみたいと思います。
その他条件は下記。
- 環境:Google Colab
- 使用データ:livedoorニュースコーパス
Mecab
Sudachi
Juman++
Vaporetto
結果
実際に動かしてみた結果がこちらです。
実行時間(sec) | |
---|---|
Mecab | 12.88736343383789 |
Sudachi | 22.769251108169556 |
Juman++ | 152.99283862113953 |
Vaporetto | 11.956955432891846 |
※1: 形態素解析器はPythonから呼び出さなくても使用されるので、「Pythonから呼び出したときの性能では」という注釈は付きますので、形態素解析本体の速度ではないことはご容赦ください
※2: 実験ではテキストファイルの読み込みなどの、形態素解析以外の処理が若干含まれている点はご注意ください
※3: Google colabで実行しているので、厳密な速度評価になっていない点はご注意ください
形態素解析の結果を眺める
今度は、どれくらいいい感じに形態素解析サれてるのか、よくある形態素解析が難しい例を使ってみてみます。
外国人参政権
結果 | |
---|---|
Mecab | ['外国', '人参', '政権', '\n'] |
Sudachi | ['外国人参政権'] |
Juman++ | ['外国', '人', '参政', '権'] |
Vaporetto | ['外国', '人', '参', '政権'] |
魔法少女リリカルなのは
結果 | |
---|---|
Mecab | ['魔法', '少女', 'リリカル', 'な', 'の', 'は', '\n'] |
Sudachi | ['魔法', '少女', 'リリカル', 'な', 'の', 'は'] |
Juman++ | ['魔法', '少女', 'リリカルなのは'] |
Vaporetto | ['魔法', '少女', 'リリカル', 'な', 'の', 'は'] |
弁慶がなぎなたを持って
結果 | |
---|---|
Mecab | ['弁慶', 'が', 'なぎなた', 'を', '持っ', 'て', '\n'] |
Sudachi | ['弁慶', 'が', 'なぎなた', 'を', '持っ', 'て'] |
Juman++ | ['弁慶', 'が', 'なぎなた', 'を', '持って'] |
Vaporetto | ['弁慶', 'が', 'なぎなた', 'を', '持っ', 'て'] |
参考文献
下記の文献を参考にさせていただきました。
- GitHub - daac-tools/python-vaporetto: 🛥 Vaporetto is a fast and lightweight pointwise prediction based tokenizer. This is a Python wrapper for Vaporetto.
- GitHub - daac-tools/vaporetto: 🛥 Vaporetto: Very Accelerated POintwise pREdicTion based TOkenizer
- GitHub - chezou/Mykytea-python: Python wrapper for KyTea
- https://www.anlp.jp/proceedings/annual_meeting/2022/pdf_dir/D2-5.pdf
- 2019年末版 形態素解析器の比較 - Qiita
- Sudachiで馬謖を切る: 形態素解析の可視化とユーザー辞書による制御
感想
ってことで、vaporettoは興味はあったんですが使ったことがなく、試してみるついでにいろいろ実験してみた次第です。 今回やってみた実験結果としては、
- Vaporettoが一番速かった
- Pythonから呼び出してるからなのかMecabといい勝負にはなってたけど、それでも速い
- 区切りがいい感じにできていたのはJuman++
- 魔法少女リリカルなのはが分割できるのはビビった
って感じでした。魔法少女リリカルなのはの衝撃がすごすぎるので今回はこのへんで。