「MeCabではなくSentencePieceを使え!!」
LSTM (RNN)による文章生成の分野では、SentencePieceが利用されています。
本記事の内容
- SentencePieceとは?
- SentencePieceのシステム要件
- SentencePieceのインストール
- SentencePieceの動作確認
それでは、上記に沿って解説していきます。
SentencePieceとは?
SentencePieceは、文章生成システム向けのテキストトークン化ツール(トークナイザー)です。
表現的には、MeCabによる形態素解析よりは、字句解析と言った方がいいのかもしれません。
主に、ニューラルネットワークベースの文章生成で効果を発揮します。
SentencePieceは文章生成において、必要な技術とも言えます。
SentencePieceの詳細については、次の記事をご覧ください。
https://qiita.com/taku910/items/7e52f1e58d0ea6e7859c
SentencePieceの開発者本人が、詳しい説明をしています。
ここでは、簡単に整理だけしておきます。
LSTM (RNN)においては、形態素解析(MeCab)が非効率だということです。
つまり、LSTM (RNN)では「MeCabは使えねー」ということです。
MeCabを使うと、低頻度語が捨てられるという問題が発生します。
辞書(大規模な語彙)を扱うことによる弊害だと考えればよいでしょう。
その問題を解決する手法として、サブワードが生み出されました。
さらに、そのサブワードを進化させたモノがSentencePieceになります。
なお、同じ人がSentencePieceとMeCabを開発しています。
この開発者の方は、日本語の自然言語処理では欠かせない人と言えます。
以上、SentencePieceに関する説明でした。
次は、SentencePieceのシステム要件を確認します。
SentencePieceのシステム要件
現時点(2021年8月)でのSentencePieceの最新バージョンは、0.1.96となります。
この最新バージョンは、2021年6月18日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応のはずです。
- Windows
- macOS
- Linux
ただ、setup.pyには以下のように記載されています。
おそらく、setup.pyに正しく反映されていないだけでしょう。
Windowsでは、問題なく動かせています。
また、サポート対象となるPythonのバージョンは不明です。
特に明示されていません。
公式(GitHub上のページ)を見る限り、Python 2系とPython 3系の両方に対応しているようです。
しかし、なるべく新しいPythonを利用することをおススメします。
以下は、Pythonの公式開発サイクルです。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月 |
3.7 | 2018年6月27日 | 2023年6月 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
基本的には、上記の公式開発サイクルに準じてライブラリが開発・更新されています。
パッケージ絡みでトラブルを起こさないためには、上記サイクルに従うべきでしょうね。
なお、Pythonのアップグレードは次の記事が参考となります。
以上、SentencePieceのシステム要件について説明しました。
次は、SentencePieceをインストールしていきます。
SentencePieceのインストール
まずは、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ------------- ------- pip 21.2.4 setuptools 57.4.0
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、SentencePieceのインストールです。
SentencePieceのインストールは、以下のコマンドとなります。
pip install sentencepiece
インストールは、一瞬で終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ------------- ------- pip 21.2.4 sentencepiece 0.1.96 setuptools 57.4.0
SentencePieceが依存するパッケージは、ありません。
そう考えると、比較的容易に既存環境に導入できそうです。
以上、SentencePieceのインストールの説明でした。
最後に、SentencePieceの動作確認を行います。
SentencePieceの動作確認
SentencePieceの動作確認は、次の処理に分けて行います。
- モデルの作成
- モデルを利用した分割処理
それぞれを下記で説明します。
モデルの作成
MeCabなどとは異なり、辞書は存在しません。
その代わりに、モデルを作成する必要があります。
モデルを作成するには、学習対象となるテキストデータが必要です。
このテキストデータ次第でモデルの質が、左右されてきます。
今回は、用意されているモノを利用しましょう。
SentencePiece公式(GitHub)にある
https://raw.githubusercontent.com/google/sentencepiece/master/data/wagahaiwa_nekodearu.txt
まずは、このファイルをダウンロードします。
このファイルを使ってモデルを作成するのが、次のコードになります。
import sentencepiece as spm # 学習によるモデル作成 sp = spm.SentencePieceProcessor() spm.SentencePieceTrainer.train('--input=wagahaiwa_nekodearu.txt --model_prefix=trained_model --vocab_size=8000 --character_coverage=0.9995')
上記を実行します。
問題なく動作すると、以下のファイルが作成されます。
- trained_model.model
- trained_model.vocab
「trained_model」は、「–model_prefix=」に設定した値になります。
trained_model.modelが、作成したモデルです。
また、trained_model.vocabは語彙テーブルと呼ばれています。
モデルを利用した分割処理
分割を行うコードは、以下。
import sentencepiece as spm TEXT = "猫になったんだよな君は" # 学習済みモデルの読み込み sp = spm.SentencePieceProcessor() sp.load('trained_model.model') # 分割した結果を表示 result = sp.EncodeAsPieces(TEXT) print(result) # 分割して単語IDとともに表示 for i in sp.EncodeAsIds(TEXT): print(i, sp.IdToPiece(i))
「TEXT」に設定した値が、分割対象の文字列となります。
ここは、各自で適当に変更してみてください。
と言っても、学習対象となるテキストに含まれるワードが望ましいです。
上記コードを実行した結果は、以下。
['▁', '猫', 'になった', 'んだよ', 'な', '君は'] 36 ▁ 107 猫 333 になった 983 んだよ 20 な 256 君は
学習するために読み込んだファイルが、wagahaiwa_nekodearu.txtでした。
「猫」は、さすがに判別できたようです。
以上、SentencePieceの動作確認を説明しました。