こんにちは。今日は、自然言語に関する話題です。
自然言語処理はあまりこれまで触れてきておらず、RDBに蓄積されたテーブルデータの分析・機械学習モデリングがメインだったのですが、最近テキスト文から説明変数を抽出できたら良いな〜と思うことがあり、週末Workとして、やってみることにしました。
例えば、文章ではないですが商品の名前から商品種類をカテゴライズして、「そのカテゴリの商品の取扱いがあるか」といった変数に含めることはできないかな〜といったことを考えています。
記載内容について正しくない部分があれば遠慮なくご指摘いただけると勉強になります。
それでは早速触ってみます。
Contents
学習のステップ
いくつかのWebサイトを調べて、このようなタスクは以下の手順で進めていくことがわかりました。
1、形態素解析で文章・テキストを単語へ分割
2、テキスト情報のベクトル化(定量化)
3、ベクトル化したテキストを分類
形態素解析とは?
文章を形態素(単語が意味を持つ最小の単位)に分解する処理です。
例えば、「すもも も もも も もものうち」という文章に対しては、「すもも」「も」「もも」「も」「もものうち」と出力するような処理になります。
これを実施しておくことで、後にカテゴライズする際に、単語ごとの類似度を計算することができるようになるのです。
いったい何が行われるとこのような分類ができるようになるのでしょうか。詳しい解説はまた時間をとりたいと思いますが、はじめに分類対象の文章に含まれる単語を事前に読み込んだ「辞書」なる単語セットの中から探して「ラティス」と呼ばれる、考えられる単語の組み合わせのパターンを構築するようです。このラティスに対して、「もっとも確からしい」単語のパスを探して最終的な出力としているようです。
まだこれだけでは突っ込んで調べたいところがいくつもありますが、要するに「辞書を元にもっとも確からしい単語の組み合わせを計算して探す」ということは理解できました。
それではこれを早速Pythonで実装してみます。日本語の形態素解析ができるパッケージとして、PythonにはMeCab(メカブ)というライブラリが用意されているようで、かなりポピュラーなようなので今回はこちらを利用します。
ちなみに、このMeCabは、2006年にリリースされたオープンソースの“日本語の”形態素解析エンジンになります。前述の通り、辞書と独立しているため、用途に合わせた様々な辞書と組み合わせて、日本語の形態素解析でもっともよく使われているライブラリです。
気になった記述があれば、まずはGoogle Trendで人気傾向をみてみるのが最近のクセなので笑、みてみました。登場した2006年以降、一旦盛り上がりを見せた後に一度収束し、最近はまた少し検索されているようです。
MeCabのインストール
私は普段Jupyter Notebookを利用しているので、今回もJupyter上でMeCabを使えるようにしていきたいと思います。MeCabは、以下からインストールできるようです。
*他の方のブログにありましたが、Anacondaからは直接MeCabのインストールはできず、Pip経由とのことです。
$ pip install mecab-python3
その後、JupyterでMeCabをインポートしてみると、無事通りました!
辞書のインストール
次は、MeCabで扱う辞書をインストールします。と思ったのですが、どうやら、mecab-python3のインストール時に、mecab-ipadicという辞書が同時インストールされているようですので、今回はまずはそちらを利用してみようと思います。
ちなみに、日本語辞書で現在もっともよく利用されている(?)ようなのは、mecab-ipadicの拡張版である、mecab-ipadic-NEologdのようです。
この辞書は、ipdicを、さらに最近の新語や造語も正しく表現できるように拡張した辞書で、定期的にWeb上に登場する最新の新語を収集して拡張され続けているようです。
辞書の作者の方がこちらで辞書の概要を説明されています。
調べてみたのですが、こちらはpipなどから一行でインストール、というわけには行かず、Githubから辞書をダウンロードしてきてインストールする必要がありそうです。
こちら必須容量が1.5GBほどとそれなりのサイズがあり、私が業務で利用するオフライン環境への持ち込みは色々な制約で容易ではなさそうなので、mecab-ipadicでどこまでできそうかみていければと思います。
文字表現の正規化ツール「NEologdn」のインストール
ここで、文字表現の前処理に使える「NEologdn」というツールもインストールしておきます。
これは、例えば「おいし〜〜〜〜い」を「おいしい」に補正したり、「取扱い」を「取り扱い」に統一してくれたりと、テキスト間での表記ゆれをなくすための前処理を実施してくれるツールらしいのです。
先ほどと同様、pipコマンド一行でインストールできてしまうようです!
pip install neologdn
こちらもインストール完了後、Jupyter上でImportしてみると、無事通りました!
MeCab + ipadicで形態素解析をしてみる
それでは早速MeCabを使って形態素解析を実施してみます。どきどき。
MeCabで辞書を指定するには、
t = MeCab.Tagger("辞書のPATH")
と打てば良いです。何も指定しないと、デフォルトの辞書(ipa-dic)が読み込まれます。
Taggerに
・・・おおおおおお!!!できた!!こんなタスクをコード1行でやってくれるなんて・・・ちょっとした感動である。
さて、これでテキストを自動的に単語に分解することができる様になりましたので、次は、単語情報を、定量的に扱うための前処理を進めていきます、
形態素解析した単語情報の定量化方法を知る
形態素解析した単語情報の定量化にもいくつかの方法があるようで、大きく分けると、以下の3つに大別されるようです。
- 文書中の単語の出現頻度を数えるカウントベースの手法
- 単語の分散表現ベースの手法
- 単語の埋め込み表現ベースの手法
それぞれについて簡単に概要を押さえてみます。
カウントベースの手法
BagOfWords:テキスト文書を、単語の出現回数でベクトル化したもの。他のベクトル化手法と比較するとシンプルだが、単語の前後関係の情報がなくなるデメリットがある。
TF−IDF:特徴量スケーリング手法の一つ。TFとIDFの2つの処理の総称。TFは、BOWでカウントしていた出現回数を頻度に正規化したもの。IDFは逆文書頻度と呼ばれ、ある単語がどれだけ意味をもたらすかを表す。多くのテキストに登場する単語の影響は弱くなり、ごく一部の文書に登場する単語の影響を強くする。
Word2Vec:WordEmbedding手法で大量のテキストデータを解析し、各単語の意味をベクトル化するもの。単語をベクトルすることで、意味の近さを定量的に計算できたり、単語の意味の足し算引き算ができる様になります。
PythonではGemsimというライブラリを用いることで簡単に実装できるようです。
Doc2Vec:任意の長さの文書をベクトル化する技術。Word2Vecと具体的にどう違うのかな・・(今後調査)こちらもGemsimで実装されているようです。
順番に実装を試していきます。
TF-IDF
TF-IDFは、Scikit-Learnや、Gensim上で実装されているようです。今回はScikit-Learn上のものを使ってみます。
MeCab以外にも、様々な形態素解析ライブラリが公開されているようです。ざっと、色々なサイトの解説を流し読みした感じ、以下のようなものがあることが分かりました。
・Sudachi:
・Nagisa: