Webスクレイピング→形態素解析→Bag of Words→ナイーブベイズする(Webサイトの単語を分解してクラス分類)

暇だったのでちょっとしたChrome拡張機能を作ろうと思い立った.

その拡張機能のサーバサイドのメイン機能に必要なものとして、以下のような処理があった.

「Webページを取得してそのページの単語を分析、ページをクラス分類」

今回は、とりあえずプロトタイプを作りたかったので、3時間ぐらいで全部通すことを目標に作業開始.

上記を実現するためにより詳細には以下のような処理順序にしようと決めた.

  1. URLのリストに沿ってページを一つずつ取得
  2. ページの内容を形態素解析
  3. 形態素解析の結果からBag of Wordsを構築
  4. 3.のBag of wordsを元にナイーブベイズでクラス分類

久々にこう行った実装したのでメモ.

 

基本環境

今回は扱いやすさからPythonで解析.

URLのリストには、クラス番号とURLが書かれているものとして、以下のような書式

0,https://www.google.com

1,https://www.youtube.com

助詞とかはBagOfWordsに含まず、解析に使用しないものとする.

 

1.URLのリストに沿ってページを取得する

URLのリスト、例えばurls.txt、を開いてクラスの番号とURLを読み込む.

まずURLから中身を取得するのはrequestsモジュールを使用.
そこからhtmlの中身を取り出してそれに対して

Webスクレイピングの定番らしいBeautiful Soupを使う.

ただ、正直正しい使い方がわからないけど、とりあえず以下がやりたい

  • Scriptタグを無視
  • それ以外のタグはタグの部分だけ消して文字だけにしたい

コード的には以下. 重複したスペースを最後の行で除去しています.

2. ページを形態素解析

janomeを使いました.簡単に使えて非常に便利.インストールできればすぐ形態素解析できます.

https://github.com/mocobeta/janome

N-Gramにするか形態素解析にするか非常に悩みましたが、とりあえず形態素解析を採用して進めます.

品詞が得られるので、明らかにクラス分類に使い物にならないものを除外します.

今回助詞を除去して、とりあえず他は全て(感嘆詞も含めて)使うことにしました.

3. 形態素解析の結果からBag Of Wordsを構築

非常に汚い形になりますが、Bag of wordsを雑に辞書で実現しています.

それぞれの単語の使用回数を数えて辞書で持ちます.

この後単語を集めて回らなきゃいけないので、キーを作って辞書を作り直し、
それぞれのサイトのBag of wordsを構築します.

4. Bag of Wordsの結果を元にナイーブベイズでクラス分類

今回は大したクラス分類ではないので、ナイーブベイズです.

sklearnのナイーブベイズを使います.こちらもすぐに使えます.Bag of wordsで作ったベクトルをそのままナイーブベイズに突っ込んでやります.

おわりに

結局実作業としては2時間ちょいくらい.アニメみながら作業していたので一部時間かかりましたが…

結構識別できている気がします.やりたいことできるかな.

 

About the author

コメントを残す