自然言語処理における、前処理のポータビリティを向上させる

piqcy
chakki
Published in
4 min readFeb 22, 2019

皆さん前処理してますか?どの分野の機械学習でも前処理は重要ですが、自然言語処理は元のデータが数値でないこともあり、処理ステップが多くなりがちです(テキスト=>単語=>単語ID)。また、処理の一貫性を保つには実装コードだけでなくパラメーター(ストップワードなど)も管理する必要があったりします。

Photo by Ramnath Bhat

端的には、自然言語処理では前処理のポータビリティを保つのが難しいです。そこで、それを実現するツールを開発しました(Star頂けたら幸いです!)。

自然言語処理の前処理ツールchariotの機能

chariotでは、以下3点をできるようにしました。

  • 前処理を宣言的に定義できる
  • 前処理が簡単に保存できる(パラメーターごと)
  • モデルの学習にたどり着くまでの時間を短くする

chariotでは、以下のように「前処理」を「積んでいく」形で前処理プロセスを定義できます。

stackされている各前処理はscikit-learnのTransformerをベースにしており、パラメーターごと保存が可能です。なので、保存したpklファイルさえあれば前処理を動かすことができます(ただMeCabの辞書とかまではさすがに無理なので、完全担保の場合はDocker上で走らせたりする必要があります)。

対象がデータセットで、複数のカラムを持つ場合は以下のように定義が可能です。

各カラムごとに前処理を定義できる感じです。もちろん、各カラムの前処理パイプラインは丸ごと保存が可能です(複数のpklファイルになるのでtar.gzで固めています)。

なお、PaddingやCategoricalLabelにするのは学習の直前だけでいいので、前処理の実行( preprocess)には含まれません。これらの処理は、以下で紹介するように学習時に自動的にかかります。または、format で明示的に行うこともできます。

さて、前処理する目的はモデルの学習なので、モデルの学習までノンストップで行きたいところです。chariotを使うと、以下のようにノンストップで学習が可能です。

train_datapreprocess して iterate して学習する、という感じです。

実際の使用感については、Jupyter Notebookを見て頂ければと思います。

クラス分類の例

言語モデルの例

Graph Convolutionの記事を書いているときからちょくちょくブラッシュアップしていたのですが、大体大丈夫かなとなったのでお披露目となりました。

今後もいろいろな検証を行っていく中でブラッシュアップを行っていく予定です。よろしければ、使ってみて頂きご意見が伺えれば幸いです!

--

--

piqcy
chakki
Editor for

All change is not growth, as all movement is not forward. Ellen Glasgow