Zenodoを使ってGithubのレポジトリのDOIを取得

深層学習系の研究では、論文に記載した実験を行ったときのプログラム一式をGithub等で公開するのが普通になってきています。

一方、Nature系の論文誌など自然科学系の論文誌では、プログラムコードを公開するだけでなくDOI(Digital Object Identifier)を付与することが求められることがある。
DOIは永久的に変更できないレポジトリに対して付与するユニークなIDである。学術論文のほとんどには自動的にDOIが付与される。DOIを”https://doi.org/”の後に続けてブラウザに入力するとその対象のURLに飛ぶ。論文誌によってはDOIのない対象を参考文献として認めない。

Github自体にはコードをフリーズして永久に保存する機構がないため、DOIの発行者となることができない。そのため、ZenodoやFigshareといった外部のリポジトリに連結してDOIを獲得する必要がある。簡単に言えば、Githubのある時点のリリースを外部リポジトリがダウンロードして、アーカイブに保存し、その保存したアーカイブに対してDOIを発行する。

まあ、気持ち的には内容証明付き郵便のようなもの。この場合、郵便局が外部リポジトリで、ある時点でのプログラム一式の内容を保証してくれる。これにより、プログラムコードを動かして実験した結果の追試が正確にできる。情報系では、このあたりの制約は緩く、ある程度性善説Github等のリリースを論文作成時点でのプログラムセットとして信用していてDOIまで求められないことが多い。多分、自然科学系では「誰が最初に○○したか」が非常に重要になるため、研究成果を得るために使用したプログラムコードをDOIで保証することが求められるのだと理解している。
(生粋の情報畑なので違っていたら申し訳ない)

Zenodoを使ったDOIの取得法は下記のGithubドキュメントに書かれている。ZenodoはOpenAIREとCERN(欧州原子核研究機構)によって運営されており、DOIを付与したアーカイブCERNのデータセンターに保管されているため、確実なバックアップが取られている。ちなみにCERNWorld Wide Web (www)を開発した機関なので、情報系にも関連が深い(今このページが見えているのもCERNの功績があってのこと)。

docs.github.com

少し分かりにくいのは、Githubリポジトリのオーナーであっても、ユーザーがpublicになっていないとZenodoに接続されたリポジトリリストに対象のGithubリポジトリが出てこないことがあることと、取得したDOIはGithub側に自動的には表示されず、ZenodoのGithubページに行って、取得したDOIを手動でコピーしてGithub側に書き込む必要がある点。

レガシー

言語処理とは関係ない話題です。

Windows 10になって、過去の機器が実は使えなくなっていることに気が付いた人も多いのではないでしょうか。
たとえば、いつのまにかSCSI機器やPCMCIAのカードなどの大部分動かなくなっています。Windows 7 までは XP のドライバが使えて問題なかったのですが。Windows 10で動く機器があったとしても、既に製造中止になっていて中古市場でないと入手できなくなっています。このままだと中古市場からも時機に姿を消して、レガシー機器のIFボードなどは粗大ごみとしてすべてこの世から消えてなくなってしまうことになりそうです。私の場合は、SCSIの外付けHDDやJazに昔のスライドやプログラムが残っています。ある程度はコピーを手元のHDに持っているはずですが、どれを救出してあるかを正確には覚えていません。

そんなこともあって、12年前に購入して、最近は物置にしまってあったDELLのデスクトップを動かしてみたところ、電源オン後にビープ音が鳴って動かなくなっていました。メモリの抜き差しを試した結果、時々BIOSの設定画面まで進める場合があることが分かりました。

しかし、その場合でも日時を設定し、リブートするとBIOS画面までは進んで、今度はBIOSの立ち上げ途中で止まってしまいます。

さらなる試行錯誤の結果、普通に立ち上がるようになったのですが、要するにマザーボードの電池が切れていたことが原因のようです。これが原因でBIOSの設定がPCの構成とズレてしまったためBIOSが途中で停止したようです。私のPCはFD(フロッピーディスク)非搭載のモデルですが、BIOSの初期値ではFD搭載といるという設定になっており、電池が切れたことでBIOSの初期値がFD有りになってしまい、電源オン後のBIOSの機器チェックでFDがないため止まっていたようです。

対処法は、マザーのボタン電池を同じ型のものと交換し、BIOSの設定画面でFDをUSB(またはOFF)に設定するというものです。

同じ様な症状でも、場合によっては、マザーボードのどこかが故障しているかもしれませんので、上記の方法で元に戻るかどうかはケーズバイケースですが試してみてください。なお、メモリボードを差し込むにはコツと多少の力がいります(カチッと音がしてラッチがかかるまで押し込む)。ただし、力を入れすぎるとマザーボードやメモリを壊してしまいますので、慣れてない人は慎重に行ってください。また、当然ですが、感電防止と電子機器を破壊しないために、メモリの抜き差しなど筐体内にアクセスするときには、電源コードおよびその他のケーブル類もすべて抜いてください。

10年前のDELLにはPCIPCI Expressの空きIFポートがあるので、ここにSCISやIEEE1394などのIFボードを指してLinuxを動かせば大体のレガシー機器とは接続できそうです。

miniconda

(以下は2021年5月6日時点の情報です.ライセンス条件は変更になる可能性があります.)

Anaconda が商用利用とならない範囲で Anaconda 環境がどれぐらい使えるのかを確認してみた.

なお,Anaconda3が既に導入されているWindowsに,minicondaをデフォルトのディレクトリ(Anaconda3と同じディレクトリ)に2回インストールするとAnaconda3のインストールも消えてしまうので注意.

AnacondaはPythonとそのライブラリ一式がパッケージ化されたものです.Pythonをインストールして,pipなどでライブラリを個別にインストールしても良いのですが,ライブラリの依存関係などが複雑な場合,インストールにかなり手間取ることがあります.Anacondaを使っておけば,このようなライブラリのバージョンの競合などを避けることができます(多少は発生します).

また,AnacondaというよりCondaを使うと,Pythonの環境が自由に切り替えられて便利です.特にPytorchなどを使って最近の深層学習モデルを動かすときには,そのモデル専用の環境を作らないと動いてくれなないことが多々あります.最近はモデルがAllen Institute のAllenAI, AllenNLPなどの強力なライブラリに依存していたりして,そちらの環境にも合わせてあげる必要があります.そのため,最新の深層学習モデルを研究していると,研究テーマごとにPythonの環境を作り(conda create -n 環境名),切り替え(conda activate 環境名)ながら実験していくことになります.このあたりのcondaの使い方は丁寧に紹介しているサイトがたくさんあるのでここでは説明しません.

大学等の教育機関ではAnacondaを無償で利用できるため,学生・教員はAnacondaのライセンスを気にする必要はありません.ただ,共同研究や講習会等で企業さんとも関係することがありますので,正確に確認しておくことにしました.

まず,minicondaはAnacondaパッケージの簡易版です.Pythonと最低限必要なライブラリのみをパッケージにしたものです.インストーラーのファイルサイズが約60MBと小さく,miniconda3ディレクトリに初期インストールされたファイルも約400MBとコンパクト.ちなみにPytorch等をインストールすると10GBぐらいの記憶容量を消費します.

docs.conda.io


インストールはminicondaのサイトから自分のPCに合ったインストーラをダウンロードしてインストールするだけ.

現時点で最初に入っているライブラリは下記(バーションなどは日々更新されていきます).

conda list
# packages in environment at C:\ProgramData\Miniconda3:
#
# Name Version Build Channel
brotlipy 0.7.0 py38h2bbff1b_1003
ca-certificates 2020.10.14 0
certifi 2020.6.20 pyhd3eb1b0_3
cffi 1.14.3 py38hcd4344a_2
chardet 3.0.4 py38haa95532_1003
conda 4.9.2 py38haa95532_0
conda-package-handling 1.7.2 py38h76e460a_0
console_shortcut 0.1.1 4
cryptography 3.2.1 py38hcd4344a_1
idna 2.10 py_0
menuinst 1.4.16 py38he774522_1
openssl 1.1.1h he774522_0
pip 20.2.4 py38haa95532_0
powershell_shortcut 0.0.1 3
pycosat 0.6.3 py38h2bbff1b_0
pycparser 2.20 py_2
pyopenssl 19.1.0 pyhd3eb1b0_1
pysocks 1.7.1 py38haa95532_0
python 3.8.5 h5fd99cc_1
pywin32 227 py38he774522_1
requests 2.24.0 py_0
ruamel_yaml 0.15.87 py38he774522_1
setuptools 50.3.1 py38haa95532_1
six 1.15.0 py38haa95532_0
sqlite 3.33.0 h2a8f88b_0
tqdm 4.51.0 pyhd3eb1b0_0
urllib3 1.25.11 py_0
vc 14.1 h0510ff6_4
vs2015_runtime 14.16.27012 hf0eaf9b_3
wheel 0.35.1 pyhd3eb1b0_0
win_inet_pton 1.1.0 py38haa95532_0
wincertstore 0.2 py38_0
yaml 0.2.5 he774522_0
zlib 1.2.11 h62dcd97_4

下記のサイトを参考にAnacondaのリポジトリに依存せず環境を作っていきます.

Anacondaの有償化に伴いminiconda+conda-forgeでの運用を考えてみた - Qiita

まずは,各種設定をするため端末を開く.Windowsの場合は,スタートメニューからAnaconda Prompt (Miniconda3)を管理者として選択(右クリックして「管理者として実行」)し,端末を開く.WindowsのコマンドプロムプトはPython等へのパスが設定されてないのでAnacondaのコマンドプロムプトを使う.

デフォルトのチャネルが設定されているかどうか確認する.

conda config --show channels

デフォルトのチャネルdefaultsがある場合は削除しておく.

conda config --remove channels defaults

これでデフォルトのチャネル(ライブラリをダウンロードしてくるサイト)がなくなったので,ライブラリをインストールするたびにチャネルを指定します.また,依存しているAnacondaのレポジトリのライブラリをインストール候補に含めないように --overridge-channels オプションを付ける.

pytorchのインストールは例えば下記のように実行する.pytorchのバージョンの指定が必要だったり,インストール方法が変わったりするので,本家のPytorchのサイトを参照すること.(ただし,本家のcondaのコマンドに-c conda-forgeを追加することを忘れないで)

conda install pytorch -c pytorch -c conda-forge --override-channels
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

environment location: C:\ProgramData\Miniconda3

added / updated specs:
- pytorch


The following packages will be downloaded:

package | build
---------------------------|-----------------
blas-2.109 | mkl 13 KB conda-forge
blas-devel-3.9.0 | 9_mkl 12 KB conda-forge
certifi-2020.12.5 | py39hcbf5309_1 144 KB conda-forge
conda-4.10.1 | py39hcbf5309_0 3.1 MB conda-forge
cudatoolkit-11.1.1 | heb2d755_7 1.20 GB conda-forge
liblapacke-3.9.0 | 9_mkl 4.0 MB conda-forge
libuv-1.41.0 | h8ffe710_0 341 KB conda-forge
mkl-devel-2021.2.0 | h57928b3_390 5.8 MB conda-forge
mkl-include-2021.2.0 | hb70f87d_389 759 KB conda-forge
ninja-1.10.2 | h5362a0b_0 273 KB conda-forge
numpy-1.20.2 | py39h6635163_0 5.3 MB conda-forge
python_abi-3.9 | 1_cp39 4 KB conda-forge
pytorch-1.8.1 |py3.9_cuda11.1_cudnn8_0 1.53 GB pytorch
typing_extensions-3.7.4.3 | py_0 25 KB conda-forge
------------------------------------------------------------
Total: 2.75 GB

The following NEW packages will be INSTALLED:

blas conda-forge/win-64::blas-2.109-mkl
blas-devel conda-forge/win-64::blas-devel-3.9.0-9_mkl
cudatoolkit conda-forge/win-64::cudatoolkit-11.1.1-heb2d755_7
intel-openmp conda-forge/win-64::intel-openmp-2021.2.0-h57928b3_616
libblas conda-forge/win-64::libblas-3.9.0-9_mkl
libcblas conda-forge/win-64::libcblas-3.9.0-9_mkl
liblapack conda-forge/win-64::liblapack-3.9.0-9_mkl
liblapacke conda-forge/win-64::liblapacke-3.9.0-9_mkl
libuv conda-forge/win-64::libuv-1.41.0-h8ffe710_0
m2w64-gcc-libgfor~ conda-forge/win-64::m2w64-gcc-libgfortran-5.3.0-6
m2w64-gcc-libs conda-forge/win-64::m2w64-gcc-libs-5.3.0-7
m2w64-gcc-libs-co~ conda-forge/win-64::m2w64-gcc-libs-core-5.3.0-7
m2w64-gmp conda-forge/win-64::m2w64-gmp-6.1.0-2
m2w64-libwinpthre~ conda-forge/win-64::m2w64-libwinpthread-git-5.0.0.4634.697f757-2
mkl conda-forge/win-64::mkl-2021.2.0-hb70f87d_389
mkl-devel conda-forge/win-64::mkl-devel-2021.2.0-h57928b3_390
mkl-include conda-forge/win-64::mkl-include-2021.2.0-hb70f87d_389
msys2-conda-epoch conda-forge/win-64::msys2-conda-epoch-20160418-1
ninja conda-forge/win-64::ninja-1.10.2-h5362a0b_0
numpy conda-forge/win-64::numpy-1.20.2-py39h6635163_0
python_abi conda-forge/win-64::python_abi-3.9-1_cp39
pytorch pytorch/win-64::pytorch-1.8.1-py3.9_cuda11.1_cudnn8_0
tbb conda-forge/win-64::tbb-2021.2.0-h2d74725_0
typing_extensions conda-forge/noarch::typing_extensions-3.7.4.3-py_0

The following packages will be UPDATED:

certifi pkgs/main::certifi-2020.12.5-py39haa9~ --> conda-forge::certifi-2020.12.5-py39hcbf5309_1
conda pkgs/main::conda-4.9.2-py39haa95532_0 --> conda-forge::conda-4.10.1-py39hcbf5309_0
openssl pkgs/main::openssl-1.1.1i-h2bbff1b_0 --> conda-forge::openssl-1.1.1k-h8ffe710_0


Proceed ([y]/n)?

”-c conda-forge" を付けて,Anacondaのレポジトリにあるライブラリではなくconda-forgeのライブラリをダウンロードするように指定する.

なお,Anacondaのリポジトリにあって,conda-forge にはないライブラリが運悪く必要になった場合は詰む.あきらめて,Anacondaを商用で使うか,pipで別にインストールするか,自分でソースコードからコンパイルして野良インストールするかなど,状況に応じていろいろ試すしかない.


Minicondaはいろいろ重要なライブラリが抜けている.Numpyも入っていない(上記のpytorchのインストール時には自動的に導入される).Jupyter Notebookは研究上欠かせないツールなので下記でインストールする.

conda install jupyter notebook -c conda-forge --override-channels

Scikit-Learnもインストールできる(裏を返せば,Minicondaには含まれていない).

conda install scikit-learn -c conda-forge --override-channels

以下,Anacondaレポジトリのライセンスが気になる方向け.

https://repo.anaconda.com/に対して商用利用のライセンスが設定されている.ここでは,Anacondaのレポジトリにアクセスせず, conda-forge で代用しているので,このライセンスの影響を受けない.conda-forge(https://conda-forge.org/)はフリーでのアクセスを許可している.Anacondaのレポジトリのライセンスは下記のようになっている.

www.anaconda.com

特にAnacondaレポジトリに対するアクセスが商用利用とみなされる場合の規定を引用する.

To avoid confusion, “commercial activities” are any use of the Repository which is NOT:

use solely by an individual using for personal, non-business purposes,
use by a student or employee of an educational institution in connection with educational activities,
use by an employee or volunteer on behalf of a non-profit institution in connection with the provision of charitable services,
use by a 501(c)(3) non-profit research institution in connection with non-commercial activities, such as research to address societal needs and global challenges, public policy development, or the advancement of science for the general good, where such work will not result in revenue to the institution, or
use by entities in common control with each other with fewer than 200 employees in aggregate.

試訳

混乱を避けるために「商用活動(commercial activities)」とは,リポジトリの利用であって,次に*含まれないもの*すべてである.

個人的な目的,非商用目的のために個人が利用する場合
教育活動に関連して教育機関の学生および被雇用者が利用する場合
慈善活動の提供に関連して非営利団体のために被雇用者やボランティアが利用する場合
非営利活動に関連して,501(c)(3)に該当する(※訳注:日本の公益法人に相当する)非営利の研究機関が利用する場合.例えば,公益にかなった,社会的ニーズや地球的規模の挑戦を扱う研究,公共政策開発,科学の進歩.ただし,機関の収入につながらないもの,または全体で200名未満が共通に統制された事業体による利用であること.

当然原文が優先で,私の試訳に正確でない部分があるかもしれませんが,普通の企業での利用は商用利用となるといって間違いはないでしょう.ただし,繰り返しになりますが,conda-forge などのリポジトリを利用するのであれば,minicondaからスタートしていれば問題ありません.あくまで,Anacondaのリポジトリの利用に対するライセンスが商用利用を制限しているからです.その理由は,営利利用のアクセスがAnacondaレポジトリに大量に発生していてレポジトリサーバー維持にかかる負荷が増大しているためだということのようです.個人的には,ミラーを(ボランティアベースで)用意すれば良いように思いますが,ライセンスの規定でミラー目的のレポジトリコンテンツのダウンロードを禁止していますので,現状では実現できません.

最後に:ライセンス関係は常に法的な問題を含みますので,上記の内容について何か損害が発生しても当方は一切の責任は負いません.不安があれば,法務部門や弁護士に相談してAnacondaレポジトリの規定(Terms of Service)を遵守してください.

20年前の日本語QA

最近久しぶりにQAに関係した研究をしたので,日本語QA技術に関する歴史を紹介してみる.

2001年に某研究所のオープンハウスにてQA技術を公開した.システム名はSAIQAである.この頃38才ぐらいなので一番エネルギーがあふれている頃.これは最初の実用的な日本語QAのシステムで,もうちょっと言えば,世界初の実用的日本語QAシステムである.この時点で新聞記事10年分から,自由文形式のクイズ的な質問の答えをリアルタイムで探すことができた.

オープンハウスでの展示の情報は今でも残っており,下記リンクの2-Aの展示「ずばり答えます、あなたの問いに ~大量のテキストに答を求める質問応答技術~」がそれ.この頃Luceneのような便利なツールは無かったので検索エンジンも自作だった.(※確か検索エンジンは現在東北大の鈴木さん作)

www.kecl.ntt.co.jp

ちなみにこのオープンハウスは研究所開設10周年記念を兼ねたイベントで私が実行委員長を務めた.この年は委員が全員特別に頑張ってバーチャルオープンハウスとしてイベントをHPにも掲載したので,今でもこうして振り返ることができる.(例年は通常の講演会とポスター発表で,発表内容の記録は紙のパンフレットとしてしか残っていない)


この日本語QAシステムはマスコミの評判が良く,新聞・雑誌多数に取り上げられ,NHKニュース10にも取材を受けて,2002年1月7日に約3分間のニュースになった.NHKの看板ニュース番組で3分間みっちり我々のQAシステムが取り上げられたということで,広告費に換算すると会社には莫大な貢献になったように思う.

f:id:YutakaSasaki:20210415153417p:plain
なんでも答えるコンピューター

htop

Unix系のtopコマンドは、プロセスの実行状況やCPU毎の負荷状態を見ることができて便利ですが、コア数(ハイパースレディング含む)が50ぐらいまでしか端末に表示できません。
96コア(192スレッド)のサーバーのCPU毎の状況は画面に収まりきらないため、どうしたものかと思って調べると htop というコマンドがありました。
htopでは、全コアの負荷状況がキャラクター端末上に棒グラフ形式で表示され、全体の負荷状況が一目で理解できます。

知識グラフと言語処理

最近、知識グラフに関する研究に注目しています。

知識グラフは、知識の断片を「主語ー述語ー目的語」の3つ組で表して、3つ組の集合として知識を記述する方法です。
このように3つ組にするということは、数学的には2項関係の集合として知識を書くこと、つまり2引数の原始論理式(Atomic Formula)の
集合として、知識を書くということになる。知識グラフというように、主語と目的語をノードとして、述語をエッジとして表せば、3つ組の集合はグラフ構造になります。

なお、知識グラフはオントロジーとはそのままでは対応しません。オントロジーの3つ組はRDF(またはRDFS)に沿っていなければなりません。特に、クラス間をリンクでつなぐのではなく、2つの概念ノード間を属性ノードを通してdomrain, rangeリンクでつなぐ形の3つ組でなければなりません。

話を戻して、知識グラフは、2項関係(事実型知識)しか表せませんので、記述できる知識は限られますがその分扱いが簡単になります。知識グラフに対して、知識グラフ上でのスコア関数を学習する(例えばTransE, ComplEx)ことで、ノードやリンクの予測(補完)問題を高い精度で解けるようになってきています。

さらに知識グラフと言語処理を深層学習のフレームワークの中で融合できる点が注目されます。2017年からSymbolic-Neural Learingをいう国際ワークショップを開催してきましたが、まさにこのような研究の盛り上がりを期待していたわけです。

余談ですが、国際会議の査読をしていると、時々純粋な知識グラフに関する論文が言語処理の国際会議に投稿されてきて、これは言語処理に関する国際会議のスコープ内の論文なのだろうかと悩むこともあります。何らかの形で言語処理とつないでくれれば悩まなくてよいのですが。