LSTM (RNN)による文章生成で必要なSentencePieceのインストール

LSTM (RNN)による文章生成で必要なSentencePieceのインストール データ分析

「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.62016年12月23日2021年12月
3.72018年6月27日2023年6月
3.82019年10月14日2024年10月
3.92020年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の動作確認を説明しました。

タイトルとURLをコピーしました