SentencePieceをpythonスクリプトから使ってみる - 2月 24, 2019 こんにちは、ぐぐりら(@guglilac)です。 modelの学習はコマンドラインからやるのが普通、みたいな記事をみましたが、pythonからでもできるのでそちらでやります。 他の記事ではわざわざsubprocessを使ったりしていますが、普通にpythonライブラリにtrainerを用意してくれているのでありがたく使えばよいです。 日本語の記事がなかったので一応書きます ## sentence pieceとは 文章をいくつか区切ってそれらを機械学習モデルに食わせる、みたいなことはよくやります。 MeCabを使って形態素解析するのがよくやられる手法です。 Mecabでは対応する辞書を使って文章を分割します。辞書にはneologdとかがよく使われます。 これでも上手くいくことも多いですが、語彙数が大きくなってしまうことや、分割の仕方が分割したいデータセットに適していないこともあり、問題点だったりします。 分割の仕方もこれから分割する文書から学習したほうがいい気がするのはわりと直感的な気がします。 sentence pieceでは、与えた文書の中で高い頻度で現れるフレーズは、多少長くても一つの単位として認識します。 逆に短いフレーズでもあまり高頻度で現れない場合はフレーズを分割し、よく出現する単位まで細かく分割します。 mecabで辞書を使って分割するとなんでも細かく分割されますが、sentence pieceではその文書ではよく使われる言い回しなどは一つの単位として認識されるようになり、よりタスクのドメインに適している分割が得られると期待できます。 また、語彙数を指定することで、語彙数が膨大になることを防ぐことができます。分割したフレーズにidをふってモデルの入力とする場合には、入力の次元が語彙数になるので小さいと嬉しいです。 ハフマン符号みたいです。よく現れる文字列には短い符号長を割り当てる、みたいなところが似ています。 ## インストール ```bash pip install sentencepiece ``` ## pythonスクリプトで使う importします ```python import sentencepiece as spm ``` インスタンスをつくって ```python sp = spm.SentencePieceProcessor() ``` 分割したい文書集合を与えて分割をtrainingします。 機械学習などの文脈ではもちろんこれはテストデータを含まない文書集合を与える必要があります。 (normalizeする際にテストデータを含めた平均分散を出さずに訓練データのみで計算するのと同じ) ```python # train sentence piece spm.SentencePieceTrainer.Train("--input=data.txt --model_prefix=trained_model --vocab_size=8000") ``` `data.txt`は一文ずつ文章がはいっている文書集合です。 これで分割を学習します。 これは適宜自分で作る必要があるでしょう。 これを実行すると、`trained_model.model`という分割を行うためのモデルが生成されます。 `--vocab_size`の部分で語彙数を制限できます。 8000とか16000あたりが使われるみたいです。 次に作ったモデルを読み込みます。 ```python # load model sp.Load("trained_model.model") ``` let's 分割! ```python splitted_list=sp.EncodeAsPieces("おはようこんにちはおやすみなさい") ``` 適当な文書集合を使って訓練したらこうなりました。 もちろん訓練に使った文書集合によって結果は変わります。 ```python ["▁おはよ", "う", "こんにちは", "おやすみ", "なさい"] ``` スペースは分割する前にアンダースコアに変換されます。 ここでは試していませんが改行も変換されるはずです。 文頭にスペースはないのですがいつも先頭にアンダースコアがついてきます。 ## おわりに こんなかんじで分割したら、あとはモデルに入力してみたりできます。 idをふる、one hot エンコードする、頻度を使ってベクトルにするなど、mecabで分割したときと同じ方法が使えます。 分割がmecabに比べて大きな単位になりやすいので、同じ文章から得られるシーケンスがsentence pieceの方が短くなりやすいという特徴があります。 ぜひ使ってみてください。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿