いつのことだったか覚えていませんが、MeCabよりもSentencePieceを使うべきだというツイートを見かけてから、サブワードのことが気になっていたんですが、、、
ん?サプワードって何だろう?^^;
そもそもSentencePieceって何?(@_@;)
、、、、、、、(^_^;)
と、いうことでSentencePieceとサブワードについて調べてみました。
SentencePieceとは?
SentencePieceとはいったいなんでしょう?
SentencePieceとはざっくり言えばテキストを単語に分割してくれるトークナイザです。
自然言語処理をするにはテキストを単語に分割する必要がありますが、今までだとN-gramを使って単語に分割したり、MeCabを使ってテキストを形態素解析して形態素に分割してきたと思います。そこに新しい選択肢として登場したのがSentencePieceになります。
SentencePieceは与えられた学習データ(テキスト)から教師なし学習で文字列に分割するためのモデルを生成します。大規模なテキストデータを短時間で学習することが可能で、形態素解析に比べて扱う語彙数を遥かに小さくすることができます。
SentencePieceを使うと扱う語彙数を小さくすることができるのでニューラルネットワークへの入力の次元も小さくすることができ、形態素解析を使うよりも学習時間が短くなるというメリットが生まれます。
ただ、開発者の方によると、MeCabやKyTeaとは趣旨や目的が異なる単語分割ソフトウェアだそうです。
使用用途は限られているみたいでテキストの意味を全く考慮せずに単語に分割するSentencePieceは通常の形態素が必要な場合には役に立たないと思ったほうがいいようです。
では、どういう場面でSentencePieceが役に立つのでしょうか?
SentencePieceを使うとあるテキストの中で頻繁に使われる言い回しはひとつの単位として認識されるみたいで、これがあるタスクのドメインに適した分割が期待できるみたい。
また、対話や翻訳といったSeq2seq用にテキストを適当な単位に分割をすることができ、MeCabを使用したときと比べてSentencePieceのほうが対話や翻訳タスクにおいて性能が高くなることが多いようです。
サブワードとは?
サブワードというのはテキストの中で低頻度で現れる単語は文字や部分文字列に分解しちゃおうという考え方です。サブワードは事前に単語単位に分解して各単語の頻度を求めます。高頻度で現れる単語はひとつの単語として扱い、低頻度で現れる単語はより短い単位に分解していきます。最終的には単語の数は事前に設定されたサイズになるように分割を進めていきます。
サブワードを使うメリットとしては未知語がなくなるという点が挙げられます。なぜなら、低頻度で現れる単語は最終的には文字に変換されてしまうからです。
形態素解析だと辞書に登録されていない単語は未知語になってしまいますが、サブワードだとそうはなりません。しかし、サブワードは単語の意味を考慮した分解はしないので、この点がサブワードのデメリットと言えるかもしれません。
SentencePieceとサブワード
SentencePieceとサブワードについて書いてきましたが、結局SentencePieceとサブワードとはどういう関係なのでしょうか?
結論をいうと、サブワードの考え方を少し変えて作られたのがSentencePieceになります。
サブワードは単語を文字や部分文字列に分解します。英語のような単語が空白で区切られている言語はテキストから単語を抽出するのは容易ですが、日本語の場合だとどうでしょうか?
日本語を単語に分解するには形態素解析する必要がありますよね。
この形態素解析の手間を省くために作られたのがSentencePieceです。
SentencePieceはサブワードと異なり単語から文字や部分文字列に分割するのではなく、テキストから文字や部分文字列に分解していき学習モデルを構築します。
つまり、次のように考えればいいと思います。
サブワード 単語 ⇛ 文字、部分文字列
SentencePiece テキスト⇛ 文字、部分文字列
まとめ
ここまで、SentencePieceとサブワードについてダラダラ書いてきましたが、まとめると以下のようになると思います。
- サブワードの考え方を少し変えたのがSentencePiece
- SentencePieceはテキストから文字や部分文字列に分解する。
- SentencePieceを使うと未知語がなくなり、語彙数を小さくすることができる。
参考記事 - Sentencepiece : ニューラル言語処理向けトークナイザ