本プロジェクトは django
をベースとした 3 つのアプリケーションから構成されている。これらのアプリケーションは django の custom command を利用して実装されている:
crawler
app.- gunosy.com からニュース記事を取得する君
classifier
app.crawler
で取得した記事を元にカテゴリを予測する分類器を学習させる君
predictor
app.classifier
で学習させた分類器を元に 記事 URL からカテゴリを予測する君
- poetry
- python の依存関係やパッケージ配布の管理を簡素化するパッケージマネージャ
- プロジェクトの依存関係を簡単に指定、インストール、管理し、公開するための配布ファイルを生成することが可能
- flake8
- python コードに含まれる文法エラーやコーディングスタイル違反などの問題をチェックする code linter
- black
- python コードを一貫したスタイルガイドに沿って自動的に再フォーマットし、読みやすく、保守しやすくする code formatter
- isort
- python の import 文を PEP8 ガイドラインに従って自動的にソートし、一貫した方法で整理するライブラリ
- mypy
- mypy は Python 用の静的型チェッカーで、コードが実行される前に一般的なエラーやバグを検出するのに役立つ
- django
- 安全でスケーラブルなウェブアプリケーションを迅速に開発できる高水準のウェブフレームワーク
- model/view/controller (MVC) のアーキテクチャパターンに従っている
- object relational mapper (ORM) やテンプレートエンジン、認証システムなどの様々な組み込み機能を有している
- requests
- python のコードで HTTP リクエストを行うプロセスを簡素化する、幅広く利用されているサードパーティーライブラリ
- beautifulsoup4
- HTML や XML 文書からデータを抽出する Web スクレイピングの目的で使用されるサードパーティライブラリ
- numpy
- python で科学計算やデータ解析に使用されるサードパーティモジュール
- scikit-learn
- データマイニングやデータ分析のための効率的で使いやすいツールを提供する python 用のサードパーティ製機械学習ライブラリ
- natto-py
- Python と日本語の品詞・形態素解析ツール MeCab を組み合わせたパッケージ
- joblib
- Python の軽量パイプラインに使用されるサードパーティモジュール。今回は学習した機械学習モデルを保存するために使用
- streamlit
- Python でインタラクティブなデータサイエンス・アプリケーションを作成するために使用される
- lime
- 機械学習モデルの予測値を説明するための Lime(Local Interpretable Model-Agnostic Explanations)ライブラリ
- pathlib
- dataclass
- typing
- argparse
- 本レポジトリを clone する
git clone https://github.com/nakamina/newspaper-classifier
cd newspaper-classifier
- python の環境を用意する
pyenv virtualenv 3.9.9 newspaper-classifier-dev
pyenv local newspaper-classifier-dev
- poetry を使って依存ライブラリをインストールする
pip install -U pip wheel setuptools poetry
poetry install
-
以下の django custom command である
crawl
コマンドを実行する。 -
このコマンドで呼ばれている実装は crawler/utils.py を参照
-
デフォルトの設定
python manage.py crawl
- オプションを使って詳細を設定
python manage.py crawl \
--base-url https://gunosy.com \
--data-root-dir ./data/articles
-
以下の django custom command である
train_classifier
コマンドを実行する。 -
このコマンドで呼ばれている実装は classifier/utils.py を参照
-
デフォルトの設定
python manage.py train_classifier
- オプションを使って詳細を設定
python manage.py train_classifier \
--data-root-dir ./data/articles \
--label-encoder-save-path ./data/label_encoders \
--vectorizer-save-path ./data/vectorizers/ \
--model-save-path ./data/models/
-
以下の django custom command である
predict
コマンドを用いてニュース記事分類くんのウェブアプリを動かす。 -
このコマンドで呼ばれている実装は predictor/streamlit.py を参照
-
デフォルトの設定
python manage.py predict
- オプションを使って詳細を設定
python manage.py predict \
--script-path ./predictor/streamlit.py \
--port 8501 \
--label-encoder-save-path ./data/label_encoders \
--vectorizer-save-path ./data/vectorizers/ \
--model-save-path ./data/models/
# You can now view your Streamlit app in your browser.
# Local URL: http://localhost:8501
# Network URL: http://172.20.10.8:8501
# For better performance, install the Watchdog module:
# $ xcode-select --install
# $ pip install watchdog
# Load model from /Users/nakamina/ghq/github.com/nakamina/newspaper-classifier/data/models/pretrained-model.joblib
# Load label encoder from /Users/nakamina/ghq/github.com/nakamina/newspaper-classifier/data/label_encoders/label-encoder.joblib
# Load vectorizer from /Users/nakamina/ghq/github.com/nakamina/newspaper-classifier/data/vectorizers/count-vectorizer.joblib
CI を GitHub Actions で構築している。以下はその内容である:
- black によるコードフォーマットの確認
- flake8 による文法エラー、コーディング規約の確認
- mypy による型チェック
- django の custom command を使わない場合の実装
- django の ORM を使って crawl したデータを DB へ格納
- HTML どうやって保持しておくか問題
- pathlib vs. os.path 検証
- 入力特徴の検討
- 単語 vs. 文字 検証
- 入力文全体 vs. 名詞のみ 検証
- ベクトル化手法 (count vectorizer, etc.)
- 機械学習モデルの検討
- ロジスティック回帰以外
- 各条件化で比較した際の機械学習モデルの予測性能の評価
- Web アプリケーション
- LIME 以外にも機械学習モデルの予測の解釈手法の検討