SentencePiece とは
日本語のようなスペースで単語が区切られていない言語にも対応したトークナイザー。
文章を単語のようなトークンに分割してくれる。
動かしてみた
追記:作者の taku910 さんからのコメントにもありますが、この実験で設定した語彙数256000は大きすぎるそうです。コメント部分に適切な語彙数での実験結果もありますので合わせて御覧ください。
過去に集めた1000万ほどの Twitter のつぶやきで学習。(ただし、当初集めた目的の関係で短い文章ばかりです。)
- vocab_size: 256000
- model_type: unigram
echo "私たちの考えや感情は心の中にあって、それは心の中の言葉を使って表されることも多いけれども、本来言葉・音・視覚その他の 五感のどれでも無い、なにかもやもやとしたかたまりだとおもう。言葉はその表現でしかない。 " | spm_encode --model=twitter.model —output_format=piece
▁私たちの 考え や 感情 は 心の中に あって 、 それは 心の中 の言葉を使っ て 表される ことも多い けれども 、 本来 言葉 ・ 音 ・ 視覚 その他の 五 感 のど れ でも無い 、 なにか もやもや とした かたまり だとおもう 。 言葉は その表現 でしかない 。
単語に分けるというタスクとみなすと、 Mecab には流石に勝てない?
ただ、短い文章ばかりで学習したことが性能を悪くしている気がします。
いろいろ分解した
スペースは ▁ に置き換えられます。
- ▁スーパー / お腹痛くて / 松屋 / に駆け込 / んだ / 。 / ありがとう / 松屋 / 。
- ▁最近 / 知り合った / 人 / の影響か / 、 / ふと / 映画 / を観 / たくなる / 。
- ▁Ke / ras / ▁ / で / 超簡単 / ▁Se / q / 2 / Se / q / ▁ / の学習 / を / してみる
- ▁生 / ドレッシング / なるもの / 、 / 美味しい / 。 / 家の近くの / フランス料理 / 屋さん / で使われてる / やつ / と同じだ / 。 / きっと / 。
- ▁なんだか / よ / くんから / ないけど / 、 / 燃え尽き / 状態だ / 。
- ▁調子乗って / ランジ / 系の / 1 / 級 / を / 打ち込んで / いたら / できて / しまい / 、 / ペ / キ / ペ / キ / で / の初 / 1 / 級 / 頂きました / 。
- ▁本日の / ペ / キ / ペ / キは / 強い人 / オンパレード / だった / 。 / 1 / 球 / 打ってる / 人が / 4,5 / 人いて / 、 / たぶん / 撃たれ / ている / 級 / の平均 / が / 2 / 球 / くらい / 。
- ▁しかし / 夕方に / 会議が / 入っているので / 一瞬 / 出社 / する
- ▁ピンポン / の音 / に驚いた / ら / さ / たん / 、 / 一直線 / に / ベランダ / の / 方面に / 飛んで / いき / 、 / 窓ガラス / に / 正面 / 衝突 / 。 / ゴン / って音が / 。
- ▁鳥は / びっくりする / と / 明るい / 方 / に逃げる / という / 習 / 性 / そのまま / に / 行動 / しました / 。
- ▁レース / カーテン閉め / とかないとね / 。
- ▁今日も今日とて / 滑り / ました / 。 / 標高 / 2000 / m / の / 、 / 色 / や / 形の / 見え / 方 / 、 / やはり / 違う / 。 / とても / くっきり / とした / 世界 / 。
はまったところ
p2 インスタンスへの TensorFlow 導入 で作った Ubuntu 環境に追加でインストールしました。
共有ライブラリ
基本的に https://github.com/google/sentencepiece の指示に従って進めればインストールできました。
が、最後 spm_train を実行すると以下のようなエラーが出ました。
spm_train: error while loading shared libraries: libsentencepiece.so.0: cannot open shared object file: No such file or directory
こちら、 libsentencepiece.so.0 は /usr/local/lib/ 配下にちゃんとあるようです。
また、 /etc/ld.so.conf をみた感じ /usr/local/lib もちゃんと読み込まれる設定になっているようです。
調べた結果これは共有ライブラリの読み込みのキャッシュが古くなっていたのが原因なようで
sudo ldconfig
こちらで解決しました。
メモリ不足
spm_train はどうやらファイルの内容を全てメモリ上にロードするようです。
その為 input のファイルサイズがメモリより大きいと死にます。
メモリの大きなインスタンスを使うなりしましょう。
ちなみにマルチ vCPU のインスタンスを使った場合、それらをフルに使ってくれるみたいです。すばらしい。
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1781 ubuntu 20 0 9467968 7.973g 5436 S 798.3 25.4 8:52.91 spm_train
所感
今回使った Twitter のデータや学習設定ではそこまでおおっという結果にはなりませんでした。
他の model_type での実験などしたり、長文を食わせたりなどするとまたかわるかもしれません。