ナイーブベイズ分類器の学習のために作成したプログラム。 写経に近いかも
ナイーブベイズ分類器をpythonのパッケージskleanを利用して作成する。
- /CreateDataset --- 作成したcsvファイルを読み取りデータセットを作成するclass。
- /dataset(ignore) --- 学習用のデータセットと、テストのデータセットを入れておく。
- /Morphological --- データを読み取り形態素解析を行うclass。
- /result(ignore) --- classification_reportなどの実行結果ログを保存する場所
- /setting --- pipのrequire.txtを入れてある。バージョン管理用テキストファイル
- /word2vec_model(ignore) --- word2vecの学習済みモデルが格納されている
- .gitignore --- gitignoreファイル
- data_augment.py(現在動きません) --- googletransのデータ拡張用のファイル。
- naivebayse.py --- 実行のメインファイル。これを実行することでナイーブベイズが行われる。
- README.mb --- readmeファイル
- gitignoreしたもの
- /detaset
train用とtest用のcsvファイルとtrainを拡張したときに生成されるcsvファイル。
これは
文章 | 分類
が連続してなるcsvで文章をデータ、分類を答えとして学習を行うようになっている。
- result/result_report.xlsx
testdataをpredictしてどれだけの精度なのか確かめるためのエクセルファイル。
- /word2vec_model
word2vecのモデルが格納されているフォルダ
Pythonファイルのnaivebayse.pyがあるディレクトリで
python naivebayse,py
を実行することでプログラムが動作する。
- まずデータセットを呼び出す。
- 形態素解析を行う。(mecab-ipadic-NEologdを利用した)
- tfidf, Bag Of word, tfidfvectorの中から選択したもので数値に変換する。
- skleanのMultinomialNBにかける。
- predictを行って、結果からログをエクセル形式で作成する
ナイーブベイズ分類器に対してデータがあまりに少ないため。(項目による偏りもあるが今回は考慮しない。) データ拡張を行う必要があると判断した。 データの拡張方法は
- train用のデータに対してGoogletranseを用いて英語に変換を行う。
- 英語に訳した文章に対して日本語に再翻訳をかける。
- そのデータをtrainのデータに連結し、学習を行う。
この拡張方法は単純な文章には重複する分が生成される恐れがあるため、有用ではないが複雑な文章に対しては再翻訳をかけることで似たような文章だが違った単語などが出現し、汎化性が高まるのではないのかと考えられる。
しかし、GoogleTransはHTTP POSTでデータのやり取りを行うため、大量なデータを行う際にはディレイをかけて通信を連続的に行わないように気をつける必要がある。
※ この拡張方法は有用であると考えたが不要と言われたので現在使用することができない。気が向けば復活し、作成するかもしれないがおそらくデータセットが今年度でなくなるので作成することはおそらくない。
上気した通りデータ数が少ないため、データ拡張を行う。 こっちの方法はword2vecを利用して
- 一つの文章を形態素解析する。
- 形態素解析した結果の品詞一つをword2vecにかけ類似した単語(文や人の場合もある)を出力する。
- 類似した単語を連結し、データ拡張に追加。
- 学習を行う。
Mecabの単語辞書は初期に格納されているものでは形態素解析すると正しくできないものがある。 それは、芸能人などの固有名詞である。 これを形態素解析すると、臨んだような形態素解析にならない。
そこで、Mecabの辞書データを変更することにした。 芸能人もある程度抑えることができる、mecab-ipadic-NEologdを利用する。 これでMecabで対応できない形態素解析がある程度減少するはず
ナイーブベイズ分類器にかけた際に、accuracyがあまり上がらないという現象が発生した。 これはカテゴリーを分ける際に複数のカテゴリーをまたいでいるデータが多数あったため起きた問題だということがわかった。 そこで複数のカテゴリーにまたいだものはその中からどれか一つでも判別することができていた場合、accuracyに数値を与えることにする。
ただこの評価法は適切ではない部分があるため選択肢として与えることとした。
evoluationの数値変更で評価方法の変更が可能になった。
(まあ数値が低かったので救済的な部分が大きい。)
近似しているカテゴリーが存在している場合、この評価方法の変更によって近似している部分での誤判定か確認をすることができる。
- Python --- ver3.7.3
- MeCab --- ver0.996
- mecab-ipadic-NEologd --- 2019/12/17に辞書データをダウンロード
- windows10
- Windows Subsystem for Linux(Ubuntu)
- DISTRIB_ID=Ubuntu
- DISTRIB_RELEASE=18.04
- DISTRIB_CODENAME=bionic
- DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
過去のレポジトリの更新データをすべて移行し、ラベルのデータなどのあまり残っているとうれしくないデータを 削除した。
1.の記事をかなり参照しています.
- 【Python】自然言語処理で使われるTF-IDFと単純ベイズ分類器(Naive Bayes)について使いながら解説する - Qiita
- sklearn.metrics.classification_report — scikit-learn 0.21.3 documentation
- pythonによる日本語前処理備忘録 | ブログ一覧 | DATUM STUDIO株式会社
- 機械学習の勉強歴が半年の初心者が、 Kaggle で銅メダルを取得した話 | 株式会社トップゲート
- Python – googletransを試してみました。 | Developers.IO
- MeCab: Yet Another Part-of-Speech and Morphological Analyzer
- Word2Vec学習済モデルとgensimで「世界」-「知性」=を計算したら「日本」になった(笑) - "BOKU"のITな日常
- neologd/mecab-ipadic-neologd: Neologism dictionary based on the language resources on the Web for mecab-ipadic
- mecab-ipadic-NEologdをWindowsで使ってみる。 - どん底から這い上がるまでの記録
- 日本語 Wikipedia エンティティベクトル