yasuokaの日記: 「令和」の係り受け解析エンジン(仮)としてのNLP-Cube
ゴールデンウィークも9日目なので、AdobeのNLP-Cube1.0.5向けの古典中国語(四書)モデルを試作してみた。出来たてのホヤホヤなので、あまりチューンアップ等していないのだが、python3とpip3があれば、以下の手順でインストールできる。
% pip3 install nlpcube
% python3
>>> from cube.io_utils.model_store import ModelStore
>>> ModelStore(cloud_path="http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/kyodokenkyu/2019-05-05/")._download_model("lzh",0.1)
>>> quit()
うまくlzh-0.1モデルがインストールできたら、「令和」の元ネタを係り受け解析してみよう。
% python3
>>> import cube.api,cube.io_utils.conll
>>> lzh=cube.api.Cube()
>>> lzh.load("lzh",0.1)
>>> d=cube.io_utils.conll.Dataset()
>>> d.sequences=lzh("天平二年正月十三日萃于帥老之宅申宴會也于時初春令月氣淑風和梅披鏡前之粉蘭薰珮後之香加以曙嶺移雲松掛羅而傾盖夕岫結霧鳥封縠而迷林庭舞新蝶空歸故鴈於是盖天促膝飛觴忘言一室之裏開衿煙霞之外淡然自放快然自足若非翰苑何以攄情詩紀落梅之篇古今夫何異矣宜賦園梅聊成短詠")
>>> d.write_stdout()
1 天 天 NOUN n,名詞,制度,場 Case=Loc 2 nsubj _ SpaceAfter=No
2 平 平 VERB v,動詞,描写,形質 Degree=Pos 0 root _ SpaceAfter=No
3 二 二 NUM n,数詞,数字,* _ 4 nummod _ SpaceAfter=No
4 年 年 NOUN n,名詞,固定物,関係 Case=Tem 2 obj _ SpaceAfter=No
1 正 正 VERB v,動詞,描写,形質 Degree=Pos|VerbForm=Part 2 amod _ SpaceAfter=No
2 月 月 NOUN n,名詞,固定物,関係 Case=Tem 3 obl:tmod _ SpaceAfter=No
3 十三 十三 NUM n,数詞,数,* _ 0 root _ SpaceAfter=No
4 日 日 NOUN n,名詞,時,* Case=Tem 5 obl:tmod _ SpaceAfter=No
5 萃 萃 VERB v,動詞,行為,動作 _ 3 conj _ SpaceAfter=No
6 于 于 ADP v,前置詞,基盤,* _ 10 case _ SpaceAfter=No
7 帥 帥 PROPN n,名詞,固定物,建造物 _ 10 nmod _ SpaceAfter=No
8 老 老 NOUN n,名詞,人,名 _ 10 nmod _ SpaceAfter=No
9 之 之 SCONJ p,助詞,接続,属格 _ 7 case _ SpaceAfter=No
10 宅 宅 NOUN v,動詞,行為,動作 _ 5 obl:lmod _ SpaceAfter=No
11 申 申 NOUN v,動詞,行為,動作 _ 5 obl:lmod _ SpaceAfter=No
12 宴 宴 NOUN v,動詞,行為,動作 _ 5 obl:lmod _ SpaceAfter=No
13 會 會 NOUN v,動詞,行為,動作 _ 10 conj _ SpaceAfter=No
14 也 也 PART p,助詞,句末,* _ 5 discourse:sp _ SpaceAfter=No
1 于 于 VERB v,前置詞,基盤,* _ 2 case _ SpaceAfter=No
2 時 時 NOUN n,名詞,固定物,関係 Case=Tem 3 obl:lmod _ SpaceAfter=No
3 初 初 VERB v,動詞,行為,動作 _ 7 nmod _ SpaceAfter=No
4 春 春 VERB n,名詞,固定物,関係 Case=Tem 7 nmod _ SpaceAfter=No
5 令 令 NOUN n,名詞,数量,* _ 7 amod _ SpaceAfter=No
6 月 月 NOUN n,名詞,固定物,関係 Case=Tem 22 nmod _ SpaceAfter=No
7 氣 氣 NOUN n,名詞,描写,形質 _ 23 nsubj _ SpaceAfter=No
8 淑 淑 VERB v,動詞,行為,動作 _ 23 nsubj _ SpaceAfter=No
9 風 風 VERB v,動詞,行為,動作 _ 23 nsubj _ SpaceAfter=No
10 和 和 VERB v,動詞,描写,形質 Degree=Pos|VerbForm=Part 23 nsubj _ SpaceAfter=No
11 梅 梅 NOUN v,動詞,行為,動作 _ 25 nsubj _ SpaceAfter=No
12 披 披 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
13 鏡 鏡 NOUN v,動詞,行為,動作 _ 20 compound _ SpaceAfter=No
14 前 前 NOUN n,名詞,固定物,関係 Case=Tem 34 nmod _ SpaceAfter=No
15 之 之 SCONJ p,助詞,接続,属格 _ 14 case _ SpaceAfter=No
16 粉 粉 NOUN v,動詞,行為,動作 _ 23 obj _ SpaceAfter=No
17 蘭 蘭 NOUN v,動詞,行為,動作 _ 23 obj _ SpaceAfter=No
18 薰 薰 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
19 珮 珮 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
20 後 後 NOUN n,名詞,固定物,関係 Case=Tem 34 nmod _ SpaceAfter=No
21 之 之 SCONJ p,助詞,接続,属格 _ 14 case _ SpaceAfter=No
22 香 香 NOUN v,動詞,行為,動作 _ 23 obj _ SpaceAfter=No
23 加 加 AUX v,動詞,行為,得失 _ 0 root _ SpaceAfter=No
24 以 以 VERB v,動詞,行為,動作 _ 23 advcl _ SpaceAfter=No
25 曙 曙 VERB v,動詞,行為,動作 _ 23 obj _ SpaceAfter=No
26 嶺 嶺 VERB v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
27 移 移 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
28 雲 雲 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
29 松 松 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
30 掛 掛 NOUN v,動詞,行為,動作 _ 25 conj _ SpaceAfter=No
31 羅 羅 NOUN v,動詞,行為,動作 _ 30 conj _ SpaceAfter=No
32 而 而 CCONJ p,助詞,接続,並列 _ 33 cc _ SpaceAfter=No
33 傾 傾 VERB v,動詞,行為,動作 _ 23 conj _ SpaceAfter=No
34 盖 盖 VERB v,動詞,行為,動作 _ 33 obj _ SpaceAfter=No
35 夕 夕 NOUN v,動詞,行為,動作 _ 34 conj _ SpaceAfter=No
36 岫 岫 NOUN v,動詞,行為,動作 _ 34 conj _ SpaceAfter=No
37 結 結 NOUN v,動詞,行為,動作 _ 34 conj _ SpaceAfter=No
38 霧 霧 NOUN v,動詞,描写,形質 _ 34 conj _ SpaceAfter=No
39 鳥 鳥 NOUN n,名詞,主体,動物 _ 33 obj _ SpaceAfter=No
1 封 封 VERB v,動詞,描写,態度 _ 0 root _ SpaceAfter=No
2 縠 縠 VERB v,動詞,行為,動作 _ 1 obj _ SpaceAfter=No
3 而 而 CCONJ p,助詞,接続,並列 _ 4 cc _ SpaceAfter=No
4 迷 迷 VERB v,動詞,行為,動作 _ 1 conj _ SpaceAfter=No
5 林 林 VERB v,動詞,行為,動作 _ 4 obj _ SpaceAfter=No
6 庭 庭 VERB v,動詞,行為,動作 _ 5 conj _ SpaceAfter=No
7 舞 舞 VERB v,動詞,行為,動作 _ 5 conj _ SpaceAfter=No
8 新 新 VERB v,動詞,行為,動作 _ 5 conj _ SpaceAfter=No
9 蝶 蝶 VERB v,動詞,行為,動作 _ 8 conj _ SpaceAfter=No
10 空 空 NOUN v,動詞,行為,動作 _ 11 nsubj _ SpaceAfter=No
11 歸 歸 VERB v,動詞,行為,移動 _ 9 conj _ SpaceAfter=No
1 故 故 ADV v,副詞,判断,確定 _ 2 advmod _ SpaceAfter=No
2 鴈 鴈 VERB v,動詞,行為,動作 _ 0 root _ SpaceAfter=No
3 於 於 ADP v,前置詞,基盤,* _ 5 case _ SpaceAfter=No
4 是 是 PRON n,代名詞,指示,* PronType=Dem 5 det _ SpaceAfter=No
5 盖 盖 VERB v,動詞,行為,動作 _ 2 obl:lmod _ SpaceAfter=No
1 天 天 NOUN n,名詞,制度,場 Case=Loc 2 obl:tmod _ SpaceAfter=No
2 促 促 NOUN v,動詞,行為,動作 _ 26 nsubj _ SpaceAfter=No
3 膝 膝 NOUN v,動詞,行為,動作 _ 2 conj _ SpaceAfter=No
4 飛 飛 NOUN v,動詞,行為,動作 _ 2 conj _ SpaceAfter=No
5 觴 觴 NOUN v,動詞,行為,動作 _ 2 conj _ SpaceAfter=No
6 忘 忘 VERB v,動詞,行為,動作 _ 2 parataxis _ SpaceAfter=No
7 言 言 NOUN n,名詞,可搬,伝達 _ 21 nsubj _ SpaceAfter=No
8 一 一 NUM n,数詞,数字,* _ 9 nummod _ SpaceAfter=No
9 室 室 NOUN n,名詞,固定物,建造物 Case=Loc 17 nmod _ SpaceAfter=No
10 之 之 SCONJ p,助詞,接続,属格 _ 9 case _ SpaceAfter=No
11 裏 裏 NOUN v,動詞,描写,形質 _ 26 nsubj _ SpaceAfter=No
12 開 開 NOUN v,動詞,描写,形質 _ 21 obj _ SpaceAfter=No
13 衿 衿 NOUN v,動詞,描写,形質 _ 14 conj _ SpaceAfter=No
14 煙 煙 NOUN v,動詞,描写,形質 _ 9 conj _ SpaceAfter=No
15 霞 霞 NOUN v,動詞,描写,形質 _ 9 conj _ SpaceAfter=No
16 之 之 SCONJ p,助詞,接続,属格 _ 9 case _ SpaceAfter=No
17 外 外 NOUN n,名詞,固定物,関係 Case=Loc 26 obj _ SpaceAfter=No
18 淡 淡 NOUN v,動詞,描写,形質 Degree=Pos 26 obj _ SpaceAfter=No
19 然 然 PART v,動詞,描写,態度 _ 26 advmod _ SpaceAfter=No
20 自 自 PRON n,代名詞,人称,他 PronType=Prs|Reflex=Yes 26 obj _ SpaceAfter=No
21 放 放 VERB v,動詞,行為,動作 _ 26 ccomp _ SpaceAfter=No
22 快 快 VERB v,動詞,描写,形質 Degree=Pos 28 obj _ SpaceAfter=No
23 然 然 PART v,動詞,描写,態度 _ 26 advmod _ SpaceAfter=No
24 自 自 PRON v,前置詞,経由,* _ 26 obj _ SpaceAfter=No
25 足 足 AUX v,助動詞,可能,* Mood=Pot 26 aux _ SpaceAfter=No
26 若 若 VERB v,動詞,行為,分類 Degree=Equ 0 root _ SpaceAfter=No
27 非 非 ADV v,副詞,否定,体言否定 Polarity=Neg 26 advmod _ SpaceAfter=No
28 翰 翰 VERB v,動詞,行為,動作 _ 26 ccomp _ SpaceAfter=No
29 苑 苑 NOUN v,動詞,行為,動作 _ 26 obj _ SpaceAfter=No
30 何 何 PRON n,代名詞,疑問,* AdvType=Cau 26 obj _ SpaceAfter=No
31 以 以 VERB v,動詞,行為,動作 _ 26 advcl _ SpaceAfter=No
32 攄 攄 VERB v,動詞,行為,動作 _ 26 obj _ SpaceAfter=No
33 情 情 VERB v,動詞,行為,動作 _ 26 obj _ SpaceAfter=No
1 詩 詩 NOUN n,名詞,主体,書物 _ 2 nsubj _ SpaceAfter=No
2 紀 紀 VERB v,動詞,行為,動作 _ 0 root _ SpaceAfter=No
3 落 落 NOUN v,動詞,行為,動作 _ 2 obj _ SpaceAfter=No
4 梅 梅 NOUN v,動詞,行為,動作 _ 3 conj _ SpaceAfter=No
5 之 之 SCONJ p,助詞,接続,属格 _ 3 case _ SpaceAfter=No
6 篇 篇 NOUN n,名詞,可搬,伝達 _ 2 obj _ SpaceAfter=No
7 古 古 NOUN n,名詞,固定物,関係 Case=Tem 6 obj _ SpaceAfter=No
1 今 今 NOUN n,名詞,時,* Case=Tem 2 nmod _ SpaceAfter=No
2 夫 夫 PART n,名詞,人,人 _ 4 nsubj _ SpaceAfter=No
3 何 何 ADV n,代名詞,疑問,* AdvType=Cau 4 advmod _ SpaceAfter=No
4 異 異 VERB v,動詞,描写,形質 Degree=Pos 0 root _ SpaceAfter=No
5 矣 矣 PART p,助詞,句末,* _ 4 discourse:sp _ SpaceAfter=No
1 宜 宜 AUX v,動詞,行為,動作 Person=1|PronType=Prs 2 aux _ SpaceAfter=No
2 賦 賦 VERB v,動詞,描写,形質 _ 0 root _ SpaceAfter=No
3 園 園 VERB v,動詞,行為,動作 _ 2 obj _ SpaceAfter=No
4 梅 梅 VERB v,動詞,行為,動作 _ 2 obj _ SpaceAfter=No
1 聊 聊 VERB v,動詞,描写,形質 _ 2 nsubj _ SpaceAfter=No
2 成 成 VERB v,動詞,行為,生産 _ 0 root _ SpaceAfter=No
3 短 短 VERB v,動詞,描写,量 Degree=Pos 2 obj _ SpaceAfter=No
1 詠 詠 VERB v,動詞,行為,動作 _ 0 root _ SpaceAfter=No
残念ながらNLP-Cubeも「文切り&単語切り」→「品詞付与」→「係り受け解析」という順序でモデル化されており、最初の「文切り」でしくじると、かなり絶望的な結果になる。ただ、NLP-Cubeのパイプラインは公開されている上に、言語モデルの作成ツールも一緒に付いてくる。頑張れば、もう少しチューンアップできそうな気がする。
とりあえず、このlzh-0.1モデルを作成するのに使ったシェルスクリプトを、以下に公開しておく。残念ながら、私(安岡孝一)の手元の非力なマシンでは、いくらdynetをメニーコアやGPU化しても、--patienceオプションを1より大きくするのすら、時間的に苦しかった。我こそはと思う方は、是非もっと高精度な古典中国語モデルを作成して、lzh-1.0モデルとして公開してほしい。
#! /bin/sh
TARGET=lzh-0.1
GITHUB=https://github.com/UniversalDependencies/UD_Classical_Chinese-Kyoto.git
BRANCH=dev
PIPELINE='tokenizer lemmatizer tagger parser'
OPTIONS='--autobatch --patience=1'
VECTOR=https://raw.githubusercontent.com/adobe/NLP-Cube/master/examples/wiki.dummy.vec
PYTHON=/usr/bin/python3.7
CUBEDIR=$HOME/.local/lib/python3.7/site-packages/cube
MODELDIR=$HOME/.nlpcube/models
if [ ! -d $CUBEDIR ]
then echo 'please "pip3 install nlpcube" or change CUBEDIR' >&2
exit 1
fi
V=$MODELDIR/embeddings/`basename $VECTOR`
if [ ! -s $V ]
then mkdir -p $MODELDIR/embeddings
wget $VECTOR -O $V
fi
if [ -d $MODELDIR/$TARGET ]
then echo $MODELDIR/$TARGET already exits >&2
exit 1
fi
cd $MODELDIR
git clone -b $BRANCH $GITHUB
if mv `basename $GITHUB .git` $TARGET
then :
else echo Cannot get $GITHUB >&2
exit 1
fi
cd $TARGET
OP="$OPTIONS --embeddings=$V"
for F in *.conllu
do T=`basename $F .conllu`.txt
B=`expr $T : '.*-\([a-z]*\)\.txt$'`
sed -n 's/^# text = //p' $F > $T
OP="$OP --$B-file=$MODELDIR/$TARGET/$F --raw-$B-file=$MODELDIR/$TARGET/$T"
done
cd $CUBEDIR/..
for P in $PIPELINE
do $PYTHON cube/main.py train --train=$P --store=$MODELDIR/$TARGET/$P $OP
done
( echo '{'
echo ' "embeddings_file_name": "'`basename $VECTOR`'",'
echo ' "embeddings_remote_link": "'$VECTOR'",'
L=`expr $TARGET : '\([a-z]*\)-'`
echo ' "language_code": "'$L'",'
date +' "model_build_date": "%F",'
echo ' "model_build_source": "'`basename $GITHUB .git`'",'
echo ' "model_version": '`expr $TARGET : '[a-z]*-\([0-9.]*\)'`,
case $L in
lzh|zh|ja) echo ' "token_delimiter": ""' ;;
*) echo ' "token_delimiter": " "' ;;
esac
echo '}'
) > $MODELDIR/$TARGET/metadata.json
exit 0
「令和」の係り受け解析エンジン(仮)としてのNLP-Cube More ログイン