SentencePieceを使ってみた。ColaboratoryAlphaZero自然言語処理ライブラリtkintertweepyabout2020-02-03SentencePieceを使ってみた。NLPHatebuTwitterPocket以前、SentencePieceについて記事を書きましたが、www.pytry3g.com今回は実際にSentencePieceを使ってWikipediaのデータから単語分割モデルを作ってみたいと思います。この記事を見ればできるようになること。Colaboratoryで使って作業を進めていきます。Colabratoryって何?って方は下の記事を参考にしてください。Driveにあるファイルを読み込めように以下を実行します。Colaboratoryを開き、セルに上記を入力して実行してください。次に、現在開いているNotebookがあるフォルダに移動します。Notebooks"私はNotebookがあるフォルダにWikipediaからダウンロードしたデータとSentencePieceから作る単語分割モデルを置くことにします。(※ここは各自のお好みで。)SentencePieceのインストール。/dev/nullBeautifulSoupを使ってWikipediaのデータをダウンロードします。今回は戦国武将の記事をいくつかダウンロードしました。BeautifulSoupを使ってWikipediaのテキストを抽出する上記のプログラムを実行するとwiki.txtに改行区切りでデータが書き込まれます。モデルの学習データの用意ができたので、単語分割モデルの学習をしていきます。単語分割モデルの学習はライブラリのインポートをして、sentencepiece.SentencePieceTrainer.Train()で必要な設定をするだけでできます。正規化や前処理などは必要ありません。学習が完了すれば、--model_prefixで指定した名前がついたモデル名.modelとモデル名.vocabが生成されます。--pad_id=3')学習の際に設定するパラメータは以下になります。--input学習データが入ったファイル(ひとつの文が1行になっている)--model_prefixモデル名、モデル名.modelとモデル名.vocabが生成される。--vocab_size語彙数(SentencePieceの開発者の方によると、翻訳の場合は小規模データなら数千から10k程度、超大規模でも32k程度で高い精度が得られるとのこと。)--character_coverageモデルがカバーする文字の量、日本語の場合は0.9995にするのが推奨されている。--model_typeデフォルトではunigram、他にはbpe、char、wordがある。wordのときは予めテキストを単語に分割する必要がある。今回は--pad_id=3に設定しています。言語モデルやSeq2seqを学習する際に入力データの長さを揃えるために使われるpadを今回単語分割モデルの単語リストに入れました。SentencePieceでは他に区切り文字として使われる<s>や</s>がデフォルトで単語分割モデルに組み込まれています。spm.SentencePieceProcessor()sp.Load("sentencepiece.model")このようにします。SentencePieceは作成した単語分割モデルからテキストを単語ID列に変換したり、単語ID列からテキストに変換などができます。らが共謀して信長に敵対した。らが共謀して信長に敵対した。']print(sp.DecodePieces(tokens))#松永久秀らが共謀して秀吉に敵対した。らが共謀して信長に敵対した。(語彙数)print(sp.GetPieceSize())#8000#len(sp)でも語彙数が取得できる。(単語IDの取得)print(sp.PieceToId('</s>'))#sp['</s>']でも単語IDが取得できる。"""単語(文字)に分割できた。"""圭佑の佑が今回単語分割モデルの学習に使ったデータに含まれていなかったので、未知語<unk>に変換されました。MeCabを使うとMeCabを使って今回用意したWikipediaのデータを形態素解析すると、語彙数がどれくらいになるのか調べてみました。"今日はいい天気ですね。len(word2id)print(len(word2id))#11901結果は11901になりました。学習データが増えれば増えるほど語彙数もそれに伴い増えると思うので、語彙数を抑えることができるSentencePieceのほうが使い勝手が良さそうです。エラーが出るとき私がSentencePieceを使っていて2つエラーが出たのでその時の対処法を残しておきます。--vocab_size=500')単語分割モデルを作成するために上記のプログラムを実行したら以下のようなエラーが出ました。option.エラーで書かれている内容をそのまんま実行するだけですね。1236とエラーの内容の中に書かれていたので、語彙数を1236以上に設定するだけで解決しました。--vocab_size=8000')語彙数を8000に設定したときに以下のようなエラーが出ました。(model_proto->pieces_size())]このようなエラーが出たときはsentencepiece.SentencePieceTrainer.Train()の設定で--hard_vocab_limit=falseを加えると解決しました。--hard_vocab_limit=false')おわりにSentencePieceを使ってみましたが、まだパラメータの設定やMeCabを使った形態素解析をした場合との違いについて完全に理解できたわけではないので、今後言語モデルやSeq2seqで使ってみて理解を深めていこうと思います。07:00SentencePieceを使ってみた。長年?PyTorchによる自然言語処理の実装方法がなんとなく分かっ...2018-09-06SCDVを使ったテキスト分類をしてみるWord2Vecの単語ベクトルから、いい感じな文書ベクトルが作れるS...2018-09-01日本語のテキストコーパスから辞書を作るライブラリを作りたい5前回書いた記事の続きです。はてなブログPropython、NLP、AI、強化学習、投資について興味があります。PyTorchを使ってテキスト分類をやってみるSentencePieceを使ってみた。(1)月別アーカイブ関連記事SentencePieceについて書いてみる。NLPを使って日本語の形態素解析をしてみるgensimを使ってWikipediaの全日本語記事からWord2Vecを作るPyTorchによるSeq2seqの実装PyTorchによる言語モデルの作り。