機械学習はじめに前回の記事ではpytorchのサンプルコードを参考にし、Wikipediaの記事の一部に対してRNN言語モデルを学習させてみました。neologd辞書を使用していました。今日も窓辺でプログラム最近出てきた文章を単語分割する手法に、wordpiecesと呼ばれている技術があります。その実装であるSentencePieceがGoogleから公開されています。技術的な解説などは、SentencePieceの開発者の方(MeCabの開発者でもあります)が公開しているQiitaの記事で詳しく説明されているので、ぜひ読んでみてください。QiitaSentencePieceを使用すると、少し長い文字列でも出現頻度が高ければ1つの単語IDが割り当てられるようです。逆に、人間から見ると一つの単語でも、その単語の出現頻度が低い場合は単語をさらに分割した小さい単位に対して単語IDを割り当てていきます。この記事では、前回学習したRNN言語モデルの単語分割部分をMeCabからSentencePieceに置き換えるとどのような結果になるか試してみたいと思います。Notebookを公開しています。前回と共通のコードも多く記事中ではすべてを紹介していないので、必要に応じて参照してください。github.comSentencePieceのインストールGitHubで公開されているReadMeに沿ってコマンドをたたくだけでインストールは完了です。Pythonバインディングも公開されていて、こちらに関してはpipで一発インストールできます。sentencepieceWikipediaの一部記事を切り出す前回までは、MeCabで分かち書きした状態のものをテキストファイルとして保存していたのですが、SentencePieceの学習には分かち書きされていない生テキストが必要です。3k文を学習用、検証用、テスト用に取り出します。前回までの記事ではこのwiki_sentences()というジェネレータは1文ではなく1行(改行区切り)を返すようになっていましたが、今回は改行と"。"で区切った文を返すように変更を加えました。学習はコマンド1回で終わります。--vocab_size=8000今回はWikipediaから持ってきた24000文を、語彙数8000に落とし込むことにしました。32000あたりの語彙数がよくつかわれるようです)どのように分割されたか見てみるSentencePieceでトレーニングデータがどのように分割されたか見てみましょう。