昨日の記事で書いたjdepp-python 0.17の(二文節間)係り受け解析プログラムを、スーパーコンピュータ「富岳」のspack0.19版python3.10に移植してみた。
#! /bin/bash
#PJM -L rscgrp=small
#PJM -L elapse=1:00:00
#PJM -L node=1
#PJM -j
#PJM -S
. /vol0004/apps/oss/spack/share/spack/setup-env.sh
spack load py-cython@0.29.32/wmhf2on
G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/J.DepP
export TMPDIR=$PYTHONUSERBASE/tmp
mkdir -p $TMPDIR
cd $TMPDIR
pip3 install -U jagger jdepp --user
test -d model/kwdlc || curl -L https://github.com/lighttransport/jagger-python/releases/download/v0.1.0/model_kwdlc.tar.gz | tar xzf -
test -d model/knbc || curl -L https://github.com/lighttransport/jdepp-python/releases/download/v0.1.0/knbc-mecab-jumandic-2ndpoly.tar.gz | tar xzf -
P=$PJM_JOBID.$$.py
cat << 'EOF' > $P
import jagger,jdepp
tagger=jagger.Jagger()
tagger.load_model("model/kwdlc/patterns")
parser=jdepp.Jdepp()
parser.load_model("model/knbc")
nlp=lambda x:parser.parse_from_postagged("\n".join(t.surface()+"\t"+t.feature() for t in tagger.tokenize(x))+"\nEOS\n")
doc=nlp("吾輩はここで始めて人間というものを見た")
print(doc,jdepp.to_tree(str(doc)),sep="\n")
EOF
python3 $P
富岳のログインノードからpjsub
してみたところ、ジョブ待ち・ダウンロード等も含め、15分ほどで以下の結果が得られた。
# S-ID: 1; J.DepP
* 0 6D
吾輩 名詞,普通名詞,*,*,吾輩,わがはい,代表表記:我が輩/わがはい カテゴリ:人
は 助詞,副助詞,*,*,は,は,*
* 1 2D
ここ 指示詞,名詞形態指示詞,*,*,ここ,ここ,*
で 助詞,格助詞,*,*,で,で,*
* 2 6D
始めて 動詞,*,母音動詞,タ系連用テ形,始める,はじめて,*
* 3 4D
人間 名詞,普通名詞,*,*,人間,にんげん,*
と 助詞,格助詞,*,*,と,と,*
* 4 5D
いう 動詞,*,子音動詞ワ行,基本形,いう,いう,*
* 5 6D
もの 名詞,形式名詞,*,*,もの,もの,*
を 助詞,格助詞,*,*,を,を,*
* 6 -1D
見た 動詞,*,母音動詞,タ形,見る,みた,*
EOS
# S-ID: 1; J.DepP
0: 吾輩は━━┓
1: ここで━━┓ ┃
2: 始めて━━┫
3: 人間と━━┓ ┃
4: いう━━┓ ┃
5: ものを━━┫
6: 見たEOS
jdepp.to_tree()
が少しズレていて、EOSが妙なところにくっついているものの、ちゃんと解析できているようだ。ただ、このやり方だと、manylinux2014_aarch64のバイナリをそのまま使ってしまうため、富岳のa64fxがイマイチ生かせていない。さて、どうしたら、もう少し高速になるかな。