機械学習のfastTextをCentOS7環境のPython3を使って20万件の文章分類を実施してみる(mecabを利用)

今回は自然言語解析をfastTextを使って実施してみます。

fastTextはfacebookが公開している自然言語処理用のライブラリで、単語のベクトル化と文章分類を実施します。

ソースコードはこちらになります。
https://github.com/facebookresearch/fastText

fastTextの利用方法は二つあり、「単語表現学習(Word representation learning)」と「文章分類(Text classification)」です。

 

単語表現学習(Word representation learning)では、単語をひたすら学習させて、似ている単語などを抽出します。

この単語に近いものや、(「国王」-「男」+「女」= ?)といったアナロジー分析も実施できます。

単語自体の間違いなどの発見などにも利用できます。

UTF-8でエンコードされた文章を「skipgram」で学習させます。

 

文章分類(Text classification)では分類された文章を学習させます。

文章がどのカテゴリに属するかや、タグの設定、感情分析などで利用されます。

「__label__」のプレフィックスをつけた分類で文章を、「supervised」で学習させます。

 

どちらも学習時や文章の判定などでは「分かち書きした文章」が必要になります。

そこで今回はmecabのインストールを行い、mecab-ipadic-NEologd辞書を利用してみます。

尚、環境はCentOS7で構築しています。

 

mecabとmecab-ipadic-NEologdのインストール

インストールについての詳細は以前の記事にあります。

・CentOS7のPython3でMeCabのmecab-ipadic-neologdのインストールと利用
https://developer-collaboration.com/2019/01/30/centos7-python3-mecab-ipadic-neologd/

まず、mecabのインストールを行います。

pythonのライブラリも一緒に入れてしまいます。

 

続いて、mecab-ipadic-NEologdをインストールします。

上記でインストール完了です。

 

mecabの標準辞書を変更したい場合は「/etc/mecabrc」に辞書のパスを設定します。

 

 

fastTextのインストール

続いてfastTextのインストールを行います。

無事インストールできているのが確認できました。

 

また、pythonのライブラリもこのタイミングでインストールします。

こちらで利用環境が整いました。

ソースからpythonのライブラリをインストールしているので、コマンドラインで作成したモデルを利用することができます。

 

文章分類(Text classification)での分類のテスト

fastTextで分類を行うために文章の教師データの作成を行う必要があります。

今回は「livedoorグルメDataSets」を使ってモデルの作成を行います。

・livedoorグルメDataSets
http://blog.livedoor.jp/techblog/archives/65836960.html

 

ここで以下のプログラムで前処理をしつつデータセットの作成を行いました。

前処理はこちらを参考にさせていただきました。

・形態素解析前の日本語文書の前処理 (Python):け日記
https://ohke.hateblo.jp/entry/2019/02/09/141500

 

できた学習用のファイルはこんな形です。

 

データは「205,833」件ほどあります。

さて、学習用のファイルを「input.txt」として保存します。

 

モデルの作成とテスト

準備が整いましたのでモデルの作成とテストを行います。

文章分類(Text classification)のモデルの作成は「fasttext supervised」コマンドで行いますが、分類されたモデルファイルで、元の文章がどの程度一致するかの適合率、再現率という値が重要になります。

まず、モデルファイルを作成してみます。

 

こちらでテストを行い、適合率、再現率を確認してみます。

値としては以下の意味になります。

  • P@1は適合率(fastText により予測されたラベル内で正しいラベルの数)
  • R@1は再現率(実際のラベルの中で、成功的に予測されたラベルの数)

 

以下のサイトにもありますように適合率と再現率が高いほど良いモデルと言えます。

・fastText : Tutorials: テキスト分類:PyTorch
http://torch.classcat.com/2018/07/06/fasttext-tutorials-text-classification/

現状、0.6を下回っていてあまり良いモデルとは言えないのでエポックを増やしてモデルの作成とテストを再度行います。

適合率、再現率は向上しています。

さらにエポックを増やしてモデルの作成とテストを再度行います。

 

実際にはコマンドでかかっている時間もあるのでまとめます。

エポック 適合率、再現率 モデル作成時間
20 0.599 10分11秒
200 0.765 1時間36分1秒
2000 0.91 16時間4分5秒

 

上記のようにエポックの数を大きくするとモデルの作成に非常に大きな時間がかかっています。

この辺りを調整しながらモデルの作成を実施する必要があります。

尚、コマンドのオプションなどはこちらが参考になります。

・fastTextの実装を見てみた
https://www.slideshare.net/shirakiya/fasttext-71760059

 

テキスト分類

さて、このモデルを使用して評価を実施します。

評価で使用したプログラムは以下になります。

 

ここで実際にコメントを入れて評価をするのですが、元のサービスが点数をつける形ではないので、有名な食べログさんのコメントと点数で試してみます。

なんとなく評価がかなり違いそうですが。

最初の文章はこちら。

大好きな鰻やさんです。

美味しい鰻やさんが 奈良の方にあると教えてもらって
お邪魔しました。

この鰻やさんにお邪魔するために 初めて富雄駅に降りました。

人気店とお伺いしてたので、1時に予約してお邪魔したんですが、ほぼ満席状態でした。

カウンター席に案内されて、鰻重と肝焼きを注文。

鰻重は1尾入って2500円です。
肝焼きは2串で 800円やったかな

鰻1尾で この値段は 驚きです!

まずは肝焼きが来ました。
めっちゃ香ばしくて美味しい〜!

それから しばらくして 鰻重が到着!

このお店のご飯は 一手間かけてます。

まずは丼にご飯とタレを絡ませてきれいに混ざってから お重に そのご飯を装い直してくれます。空気ぐ含まれるので、ご飯は ふわっとしていてタレが染み込んで めちゃくちゃ 美味しいです!

まさに無限スパイラルです。
そこに のせられた 香ばしく焼き上げた鰻は 本当に お箸が止まりません!

このお店の山椒が また鰻にあう!
今日も 美味しいご馳走をありがとうございました!

点数は「4.0」でした。

さて、試してみると。

より「5」のラベルに近い数値が出ました。

 

次です。

まず、ここはデートではいけません。笑
アル中に近い呑んべい女子、以外は立ち寄れません。

いつ行っても、おっさん、男だからです!
女子トイレってあるのか?笑

DISってるわけではないです(笑)
ここの魅力だからです。

野郎だらけの徹マンの前に寄ったり
飲み会の朝帰りに寄ったり
用途は様々。安いですしね。

1品300円ちょい。
マクドナルド感覚で寄れちゃう居酒屋さん。
これからも利用させて頂きますね〜

点数は「2.3」でした。

さて、試してみると。

4よりの「3」のラベルの数値になっております。

 

さて最後に。

土曜日のお昼時に来店。
運良くお客さんが帰るタイミングだったのか、6.7人並んでいましたが、それほど待たずに
席につくことができました。

ただ、入り口のなんとも言えない席でしたが。笑
できれば奥がよかった。

ランチメニューをみて、彼女はヘルシープレート?的な奴を
私はグリーンカレーと辛いヌードルの奴を。

待っている間に周りを見渡すと、女子会ばかり。。
男同士では、まず入れないですね。

ちょっと待っていると到着。
彼女のも私のも構成は似ていて、
メインがあって、パクチーのサラダがある感じ。
私は、パクチー好きなので、とてもいい感じ♪
彼女は嫌いなので、ちょっといやそうでしたね笑
よくパクチー嫌いなのにタイ料理好きと言えるなと思う笑

私のグリーンカレーはそこそこの辛さ。
味はシンプルで美味しいです。
もう少し辛くてもいいかも。
グリーンカレーがそれほどでもなかったので、
トムヤムクンのヌードルは完全に油断しましたが、
なかなかの辛さ。というか結構辛いです。
苦手な方は注意が必要。

とは言え、具沢山でプレートの上に様々メニューが乗っているので、
最後まで楽しめます。
もう少し安ければ、普段から行きたいですね〜〜

点数は「3.8」です。

さて、試してみると。

4よりの「3」のラベルの数値でした。

まぁなんとなくそれっぽい数値が出るようなので検証は実施できたということで。

ある程度の前処理とテストでより精度の高いモデルと使ったデータの検証ができそうです。