perarduaadastra

競技プログラミングとかをしています

機械学習で災害に関するツイートかどうかを判定する

これです。

www.kaggle.com

なんか自然言語処理について色々知見があった気がしたので覚え書きをします。

 

コンペの概要

なんか数千のツイートが与えられるので「災害に関する内容か」をそれぞれ判定してください。学習用データも与えられるよ。

 

まずうちさあ、汚いデータあるんだけど

学習用と称して渡されたデータを見てみます。

 

#3: Car Recorder ZeroEdgeå¨ Dual-lens Car Camera Vehicle Traffic/Driving History/Accident Camcorder  Large Re... http://t.co/kKFaSJv6Cj

EARTHQUAKE SAFETY LOS ANGELES ÛÒ SAFETY FASTENERS XrWn

 

tensorflowのtokenizerに渡して単語ごとに分割してもらおうというところですが、先に学習の妨げになる要素を破壊しておいた方が良いでしょう。

データをきれいにする

正規表現ライブラリreを使ってきれいにしましょう。

  • http://~~~みたいなやつ urlを取り除く
  • emojiを取り除く。文字コードで指定しておくとよいです
  • ""とかを取り除く
  • stopwordsを取り除く。aとかtheとかです。nltkに取り除くやつがあります

ついでにnltkのSnowballStemmerで単語を語幹だけにしてやります。

 

tensorflow用のデータにしていく

データがきれいになったのでtensorflowのtokenizerでとーくんにしてもらいます。

この時にtrain用のデータをちょっと分割して試験用のデータを分けておきましょう。

 

ひとのモデルをパクる

適当にscipyでTF-IDFしても得点が伸びなかったのでGloVeを拝借しました。これでベクタライズはばっちりだと思います。

 

レイヤーを張るわね

  • embeddingレイヤ(GloVeのやつを処理して使う)
  • dropoutレイヤ(1次元 20%)
  • bidirectionalレイヤに突っ込んだLSTMレイヤ(よくわかんない)
  • denseレイヤ(密です 活性化関数にはシグモイドを)

kerasのレイヤ多すぎて何がなんだかわからないわね

この辺自在に使えるようになりたいね

 

結果のやつ

train用データから分離させたデータでテスト

77.259 %

と出た。いいんじゃないの。scipyで色々なモデルつかって学習させてみても70%いかなかったのでびっくり。

 

提出データの正答率

78.732 %

OK

 

どんな記事にも終わりはある

レイヤまわりがまだよくわかってない。日本語だったら分かち書きなんかが必要になってもっと面倒くさそうだなってかんじ。