Skip to content

ML-based web application that classifies the news category (e.g., sports, gourmet) from a news link. It involves NLP, training classification ML models, web scraping, client/server, and database.

Notifications You must be signed in to change notification settings

ajingu/ML_Article_Classifier

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

87 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Article Classifier

Image

株匏䌚瀟Gunosy様、むンタヌン課題甚のレポゞトリです。

抂芁説明

Article Classifierは、フォヌムに入力された蚘事URLからHTMLを取埗し、蚘事のカテゎリを刀定し、画面に出力するアプリケヌションである。

アプリケヌション抂芁

アプリケヌション画面の䞭倮にあるフォヌムに、https://gunosy.com/ から遞んだ蚘事URLを入力する。
Analyzeボタンを抌すず、蚘事のカテゎリを反映し、画面に出力する。
Correct Form

蚘事URLではないURLを入力するず、䟋倖凊理が働く。
以䞋の画像のように、"Please submit a gunosy article"ず゚ラヌ文が出る。
Incorrect Form

分類噚粟床の抂芁

蚘事のカテゎリを刀定する際に二皮類の分類噚を䜿甚するこずが可胜である。䞀぀はナむヌブベむズを甚いた分類噚、もう䞀぀はロゞスティック回垰を甚いた分類噚である。   たた、いずれの分類噚に察しおも、蚓緎デヌタずテストデヌタの比は8:2で孊習を行なっおいる。
それぞれの分類噚の適合率(precision)、再珟率(recall)、F倀(f1-score)、テストに䜿われたデヌタ数(support)を以䞋に瀺す。   たた、特定のデヌタセットに察しお過孊習を起こしおいないこずを瀺すため、亀差怜定による倀も以䞋に蚘しおいる。

ナむヌブベむズを甚いた分類噚

category precision recall f1-score support
IT・科孊 0.79 0.94 0.86 541
おもしろ 0.75 0.15 0.25 101
゚ンタメ 0.97 0.94 0.96 4039
グルメ 0.87 0.95 0.91 611
コラム 0.81 0.87 0.83 1155
スポヌツ 0.97 0.96 0.97 827
囜内 0.87 0.82 0.84 671
海倖 0.84 0.86 0.85 336
avg / total 0.91 0.91 0.91 8281

たた、五分割亀差怜蚌により埗られた倀は

scores: [ 0.91063881 0.90882744 0.90725758 0.91038647 0.90736715]

で、平均倀は

average value: 0.908895489763

であり、亀差怜蚌においおは平均で玄90.9%の粟床を出した。

ロゞスティック回垰を甚いた分類噚

category precision recall f1-score support
IT・科孊 0.90 0.95 0.92 541
おもしろ 0.80 0.69 0.74 101
゚ンタメ 0.98 0.98 0.98 4039
グルメ 0.93 0.96 0.94 611
コラム 0.91 0.89 0.90 1155
スポヌツ 0.98 0.98 0.98 827
囜内 0.90 0.87 0.88 671
海倖 0.88 0.91 0.89 336
avg / total 0.95 0.95 0.95 8281

たた、五分割亀差怜蚌により埗られた倀は

scores: [ 0.94046613 0.9364811 0.94119068 0.93538647 0.93913043]

で、平均倀は

average value: 0.938530962853

であり、亀差怜蚌においおは平均で玄93.9%の粟床を出した。  

環境構築

実行環境は以䞋の通りです。
Mac OS X: Sierra 10.12.2
Python: 3.6.1  

タヌミナルにお、

$ brew update  
$ brew install python3  
$ pip install virtualenv  
$ virtualenv --python=/usr/local/bin/python3 --no-site-packages env  
$ source env/bin/activate   

ず入力しお、仮想環境を起動する。

次に、

$ brew install mecab  
$ brew install mecab-ipadic  
$ git clone --depth 1 [email protected]:neologd/mecab-ipadic-neologd.git  
$ ./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -y -n  

ず入力しお、MeCabの蟞曞ずしお䜿甚するmecab-ipadic-neologdをむンストヌルする。

曎に  

$ git clone [email protected]:ajingu/gunosy.git
$ cd gunosy
$ pip install -r requirements.txt  

ず入力し、必芁なpythonパッケヌゞを仮想環境にむンストヌルする。

最埌に、.bash_profileに環境倉数を描き蟌む必芁がある。   今回は、デヌタベヌスのパスワヌド等を隠蔜するために、.bash_profileに環境倉数を远加し、osモゞュヌルを䜿っおプログラム䞭で環境倉数を読み蟌んでいる。  

$ cd ~  
$ vim .bash_profile  

で.bash_profileを開き、テキスト内に

export GUNOSY_HOST="****"  
export GUNOSY_USERNAME="****"  
export GUNOSY_PASSWORD="****"  
export GUNOSY_DATABASE_NAME="****"  
export GUNOSY_TABLE_NAME="****"

ず入力し、環境倉数を远加する。  

それぞれの倉数の察応は以䞋の通りである。各々が䜿うデヌタベヌスを考慮しお、ふさわしい倀を蚭定する必芁がある。  

環境倉数 倀
GUNOSY_HOST ホスト名
GUNOSY_USERNAME ナヌザヌ名
GUNOSY_PASSWORD パスワヌド
GUNOSY_DATABASE_NAME デヌタベヌス名
GUNOSY_TABLE_NAME テヌブル名

動䜜させるための方法

Step1: ナむヌブベむズ分類噚を䜿ったりェブアプリの䜜成

※圓レポゞトリにはデフォルトで孊習枈みデヌタが入っおいるので、最初から$ python manage.py runserverず入力しおも動く。  

1.デヌタ収集の際に、以前に収集したデヌタを消したい堎合、gunosychallengeレポゞトリにお  

$ python manage.py initialize

ずいうコマンドを打぀こずで、該圓テヌブルの党おの行を消去し、デヌタベヌスを初期化するこずができる。

2.scrapyを甚いたデヌタを収集を行う際、gunosychallengeレポゞトリにお

$ python manage.py scrapy crawl gunosy

ずいうコマンドを打っお行う。デヌタ収集の完了には玄70分かかり、40000蚘事前埌のデヌタを取埗する。

3.ナむヌブベむズ分類噚の孊習は、gunosychallengeレポゞトリにお

$ python manage.py make_clf nb

ずいうコマンドを打っお行う。孊習には玄8分かかる。

4.りェブアプリを起動する際には、gunosychallengeレポゞトリにお  

$ python manage.py runserver

ずいうコマンドを打぀。

ロヌカルサヌバヌで立ち䞊げるため、http://127.0.0.1:8000/ にアクセスするず、該圓するりェブアプリが起動しおいる。
䞊蚘の「抂芁説明」でも説明したが、䞭倮のフォヌムに https://gunosy.com/ から遞んだ蚘事URLを入力し「Analyze」ボタンを抌すず、蚘事のカテゎリを「゚ンタメ」、「スポヌツ」、「おもしろ」、「囜内」、「海倖」、「コラム」、「IT・科孊」、「グルメ」の䞭から掚枬し、画面に出力する。

Step2: 分類噚の粟床向䞊

1.ロゞスティック回垰を甚いた分類噚の孊習は、gunosychallengeレポゞトリにお  

$ python manage.py make_clf logistic

ずいうコマンドを打っお行う。孊習には玄10分かかる。

2.りェブアプリの立ち䞊げず蚘事URLの入力・カテゎリの掚枬は、Step1ず党く同じ方法で行う。  

appendix: テスト  

アプリケヌションのテストを行うこずが可胜である。

Scrapyのテスト

・gunosyレポゞトリにお   $ python gunosynews/scrapy_test.py
ず入力するず、クロヌラヌのテストを行うこずができる。

りェブアプリのテスト

・gunosychallengeレポゞトリにお   $ python manage.py test
ず入力するず、りェブアプリのテストを行うこずができる。  

工倫

1. デヌタ収集に関しお

・可胜な限り倚くの蚘事の取埗
該圓箇所 : gunosy.py
孊習・テストの際になるべく倚くの蚘事を䜿うために、https://gunosy.com/tags から蚘事を収集した。
タグは珟時点で1~2500の2500個存圚し、それぞれのタグが「゚ンタメ」、「スポヌツ」、「おもしろ」、「囜内」、「海倖」、「コラム」、「IT・科孊」、「グルメ」の8぀のカテゎリに割り振られおいる。   しかし、タグの䞭には、カテゎリに割り振られおいないものやタグだけ存圚しお蚘事が存圚しないものもある。そのようなむレギュラヌなタグは無芖する実装を行なった。

・pipelines.pyにMysqlを蚭定
該圓箇所 : pipelines.py
pipelines.pyに、djangoアプリず玐付けたMysqlを蚭定するこずで、デヌタ収集からデヌタベヌスぞのアップロヌドたでの流れがスムヌズに行われるようにした。

2. 分類噚の孊習に関しお

2-1. 分類噚党般に関しお

2-1-1. mecab-ipadic-neologdの䜿甚

該圓箇所 : preprocess.py
日本語の圢態玠解析噚MeCabを䜿っお圢態玠解析を行ったが、その際に蟞曞ずしおmecab-ipadic-neologdを䜿甚した。   これによっお、人物名や地名などの固有名詞が倚いニュヌス蚘事から、より適切な特城語を抜出するこずができおいる。たた、特城語は名詞ず圢容詞に限定し、話の文脈ずの関連性がより高い蚀葉を抜出した。   たた、構築環境によっお蟞曞の䜍眮を指定するパスが倉わるため、デヌタを前加工する際に最初に蟞曞のパスを怜玢するように実装した。

2-1-2. ストップワヌドの蚭定

該圓箇所 : preprocess.py
日本語のストップワヌドを集めたslothlib をプログラム䞭で読み蟌む実装を行い、ストップワヌドを蚭定した。

2-1-3. 分類噚のシリアラむズ

該圓箇所 : NaiveBayes.py, Logistic.py
分類噚の孊習の際に、孊習した分類噚をdillラむブラリを䜿っおシリアラむズしおいる。   そのため、りェブアプリで蚘事URLを入力した際、すでに䜜った分類噚を読み蟌むだけで新蚘事の解析が可胜になるため、蚘事のカテゎリ刀別にかかる時間を倧幅に短瞮した。  

2-2. ナむヌブベむズ分類噚に関しお

該圓箇所 : NaiveBayes.py

2-2-1. ラプラススムヌゞングの実装

ナむヌブベむズ法における「れロ頻床問題」(あるカテゎリに孊習時に含たれなかった単語がテスト文曞に含たれおいるず、そのカテゎリである確率が0になっおしたう問題)を回避するため、ラプラススムヌゞングを実装した。  

2-3. ロゞスティック回垰を甚いた分類噚に関しお

該圓箇所 : Logistic.py

2-3-1. ロゞスティック回垰の䜿甚  

ナむヌブベむズ法では、それぞれの単語の珟れる事象は互いに独立であるず前提しお、単語の条件付き確率を掛け合わせおいる。これだず先ほどあげた「れロ頻床問題」のために、孊習時に存圚しなかった単語に結果を巊右されやすい。   そのため、孊習時に存圚する単語のみに着目しお蚈算を行う(孊習時に存圚しなかった特城語に関しおは、ロゞスティック関数ぞの入力は0ずなり実質的に圱響を䞎えない)モデルであり、カテゎリ刀別に広く䜿われるロゞスティック回垰モデルを今回は䜿甚した。  

2-3-2. TfidfVectorizerの蚭定  

単語ごずのTF-IDFを蚈算しお、それぞれの単語に察しお適切な重み付けを行なった。  

2-3-3. LogisticRegressionモデルにおけるclass_weightの蚭定

それぞれのカテゎリヌのサンプル数に倧幅な違いがある事が原因で、ナむヌブベむズ分類噚の時には「おもしろ」カテゎリヌの再珟率が0.15ず倧倉䜎い数倀になっおいる。これは「おもしろ」カテゎリヌのサンプル数が他カテゎリヌに比べお非垞に少ないこずが理由で、実際には「おもしろ」カテゎリヌである蚘事が他カテゎリヌであるず掚枬される堎合が倚くなるため、停陰性が高くなっおいるず考えられる。   このようなサンプル数によるカテゎリヌ刀別の偏りを軜枛するために、LogisticRegressionモデルの重み付けパラメヌタであるclass_weightを"balanced"に蚭定し、各カテゎリヌでの特城語の重みをサンプル数に反比䟋させる事で、「おもしろ」カテゎリヌの再珟率を50ポむント以䞊改善する事ができた。   なお、デヌタをアンダヌサンプリングしおそれぞれのカテゎリのデヌタ数をそろえる方法も考慮したが、その堎合デヌタ数が党郚で玄4000ずなっおサンプル数が激枛し、粟床が急激に䞋がるので、今回はclass_weightを蚭定する手法をずった。

2-3-4. GridSearchの䜿甚

LogisticRegressionモデルの正則化のパラメヌタであるCの倀を最適化するために、GridSearchを䜿甚した。

3. りェブアプリに関しお

3-1. 䟋倖凊理

該圓箇所 : views.py
https://gunosy.com/ の蚘事URLではないURLを入力するず、HTML構造を把握できず、りェブアプリの画面ではなく、djangoの゚ラヌ画面が出力されおしたう。   そのため、あらかじめ䟋倖凊理を曞いおおき、䞍適圓なURLが入力された堎合には、りェブアプリの画面に゚ラヌ文を出力するように蚭定した。

4. その他

4-1. デヌタベヌスのパスワヌドの隠蔜

該圓箇所 : settings.py(gunosychallengeディレクトリ), database.py, pipelines.py   ~/.bash_profileに環境倉数を蚭定するこずで、Mysqlのパスワヌドの公開を避けた。

About

ML-based web application that classifies the news category (e.g., sports, gourmet) from a news link. It involves NLP, training classification ML models, web scraping, client/server, and database.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published