🍞

RyeでWord2Vecの開発環境を構築

2023/08/31に公開

概要

3年ぶりにPythonの開発環境を整えるためにzennなどを調査してみると、最近ではRyeと呼ばれるパッケージ管理ツールが注目されているそうです。
https://rye-up.com/

早速、こちらのインストール手順を進めてから、日本語のwikipediaを学習させるためのWord2Vecの開発環境を構築しました。
その時の環境構築の手順と実際にRyeを利用してみた感想を記述したいと思います。

リポジトリ

https://github.com/hagiwa901/word2vec

環境

  • Mac
  • Docker:20.10.0
  • docker-compose:1.27.4

手順

プロジェクトの新規作成

rye init [プロジェクト名]でプロジェクトの構築をします。

rye init word2vec
cd word2vec

パッケージのインストール

rye add [パッケージ名]でPythonのパッケージをインストールすることができます。
ここではgensimhydrawikiextractorをインストールしたいので、下記のコマンドを実行します。

rye add gensim
rye add hydra
rye add wikiextractor

実行後はlockfileを更新するために下記のコマンドを実行します。

rye sync

学習データの作成

日本語Wikipediaのダウンロード

https://qiita.com/kenta1984/items/93b64768494f971edf86
こちらの記事を参考に下記のコマンドを実行します。

curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o dataset/jawiki-latest-pages-articles.xml.bz2

Wikipediaの記事の抜粋

https://github.com/attardi/wikiextractor
上記の記事を参考に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の内容と説明

https://qiita.com/t_katsumura/items/462e2ae6321a9b5e473e
上記の記事の中で紹介されているDockerベストプラクティスTop20によると、

作成したdockerfiledocker-compose.yamlで定義して、docker-composeコマンドから実行できるように設定します。

docker-compose.yamlとenvファイル

https://github.com/hagiwa901/word2vec/blob/main/docker-compose.yml
分かち書きを行うためのファイルは下記の設定ファイルで変更できるように変数を定義。
https://github.com/hagiwa901/word2vec/blob/main/.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の設定ファイル群

ソースコードを作成した後は、マニュアル通りスクリプト名 = 'ファイル名:関数名'pyproject.tomlに追記。

[project.scripts]
train-script = 'train:main'

ここでも、rye syncで更新して、rye run スクリプト名で実行します。

rye run train-script

予測

学習させたモデルから類似した単語を出力します。

ソースコードとHydraの設定ファイル群

https://github.com/hagiwa901/word2vec/blob/main/src/predict.py
学習させたモデルから予測させたい単語と単語の予測数を記述した設定ファイル
https://github.com/hagiwa901/word2vec/blob/main/src/conf/predict/similar.yaml

こちらも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