パスワードを忘れた? アカウント作成
14174696 journal
人工知能

yasuokaの日記: 『言語処理100本ノック 2020』「48. 名詞から根へのパスの抽出」をCamphr-KNPで解いてみる

日記 by yasuoka

昨日の日記に続いて、『言語処理100本ノック 2020』の「48. 名詞から根へのパスの抽出」を、Camphr-KNPで解いてみることにした。ただし、クラスMorphChunkの代わりに、それぞれTokenSpanを拡張する形にして、Google Colaboratoryを使ってみた。

!apt-get install juman juman-dic libjuman-dev libcdb-dev
!mkdir -p /usr/local/share ; ln -s /usr/lib/juman /usr/local/share
!test -f knp-4.19.tar.bz2 || wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2
!test -d knp-4.19 || ( tar xjf knp-4.19.tar.bz2 && cd knp-4.19 && ./configure && make install )
!pip install 'camphr[juman]'

from spacy.tokens import Token,Span,Doc
Token.set_extension("surface",getter=lambda token:token.orth_,force=True)
Token.set_extension("base",getter=lambda token:token.lemma_,force=True)
Token.set_extension("pos",getter=lambda token:token.pos_,force=True)
Token.set_extension("pos1",getter=lambda token:token.tag_,force=True)
Span.set_extension("morphs",getter=lambda span:span,force=True)
Span.set_extension("dst",getter=lambda span:span.doc._.chunks.index(span._.knp_tag_parent if span._.knp_tag_parent else span),force=True)
Span.set_extension("srcs",getter=lambda span:[span.doc._.chunks.index(c) for c in span._.knp_tag_children],force=True)
Doc.set_extension("chunks",getter=lambda doc:[s for s in doc._.knp_tag_spans],force=True)

import camphr
nlp=camphr.load("knp")
doc=nlp("吾輩はここで始めて人間というものを見た")
chunks=doc._.chunks
for c in chunks:
  if [t for t in c._.morphs if t._.pos in {"NOUN","PRON","PROPN"}]!=[]:
    s=str(c)
    c=c._.knp_tag_parent
    while c:
      s+=" -> "+str(c)
      c=c._.knp_tag_parent
    print(s)

KNPのインストールに時間がかかるものの、私(安岡孝一)の手元では以下の結果になった。

吾輩は -> 見た
ここで -> 始めて -> 見た
人間と -> いう -> ものを -> 見た
ものを -> 見た

こんなわけで、KNPやGiNZAはspaCyに繋ぐことができるし、spaCy上のTokenを形態素に、Spanを文節に、Docを文(あるいは文章全体)に、それぞれ対応させて課題を解くことができる。一方、一昨日の日記にも書いたが、CaboChaはそういう用途に使えない上に、係り受け解析の精度が低い。今さら、係り受け解析にCaboChaを使う理由は無いのだが、『言語処理100本ノック 2020』は、どうしてCaboChaを指定しているんだろう。

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

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...