🐕

Google Colaboratoryで日本語構文・格・照応解析システムKNPを動作させてみる

2022/11/03に公開

目的

KNPはJuman++の解析結果(形態素列)を入力とし、文節および基本句間の係り受け関係、格関係、照応関係を出力する。
今回はGoogle ColaboratoryでKNPを動作させる方法について記述する

この記事は2022/11/03時点のもので、今後のバージョンアップで動作しなくなる可能性がある。

juman++のインストール

!wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.02.tar.xz
!tar xJvf jumanpp-1.02.tar.xz
%cd jumanpp-1.02
!./configure
!make
!sudo make install
%cd /content

KNPのインストール

!apt install libtool autotools-dev autoconf -y
%cd /content
!git clone https://github.com/ku-nlp/knp.git
%cd knp
!./autogen.sh
!wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/knp/dict/latest/knp-dict-latest-bin.zip # ビルド済み辞書(2.6GB)
!unzip knp-dict-latest-bin.zip
!cp -ars `pwd`/dict-bin/* ./dict
!./configure
!make
!make install 
%cd /content

pyknpのインストール

pythonでknpを使用するためpyknpをインストールする

!pip install pyknp

実験

形態素解析の例

from __future__ import unicode_literals # It is not necessary when you use python3.
from pyknp import Juman
jumanpp = Juman()   # default is JUMAN++: Juman(jumanpp=True). if you use JUMAN, use Juman(jumanpp=False)
result = jumanpp.analysis("下鴨神社の参道は暗かった。")
for mrph in result.mrph_list(): # 各形態素にアクセス
    print("見出し:%s, 読み:%s, 原形:%s, 品詞:%s, 品詞細分類:%s, 活用型:%s, 活用形:%s, 意味情報:%s, 代表表記:%s" \
            % (mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname))

出力:

見出し:下鴨, 読み:しもがも, 原形:下鴨, 品詞:名詞, 品詞細分類:地名, 活用型:*, 活用形:*, 意味情報:自動獲得:Wikipedia Wikipedia地名, 代表表記:
見出し:神社, 読み:じんじゃ, 原形:神社, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:神社/じんじゃ 地名末尾 カテゴリ:場所-施設 ドメイン:文化・芸術, 代表表記:神社/じんじゃ
見出し:の, 読み:の, 原形:の, 品詞:助詞, 品詞細分類:接続助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:参道, 読み:さんどう, 原形:参道, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:参道/さんどう カテゴリ:場所-施設 ドメイン:文化・芸術, 代表表記:参道/さんどう
見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:暗かった, 読み:くらかった, 原形:暗い, 品詞:形容詞, 品詞細分類:*, 活用型:イ形容詞アウオ段, 活用形:タ形, 意味情報:代表表記:暗い/くらい, 代表表記:暗い/くらい
見出し:。, 読み:。, 原形:。, 品詞:特殊, 品詞細分類:句点, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:

構文・格解析の例

from __future__ import unicode_literals # It is not necessary when you use python3.
from pyknp import KNP
knp = KNP() # Default is JUMAN++. If you use JUMAN, use KNP(jumanpp=False)
result = knp.parse("下鴨神社の参道は暗かった。")

print("文節")
for bnst in result.bnst_list(): # 各文節へのアクセス
    print("\tID:%d, 見出し:%s, 係り受けタイプ:%s, 親文節ID:%d, 素性:%s" \
            % (bnst.bnst_id, "".join(mrph.midasi for mrph in bnst.mrph_list()), bnst.dpndtype, bnst.parent_id, bnst.fstring))

print("基本句")
for tag in result.tag_list(): # 各基本句へのアクセス
    print("\tID:%d, 見出し:%s, 係り受けタイプ:%s, 親基本句ID:%d, 素性:%s" \
            % (tag.tag_id, "".join(mrph.midasi for mrph in tag.mrph_list()), tag.dpndtype, tag.parent_id, tag.fstring))

print("形態素")
for mrph in result.mrph_list(): # 各形態素へのアクセス
    print("\tID:%d, 見出し:%s, 読み:%s, 原形:%s, 品詞:%s, 品詞細分類:%s, 活用型:%s, 活用形:%s, 意味情報:%s, 代表表記:%s" \
            % (mrph.mrph_id, mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname))

出力

文節
	ID:0, 見出し:下鴨神社の, 係り受けタイプ:D, 親文節ID:1, 素性:<SM-主体><SM-場所><SM-組織><BGH:神社/じんじゃ><文頭><地名><助詞><連体修飾><体言><係:ノ格><区切:0-4><準主題表現><正規化代表表記:下鴨/しもがも+神社/じんじゃ><主辞代表表記:神社/じんじゃ>
	ID:1, 見出し:参道は, 係り受けタイプ:D, 親文節ID:2, 素性:<BGH:参道/さんどう><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><正規化代表表記:参道/さんどう><主辞代表表記:参道/さんどう>
	ID:2, 見出し:暗かった。, 係り受けタイプ:D, 親文節ID:-1, 素性:<BGH:暗い/くらい><文末><時制:過去><句点><用言:形><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><状態述語><正規化代表表記:暗い/くらい><主辞代表表記:暗い/くらい>
基本句
	ID:0, 見出し:下鴨, 係り受けタイプ:D, 親基本句ID:1, 素性:<文節内><係:文節内><文頭><地名><体言><名詞項候補><先行詞候補><SM-場所><正規化代表表記:下鴨/しもがも>
	ID:1, 見出し:神社の, 係り受けタイプ:D, 親基本句ID:2, 素性:<SM-主体><SM-場所><SM-組織><BGH:神社/じんじゃ><地名><助詞><連体修飾><体言><係:ノ格><区切:0-4><準主題表現><名詞項候補><先行詞候補><係チ:非用言格解析||用言&&文節内:T解析格-ヲ><正規化代表表記:神社/じんじゃ><主辞代表表記:神社/じんじゃ>
	ID:2, 見出し:参道は, 係り受けタイプ:D, 親基本句ID:3, 素性:<BGH:参道/さんどう><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:参道/さんどう><主辞代表表記:参道/さんどう><解析格:ガ>
	ID:3, 見出し:暗かった。, 係り受けタイプ:D, 親基本句ID:-1, 素性:<BGH:暗い/くらい><文末><時制:過去><句点><用言:形><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><状態述語><正規化代表表記:暗い/くらい><主辞代表表記:暗い/くらい><用言代表表記:暗い/くらい><節-区切><節-主辞><主題格:一人称優位><格関係2:ガ:参道><格解析結果:暗い/くらい:形27:ガ/N/参道/2/0/1;ト/U/-/-/-/-><標準用言代表表記:暗い/くらい>
形態素
	ID:0, 見出し:下鴨, 読み:しもがも, 原形:下鴨, 品詞:名詞, 品詞細分類:地名, 活用型:*, 活用形:*, 意味情報:自動獲得:Wikipedia Wikipedia地名 疑似代表表記 代表表記:下鴨/しもがも, 代表表記:下鴨/しもがも
	ID:1, 見出し:神社, 読み:じんじゃ, 原形:神社, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:神社/じんじゃ 地名末尾 カテゴリ:場所-施設 ドメイン:文化・芸術, 代表表記:神社/じんじゃ
	ID:2, 見出し:の, 読み:の, 原形:の, 品詞:助詞, 品詞細分類:接続助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
	ID:3, 見出し:参道, 読み:さんどう, 原形:参道, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:参道/さんどう カテゴリ:場所-施設 ドメイン:文化・芸術, 代表表記:参道/さんどう
	ID:4, 見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
	ID:5, 見出し:暗かった, 読み:くらかった, 原形:暗い, 品詞:形容詞, 品詞細分類:*, 活用型:イ形容詞アウオ段, 活用形:タ形, 意味情報:代表表記:暗い/くらい, 代表表記:暗い/くらい
	ID:6, 見出し:。, 読み:。, 原形:。, 品詞:特殊, 品詞細分類:句点, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:

参考

Discussion