ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

Webコンテンツ抽出ツールdragnetを訓練する

dragnetとは、Webコンテンツから重要な部分のみを抽出するためのツールです。比較系の記事はありますが、自前データで訓練している記事がないので、ここではその方法を説明します。

dragnetの入手

$ git clone https://github.com/seomoz/dragnet

データ準備

あらかじめ、data/HTMLとdata/Correctedというディレクトリを作成しておいてください。

#!/bin/bash
curl -o data/HTML/${1}.html "${2}"
lynx --dump -nonumbers -nolist "${2}" > data/Corrected/${1}.html.corrected.txt
emacs data/Corrected/${1}.html.corrected.txt

データ準備スクリプトは、データのIDとURLを指定して実行します。data/HTMLというディレクトリにhtmlの生データを保存し、data/Correctedというディレクトリに正解文を格納します。

download.shで保存されたid.html.corrected.txtはhtmlからテキストを抽出したものですが、このテキストから「抽出されたら嬉しいものだけ」を残します。(編集にemacsを使っていますが、vimでもなんでもいいです。)

URLのリストがあるのであれば、download.shにループで渡してください。

前処理

データ準備が完了したら、jupyter等で以下を実行します。

from dragnet.data_processing import extract_all_gold_standard_data
rootdir = 'data'
extract_all_gold_standard_data(rootdir)

すると、データがブロックに分割され、前処理が完了します。

訓練

分類器としてsklearnのモデルを使うことができます。おすすめはRandomForestClassifierです。

from dragnet.extractor import Extractor
from dragnet.model_training import train_model
from sklearn.ensemble import RandomForestClassifier

rootdir = 'data'

features = ['kohlschuetter', 'weninger', 'readability']

to_extract = ['content', 'comments']   # or ['content']

model = RandomForestClassifier()

base_extractor = Extractor(
    features=features,
    to_extract=to_extract,
    model=model
)

extractor = train_model(base_extractor, rootdir)

これで、extractorに訓練済みモデルが格納されます。extractorはpickle等で保存しておいてください。この訓練済みモデルを使うには以下を実行します。

# html_stringはコンテンツを抽出したいHTMLを入力
content = extractor.extract(html_string, encoding='utf-8')

参考

https://github.com/seomoz/dragnet