yasuokaの日記: 多言語文法解析ツールStanzaリリース
StanfordNLPの後継にあたる多言語文法解析ツールStanzaがリリースされたので、とりあえず使ってみた。68言語をサポートしていて、ちゃんと古典中国語(漢文)も解析可能なのが、私(安岡孝一)個人としても非常にうれしい。さっそく、インストールしてみよう。
$ pip3 install stanza
LinuxやMac OS Xなら、インストールはpip一発で、非常に簡単。Cygwin (64bit)でも、python37-devel python37-pip python37-cython python37-numpy gcc-g++の最新版を入れておけば
$ pip3.7 install torch -f https://github.com/KoichiYasuoka/CygTorch
$ pip3.7 install stanza
の2行で済むのが、これまたうれしい。インストールがうまくいったら、まずは古典中国語(漢文)モデルをダウンロードしてみよう。
$ python3
>>> import stanza
>>> stanza.download("lzh")
stanza_resourcesという長い名前のディレクトリを勝手に作るのが、ちょっとイラっと来るが、ダウンロード自体はまずまず早い。次に「不入虎穴不得虎子」を係り受け解析してみよう。
>>> lzh=stanza.Pipeline("lzh")
>>> s=lzh("不入虎穴不得虎子")
>>> print(s)
[
[
{
"id": "1",
"text": "不",
"lemma": "不",
"upos": "ADV",
"xpos": "v,副詞,否定,無界",
"feats": "Polarity=Neg",
"head": 2,
"deprel": "advmod",
"misc": "start_char=0|end_char=1"
},
{
"id": "2",
"text": "入",
"lemma": "入",
"upos": "VERB",
"xpos": "v,動詞,行為,移動",
"head": 0,
"deprel": "root",
"misc": "start_char=1|end_char=2"
},
{
"id": "3",
"text": "虎",
"lemma": "虎",
"upos": "NOUN",
"xpos": "n,名詞,主体,動物",
"head": 2,
"deprel": "obj",
"misc": "start_char=2|end_char=3"
},
{
"id": "4",
"text": "穴",
"lemma": "穴",
"upos": "NOUN",
"xpos": "n,名詞,固定物,地形",
"feats": "Case=Loc",
"head": 3,
"deprel": "conj",
"misc": "start_char=3|end_char=4"
}
],
[
{
"id": "1",
"text": "不",
"lemma": "不",
"upos": "ADV",
"xpos": "v,副詞,否定,無界",
"feats": "Polarity=Neg",
"head": 2,
"deprel": "advmod",
"misc": "start_char=4|end_char=5"
},
{
"id": "2",
"text": "得",
"lemma": "得",
"upos": "VERB",
"xpos": "v,動詞,行為,得失",
"head": 0,
"deprel": "root",
"misc": "start_char=5|end_char=6"
},
{
"id": "3",
"text": "虎",
"lemma": "虎",
"upos": "NOUN",
"xpos": "n,名詞,主体,動物",
"head": 2,
"deprel": "obj",
"misc": "start_char=6|end_char=7"
},
{
"id": "4",
"text": "子",
"lemma": "子",
"upos": "NOUN",
"xpos": "n,名詞,人,関係",
"head": 3,
"deprel": "conj",
"misc": "start_char=7|end_char=8"
}
]
]
出力フォーマットがJSON風で、私個人としては読みにくい。Universal DependenciesのCoNLL-Uフォーマットに変換してみよう。
>>> from stanza.utils.conll import CoNLL
>>> print(CoNLL.conll_as_string(CoNLL.convert_dict(s.to_dict())))
1 不 不 ADV v,副詞,否定,無界 Polarity=Neg 2 advmod _ start_char=0|end_char=1
2 入 入 VERB v,動詞,行為,移動 _ 0 root _ start_char=1|end_char=2
3 虎 虎 NOUN n,名詞,主体,動物 _ 2 obj _ start_char=2|end_char=3
4 穴 穴 NOUN n,名詞,固定物,地形 Case=Loc 3 conj _ start_char=3|end_char=4
1 不 不 ADV v,副詞,否定,無界 Polarity=Neg 2 advmod _ start_char=4|end_char=5
2 得 得 VERB v,動詞,行為,得失 _ 0 root _ start_char=5|end_char=6
3 虎 虎 NOUN n,名詞,主体,動物 _ 2 obj _ start_char=6|end_char=7
4 子 子 NOUN n,名詞,人,関係 _ 3 conj _ start_char=7|end_char=8
うーむ、「不入虎穴」と「不入虎子」に文を区切ってしまうのは、まあ許すとしても、「虎─conj→穴」と「虎─conj→子」はいただけない。そこは頑張って「虎←nmod─穴」と「虎←nmod─子」にしてほしいところだ。まあ、それでも、いずれはUD-Kanbunに追いついてくるのだろうから、私も頑張って研究しなきゃ。
多言語文法解析ツールStanzaリリース More ログイン