RyeでWord2Vecの開発環境を構築
概要
3年ぶりにPythonの開発環境を整えるためにzennなどを調査してみると、最近ではRyeと呼ばれるパッケージ管理ツールが注目されているそうです。
早速、こちらのインストール手順を進めてから、日本語のwikipediaを学習させるためのWord2Vecの開発環境を構築しました。
その時の環境構築の手順と実際にRyeを利用してみた感想を記述したいと思います。
リポジトリ
環境
- Mac
- Docker:20.10.0
- docker-compose:1.27.4
手順
プロジェクトの新規作成
rye init [プロジェクト名]
でプロジェクトの構築をします。
rye init word2vec
cd word2vec
パッケージのインストール
rye add [パッケージ名]
でPythonのパッケージをインストールすることができます。
ここではgensim
とhydra
とwikiextractor
をインストールしたいので、下記のコマンドを実行します。
rye add gensim
rye add hydra
rye add wikiextractor
実行後はlockfileを更新するために下記のコマンドを実行します。
rye sync
学習データの作成
日本語Wikipediaのダウンロード
こちらの記事を参考に下記のコマンドを実行します。
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o dataset/jawiki-latest-pages-articles.xml.bz2
Wikipediaの記事の抜粋
ここでは、pyproject.toml
にコマンドを登録したいので、[tool.rye.scripts]
に
wiki-extract = { cmd = ["python", "-m", "wikiextractor.WikiExtractor", "dataset/jawiki-latest-pages-articles.xml.bz2", "-o", "dataset/wikitext"] }
を追記してからrye sync
で、requirements.lock
を更新します。
更新後は下記のコマンドを実行します。
rye run wiki-extract
抜粋した記事の中身を確認すると下記のように余計な空白やタグも入っています。
抜粋した記事の中身の一部
<doc id="2490856" url="https://ja.wikipedia.org/wiki?curid=2490856" title="斎藤和義">
斎藤和義
</doc>
<doc id="2490859" url="https://ja.wikipedia.org/wiki?curid=2490859" title="ユーリー・クラスノジャン">
ユーリー・クラスノジャン
なので、データの正規化を行いたいと思います。
抜粋したWikipediaの記事の正規化
Wikipediaの記事を正規化します。
ソースコード
ここでもpyproject.toml
にコマンドを登録したいので、[project.scripts]
に
make-wiki-corpus = 'make_wiki_corpus:main'
を追記してから、rye sync
で、requirements.lock
を更新します。
更新後は下記のコマンドを実行します。
rye run make-wiki-corpus
実行結果は下記のようになります。
実行結果
斎藤和義
ユーリー・クラスノジャン
ユーリー・アナトーリエヴィチ・クラスノジャン(、1963年6月7日 - )は、ロシアの元サッカー選手、サッカー指導者。現役時代のポジションはDF/MF。
……
分かち書き
DockerでMeCab+IPA辞書の環境を構築しました。
Dockerfileの内容と説明
DockerベストプラクティスTop20によると、
上記の記事の中で紹介されている- 安全とイメージサイズを小さくするためにマルチステージビルドを利用して下さい。
- フルスクラッチからDockerファイルを作成するときにはDistrolessを利用して下さい。
と書かれていましたので、上記の点を踏まえてMeCab+IPA辞書を作成しました。
https://github.com/hagiwa901/word2vec/blob/main/mecab_ipadic/dockerfile
作成したdockerfile
をdocker-compose.yaml
で定義して、docker-compose
コマンドから実行できるように設定します。
docker-compose.yamlとenvファイル
分かち書きを行うためのファイルは下記の設定ファイルで変更できるように変数を定義。
docker-compose.yaml
に作成したDockerファイルをビルドして、実行するために下記のコマンドを実行します。
docker-compose build mecab_ipadic_tokenizer
docker-compose run mecab_ipadic_tokenizer
分かち書きをした後の実行結果
斎藤 和義
ユーリー ・ クラス ノ ジャン
ユーリー ・ アナトーリエヴィチ・クラスノジャン ( 、 1963 年 6 月 7 日 - ) は 、 ロシア の 元 サッカー 選手 、 サッカー 指導 者 。 現役 時代 の ポジション は DF / MF 。
……
実行後はコンテナを落とすために下記のコマンドを実行します。
docker-compose down mecab_ipadic_tokenizer -v
このデータを使って、学習をさせたいと思います。
学習
gensim
でWord2Vecを学習させます。
学習時のパラメータを管理するためにHydra
の設定ファイルも作成します。
ソースコードとHydraの設定ファイル群
データの設定ファイル Word2Vecの学習パラメータの設定ファイル
ソースコードを作成した後は、マニュアル通りにスクリプト名 = 'ファイル名:関数名'
をpyproject.toml
に追記。
[project.scripts]
train-script = 'train:main'
ここでも、rye sync
で更新して、rye run スクリプト名
で実行します。
rye run train-script
予測
学習させたモデルから類似した単語を出力します。
ソースコードとHydraの設定ファイル群
学習させたモデルから予測させたい単語と単語の予測数を記述した設定ファイル
こちらもpyproject.toml
に追記して、rye sync
で更新してrye run predict-script
で実行します。
[project.scripts]
predict-script = 'predict:main'
実行結果
ニュース 0.5911114811897278
お昼 0.5897020697593689
気象 0.5851269364356995
感想
pyproject.tomlでプロジェクトの環境が詳細に保存される
pyproject.toml
にプロジェクトの内容が自動的に更新されていきます。
- Pythonのバージョン
- インストールしたパッケージ名
- etc
実行すべきLinuxコマンドも管理できて便利
Pythonを実行する以外にもLinuxコマンドなどもpyproject.toml
に記述することができ、かつ、実行することも可能です。
例としては、docker-comoseのコマンドを下記のように記述すれば、rye run スクリプト名
で実行することができます。
[tool.rye.scripts]
build-docker-mecab-ipadic = { cmd = ["docker-compose", "build", "mecab_ipadic_tokenizer"] }
run-docker-mecab-ipadic = { cmd = ["docker-compose", "run", "mecab_ipadic_tokenizer"] }
down-docker-container = { cmd = ["docker-compose", "down", "-v"] }
rye run build-docker-mecab-ipadic
rye run run-docker-mecab-ipadic
rye run down-docker-container
使い方として合っているかは分かりませんが、実行すべきコマンドも管理することができるので便利だと感じました。
Discussion