NLP を学ぶ - 2

はじめに

NLP関連の機械学習の勉強を進める。
今回はNLP関連に利用するpython ライブラリを調査する。
今後NLP関連の実装を進める上で有用そうなものを今のうちに知っておきたい。

NLPの処理段階とライブラリ

機械学習は以下のようにいくつかの段階に分かれている。

  1. 前処理
  2. データ解析
  3. 学習・評価
  4. (解析・可視化)

それぞれの段階ごとに利用できそうなライブラリをまとめる。
標準ライブラリやnumpy, pandasなどはどこでも使うので省力する。
(今回は解析・可視化ライブラリは調査していないが可視化については2.データ解析と重複していると思われる。)

前処理

画像系とNLP系の機械学習における大きな違いはおそらくこの前処理部分であろう。
NLPの場合目的に応じて前処理が大きく異なる可能性がある。
(日本語の場合は文章を単語単位に分割する必要がある場合も多い)
誤字をそのまま使うか、頻出する単語を削除するかなどは問題に依存する。

また、文章は本来数値ではないため数値として取り扱うためのアプローチが必要となる。
1. 文章を文字のsequenceと捉え、 文字単位でベクトルに変換する(character embedding)。
2. 文章を単語のsequenceと捉え、 単語単位でベクトルに変換する(word embedding)
3. 文章をそのままベクトルに変換する

これらの処理をサポートするためにNLP関連のライブラリはある。 今回は以下の3つのライブラリについて調査した。
- nltk
- gensim
- spacy

NLTK

https://www.nltk.org/
いくつかのコーパスを含むNLPライブラリ。
基本的にはコーパスを作り、そこでのデータ解析を行う。
コーパスを構築した後
- sentenceのtokenize
- 類似単語検索
- 品詞タグ付け
- 係り受け解析
- コーパスの統計量計算(lexical_diversity等)
を行うためのAPIが用意されている。

Deep Learningの前処理に使うだけなら少し使いづらそう。
NLPの基礎を学ぶのには良さそう。

gensim

https://radimrehurek.com/gensim/ gensimは意味解析に重点をおいたNLPライブラリである。
以前少し使ったことがあったが、word embeddingはやりやすかった印象がある。
- word dictionaryの構築
- tf-idfやLDAによるsentence embedding
- word2vecなどのword embedding
などは比較的楽に行える。

spaCy

https://spacy.io/
HPのトップには "Industrial-Strength Natural Language Processing" と記載されており、産業利用を重視しているようだ。
パイプライン処理などが行いやすい。
処理を行うためには対応する言語モデルが必要。
フレームワークとして利用している日本語ライブラリもある1

データ解析

データ解析は目的に応じてデータの特性を理解する作業である。
初めてデータに触れるときはEDA(Exploratory data analysis)によって データセットの統計量などを可視化することが多い。 自然言語処理における EDAについてはそれほど詳しくないがデータセット全体の語彙数や 文章内の単語数の統計量と目標変数との関係を可視化することなどが考えられる。

jupyter notebook, jupyter lab

jupyterはインタラクティブpythonのコードを実行する環境である。
ローカルでサーバーを立ち上げてwebブラウザからアクセスする。
notebookは標準とその発展形である jupyterlabがある。
nbextensions, labextensionsなどの便利な拡張機能も存在する。
KaggleのKernelやGoogle Colabなど類似のWebサービスも多い。

matplotlib

pythonでグラフなどを可視化するためのライブラリ。
散布図、ヒストグラムなど基本的な可視化は一通り揃っている。

seaborn

matplotlibを基本にしてより簡単に(かっこよく?)可視化を行うためのライブラリ。
pandas のデータフレーム形式でデータを与えると楽に可視化できるが、
細かい調整をするためには覚えることが多い。

学習・評価

Deep Learningモデルの学習に必要なライブラリは他の分野と大差ないと思う。

tensorflow

googleが提供しているDLライブラリ。
1.系と2.系があるが1.系では学習のためのグラフ構築の関係でデバグがやりにくかった。
(2.系ではDefine by Runに移行して楽になったらしいが追えていないため使い勝手は分からない)

pytorch

facebookが提供しているDLライブラリ。
Define by Runであるためデバグがしやすい。
最近は主にこれを利用している。

まとめ

NLP関連の処理を中心にpythonライブラリをまとめた。
当面はDeep LearningによるNLPの検証をしようと思うので、
gensimかspacyを使いこなせるようになりたい。

参考文献