パスワードを忘れた? アカウント作成
14140730 journal
アメリカ合衆国

yasuokaの日記: 多言語文法解析ツールStanzaリリース

日記 by yasuoka

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に追いついてくるのだろうから、私も頑張って研究しなきゃ。

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー

読み込み中...