pyknp: Python Module for JUMAN++/KNP¶
About¶
形態素解析器JUMAN++(JUMAN)と構文解析器KNPのPythonバインディング (Python2系,3系の両方に対応)
Requirements¶
Install pyknp¶
% pip install pyknp
A Simple Explanation of JUMAN++/KNP¶
形態素解析器JUMAN++は文を形態素(Morpheme)単位に分割する。 構文解析器KNPでは文を3つの粒度、文節(Bunsetsu)、基本句(Tag)、形態素で扱い、 文節および基本句間の係り受け関係・格関係・照応関係を出力する。
各粒度による文分割の例:
下鴨神社の参道は暗かった。
文節区切り: 下鴨神社の|参道は|暗かった。
基本句区切り: 下鴨|神社の|参道は|暗かった。
形態素区切り: 下鴨|神社|の|参道|は|暗かった|。
係り受け解析・格解析の例:
下鴨神社の参道は暗かった。
# S-ID:1 KNP:4.2-32bec061 DATE:2018/09/06 SCORE:-18.37446
下鴨──┐ <体言>
神社の──┐ <体言>
参道は──┐ <体言>
暗かった。<用言:形><格解析結果:ガ/参道;ト/->
EOS
Usage¶
JUMAN++
JUMAN++の実行例
% echo "下鴨神社の参道は暗かった。" | jumanpp
下鴨 しもがも 下鴨 名詞 6 地名 4 * 0 * 0 "自動獲得:Wikipedia Wikipedia地名"
神社 じんじゃ 神社 名詞 6 普通名詞 1 * 0 * 0 "代表表記:神社/じんじゃ ドメイン:文化・芸術 カテゴリ:場所-施設 地名末尾"
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL
参道 さんどう 参道 名詞 6 普通名詞 1 * 0 * 0 "代表表記:参道/さんどう ドメイン:文化・芸術 カテゴリ:場所-施設"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
暗かった くらかった 暗い 形容詞 3 * 0 イ形容詞アウオ段 18 タ形 8 "代表表記:暗い/くらい"
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS
pyknpを用いた解析プログラム
--- example_juman.py ---
# coding: utf-8
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))
プログラムの出力結果
% python3 example_juman.py
見出し:下鴨, 読み:しもがも, 原形:下鴨, 品詞:名詞, 品詞細分類:地名, 活用型:*, 活用形:*, 意味情報:自動獲得:Wikipedia Wikipedia地名, 代表表記:
見出し:神社, 読み:じんじゃ, 原形:神社, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:神社/じんじゃ ドメイン:文化・芸術 カテゴリ:場所-施設 地名末尾, 代表表記:神社/じんじゃ
見出し:の, 読み:の, 原形:の, 品詞:助詞, 品詞細分類:接続助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:参道, 読み:さんどう, 原形:参道, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:参道/さんどう ドメイン:文化・芸術 カテゴリ:場所-施設, 代表表記:参道/さんどう
見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:暗かった, 読み:くらかった, 原形:暗い, 品詞:形容詞, 品詞細分類:*, 活用型:イ形容詞アウオ段, 活用形:タ形, 意味情報:代表表記:暗い/くらい, 代表表記:暗い/くらい
見出し:。, 読み:。, 原形:。, 品詞:特殊, 品詞細分類:句点, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
KNP
% echo "下鴨神社の参道は暗かった。" | jumanpp | knp -tab
# S-ID:1 KNP:4.2-32bec061 DATE:2018/09/07 SCORE:-18.37446
* 1D <SM-主体><SM-場所><SM-組織><BGH:神社/じんじゃ><文頭><地名><助詞><連体修飾><体言><係:ノ格><区切:0-4><準主題表現><正規化代表表記:下鴨/しもがも+神社/じんじゃ><主辞代表表記:神社/じんじゃ>
+ 1D <文節内><係:文節内><文頭><地名><体言><名詞項候補><先行詞候補><SM-場所><正規化代表表記:下鴨/しもがも>
下鴨 しもがも 下鴨 名詞 6 地名 4 * 0 * 0 "自動獲得:Wikipedia Wikipedia地名 疑似代表表記 代表表記:下鴨/しもがも" <自動獲得:Wikipedia><Wikipedia地名><疑似代表表記><代表表記:下鴨/しもがも><正規化代表表記:下鴨/しもがも><漢字><かな漢字><名詞相当語><文頭><自立><内容語><タグ単位始><文節始><固有キー><用言表記末尾>
+ 2D <SM-主体><SM-場所><SM-組織><BGH:神社/じんじゃ><地名><助詞><連体修飾><体言><係:ノ格><区切:0-4><準主題表現><名詞項候補><先行詞候補><係チ:非用言格解析||用言&&文節内:T解析格-ヲ><正規化代表表記:神社/じんじゃ><主辞代表表記:神社/じんじゃ>
神社 じんじゃ 神社 名詞 6 普通名詞 1 * 0 * 0 "代表表記:神社/じんじゃ 地名末尾 カテゴリ:場所-施設 ドメイン:文化・芸術" <代表表記:神社/じんじゃ><地名末尾><カテゴリ:場所-施設><ドメイン:文化・芸術><正規化代表表記:神社/じんじゃ><漢字><かな漢字><名詞相当語><自立><複合←><内容語><タグ単位始><文節主辞>
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* 2D <BGH:参道/さんどう><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><正規化代表表記:参道/さんどう><主辞代表表記:参道/さんどう>
+ 3D <BGH:参道/さんどう><ハ><助詞><体言><係:未格><提題><区切:3-5><主題表現><格要素><連用要素><名詞項候補><先行詞候補><正規化代表表記:参道/さんどう><主辞代表表記:参道/さんどう><解析格:ガ>
参道 さんどう 参道 名詞 6 普通名詞 1 * 0 * 0 "代表表記:参道/さんどう カテゴリ:場所-施設 ドメイン:文化・芸術" <代表表記:参道/さんどう><カテゴリ:場所-施設><ドメイン:文化・芸術><正規化代表表記:参道/さんどう><漢字><かな漢字><名詞相当語><自立><内容語><タグ単位始><文節始><文節主辞>
は は は 助詞 9 副助詞 2 * 0 * 0 NIL <かな漢字><ひらがな><付属>
* -1D <BGH:暗い/くらい><文末><時制-過去><句点><用言:形><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><状態述語><正規化代表表記:暗い/くらい><主辞代表表記:暗い/くらい>
+ -1D <BGH:暗い/くらい><文末><時制-過去><句点><用言:形><レベル:C><区切:5-5><ID:(文末)><係:文末><提題受:30><主節><格要素><連用要素><状態述語><正規化代表表記:暗い/くらい><主辞代表表記:暗い/くらい><用言代表表記:暗い/くらい><節-区切><節-主辞><主題格:一人称優位><格関係2:ガ:参道><格解析結果:暗い/くらい:形27:ガ/N/参道/2/0/1;ト/U/-/-/-/-><標準用言代表表記:暗い/くらい>
暗かった くらかった 暗い 形容詞 3 * 0 イ形容詞アウオ段 18 タ形 8 "代表表記:暗い/くらい" <代表表記:暗い/くらい><正規化代表表記:暗い/くらい><かな漢字><活用語><表現文末><自立><内容語><タグ単位始><文節始><文節主辞><用言表記末尾>
。 。 。 特殊 1 句点 1 * 0 * 0 NIL <英記号><記号><文末><付属>
EOS
pyknpを用いた解析プログラム
--- example_knp.py ---
# coding: utf-8
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))
プログラムの出力結果
% python3 example_knp.py
文節
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, 代表表記:
Python2系の場合
pyknpではすべての入出力でUnicodeを想定しており、それ以外の文字コードによる入力はエラーとなる。 そのためPython2系では、上記のプログラム冒頭の下記の2行が必要である。
# coding: utf-8
from __future__ import unicode_literals
Documents¶
JUMAN module¶
- class pyknp.juman.juman.Juman(command='jumanpp', server=None, port=32000, timeout=30, option='', rcfile='', ignorepattern='', pattern='^EOS$', jumanpp=True, multithreading=False)[source]¶
Bases:
object
形態素解析器 JUMAN を Python から利用するためのモジュール
- Parameters
command (str) – JUMANの実行コマンド
option (str) – JUMAN解析オプション (ラティス形式 -s, ビーム幅 –beam <int>)
rcfile (str) – JUMAN設定ファイルへのパス
pattern (str) – JUMAN出力の終端記号
jumanpp (bool) – JUMAN++を用いるかJUMANを用いるか。commandを指定した場合は無視される。
- __init__(command='jumanpp', server=None, port=32000, timeout=30, option='', rcfile='', ignorepattern='', pattern='^EOS$', jumanpp=True, multithreading=False)[source]¶
Initialize self. See help(type(self)) for accurate signature.
- juman_lines(input_str)[source]¶
入力文字列に対して形態素解析を行い、そのJuman出力結果を返す
- Parameters
input_str (str) – 文を表す文字列
- Returns
Juman出力結果
- Return type
str
Morpheme modules¶
MorphemeList module¶
Morpheme module¶
- class pyknp.juman.morpheme.Morpheme(spec, mrph_id=None, juman_format=0)[source]¶
Bases:
object
形態素の各種情報を保持するオブジェクト.
- Parameters
spec (str) – JUMAN/KNP出力
mrph_id (int) – 形態素ID
juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式
- mrph_id¶
形態素ID
- Type
int
- mrph_index¶
mrph_idに同じ
- Type
int
- doukei¶
- Type
list
- midasi¶
見出し
- Type
str
- yomi¶
読み
- Type
str
- genkei¶
原形
- Type
str
- hinsi¶
品詞
- Type
str
- hinsi_id¶
品詞ID
- Type
int
- bunrui¶
品詞細分類
- Type
str
- bunrui_id¶
品詞細分類ID
- Type
int
- katuyou1¶
活用型
- Type
str
- katuyou1_id¶
活用型ID
- Type
int
- katuyou2¶
活用形
- Type
str
- katuyou2_id¶
活用形ID
- Type
int
- imis¶
意味情報
- Type
str
- fstring¶
素性情報
- Type
str
- repname¶
代表表記
- Type
str
- ranks¶
ラティスでのランク
- Type
set[int]
- span¶
形態素の位置 (開始位置, 終了位置), JUMAN出力形式がラティス形式の場合のみ
- Type
tuple
KNP module¶
- class pyknp.knp.knp.KNP(command='knp', server=None, port=31000, timeout=60, option='-tab', rcfile='', pattern='EOS', jumancommand='jumanpp', jumanrcfile='', jumanoption='', jumanpp=True, multithreading=False)[source]¶
Bases:
object
KNPを用いて構文解析を行う/KNPの解析結果を読み取るモジュール
- Parameters
command (str) – KNPコマンド
option (str) – KNP解析オプション (詳細解析結果を出力する-tabは必須。 省略・照応解析を行う -anaphora, 格解析を行わず構文解析のみを行う -dpnd など)
rcfile (str) – KNP設定ファイルへのパス
pattern (str) – KNP出力の終端記号
jumancommand (str) – JUMANコマンド
jumanrcfile (str) – JUMAN設定ファイルへのパス
jumanpp (bool) – JUMAN++を用いるかJUMANを用いるか
multithreading (bool) – 解析をメインスレッド以外から行う可能性があるか
- __init__(command='knp', server=None, port=31000, timeout=60, option='-tab', rcfile='', pattern='EOS', jumancommand='jumanpp', jumanrcfile='', jumanoption='', jumanpp=True, multithreading=False)[source]¶
Initialize self. See help(type(self)) for accurate signature.
- parse(sentence, juman_format=0)[source]¶
入力された文字列に対して形態素解析と構文解析を行い、文節列オブジェクトを返す
- Parameters
sentence (str) – 文を表す文字列
juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式
- Returns
文節列オブジェクト
- Return type
- parse_juman_result(juman_str, juman_format=0)[source]¶
JUMAN出力結果に対して構文解析を行い、文節列オブジェクトを返す
- Parameters
juman_str (str) – ある文に関するJUMANの出力結果
juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式
- Returns
文節列オブジェクト
- Return type
Bunsetsu modules¶
BunsetsuList module¶
- class pyknp.knp.blist.BList(spec='', pattern='EOS', juman_format=0)[source]¶
Bases:
object
ある文に関する文節列を保持するオブジェクト
- Parameters
spec (str) – KNP出力
pattern (str) – KNP出力の終端記号
juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式
- comment¶
KNP出力における、#から始まる行に書かれた文字列
- Type
str
- sid¶
文ID (KNP出力中のS-ID)
- Type
str
- __init__(spec='', pattern='EOS', juman_format=0)[source]¶
Initialize self. See help(type(self)) for accurate signature.
Bunsetsu module¶
- class pyknp.knp.bunsetsu.Bunsetsu(spec, bnst_id=0, juman_format=0)[source]¶
Bases:
object
KNP による係り受け解析の単位である文節の各種情報を保持するオブジェクト.
- Parameters
spec (str) – KNP出力のうち文節に該当する箇所の文字列
bnst_id (int) – 文節ID
juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式
- bnst_id¶
文節ID
- Type
int
- midasi¶
見出し
- Type
str
- parent_id¶
親の文節ID
- Type
int
- children¶
子の文節オブジェクトのリスト
- Type
list
- repname¶
正規化代表表記 (normalized_repnameに同じ)
- Type
str
- normalized_repname¶
正規化代表表記
- Type
str
- head_repname¶
主辞代表表記
- Type
str
- head_prime_repname¶
主辞’代表表記
- Type
str
- fstring¶
feature情報
- Type
str
Tag modules¶
Tag module¶
- class pyknp.knp.tag.Tag(spec, tag_id=0, juman_format=0)[source]¶
Bases:
object
ある文に関する基本句列を保持するオブジェクト
- Parameters
spec (str) – KNP出力
tag_id (int) – 基本句ID
juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式
- tag_id¶
基本句ID
- Type
int
- midasi¶
見出し
- Type
str
- parent_id¶
親の基本句ID
- Type
int
- children¶
子の基本句オブジェクトのリスト
- Type
list
- dpndtype¶
係り受けタイプ
- Type
str
- fstring¶
feature情報
- Type
str
- repname¶
正規化代表表記 (normalized_repnameに同じ)
- Type
str
- normalized_repname¶
正規化代表表記
- Type
str
- head_repname¶
主辞代表表記
- Type
str
- head_prime_repname¶
主辞’代表表記
- Type
str
- pred_repname¶
用言代表表記
- Type
str
- disambiguated_pred_repname¶
標準用言代表表記
- Type
str
PAS module¶
- class pyknp.knp.pas.Pas(tid=None, result=None)[source]¶
Bases:
object
述語項構造を扱うクラス
- Usage:
result = knp.result(knp_result) pas = result.tag_list()[tid].pas # tid番目の基本句(述語)の項構造
- cfid¶
格フレームID (例: “行う/おこなう:動10”)
- Type
str
- arguments¶
格と項を対応付けた辞書 {case: [Argument, ..]} keyは格を表す文字列, valueはArgumentオブジェクトのリスト。 リスト形式なのは、ガ格などは複数の項を取り得るため。
- Type
dict of (case, list of Argument)
- __init__(tid=None, result=None)[source]¶
Initialize self. See help(type(self)) for accurate signature.
- get_arguments(case)[source]¶
指定した格の各項ごとに代表表記の配列を返す
- Usage:
result = knp.parse(“研究者になる”) print(result.tag_list()[2].midasi) >> なる print(result.tag_list()[2].pas.get_arguments(“ニ”)) >> [ArgRepname(repname=’者/しゃ’, tid_list=1)]
- Parameters
case (str) – 格の文字列
- Returns
項の代表表記を格納したnamedtupleである ArgRepname のリスト
- Return type
list
- class pyknp.knp.pas.Argument(sid=None, tid=None, eid=None, midasi='', flag=None, sdist=None)[source]¶
Bases:
object
項に関する情報を保持するオブジェクト
詳しくは下記ページの「格要素側」の記述方法を参照 http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP%2F%E6%A0%BC%E8%A7%A3%E6%9E%90%E7%B5%90%E6%9E%9C%E6%9B%B8%E5%BC%8F
- sid¶
文ID
- Type
str
- tid¶
基本句ID
- Type
int
- eid¶
Entity ID
- Type
int
- midasi¶
表記
- Type
str
- flag¶
フラグ (C, N, O, D, E, U)
- Type
str
- sdist¶
述語の何文前か
- Type
int
Feature module¶
- class pyknp.knp.features.Features(spec, splitter='><', ignore_first_character=True)[source]¶
Bases:
dict
feature情報を保持するオブジェクト
feature情報に含まれるタグをパースし、辞書形式にする。 ex. “<正規化代表表記:遅れる/おくれる>” –> {“正規化代表表記”: “遅れる/おくれる”}
- __init__(spec, splitter='><', ignore_first_character=True)[source]¶
Initialize self. See help(type(self)) for accurate signature.
- property pas¶
Usage Details and Tips¶
予め準備したJUMAN/KNP解析結果ファイルを利用する方法¶
JUMAN++やKNPは決して速くないため、大量のテキストを解析する際は juman.analysis関数やknp.parse関数を用いて実行のたびに形態素解析や構文解析を行うのではなく、 予めJUMAN++/KNPを適用した解析済みファイルを用意しこれを読み込む方が良い。
Juman/KNPオブジェクトのresult関数に1文ずつの解析結果を渡すことで、読み込むことができる。
JUMAN++
--- read_juman_results.py ---
from pyknp import Juman
juman = Juman()
data = ""
with open("sample.juman") as file_in:
for line in file_in:
data += line
if line.strip() == "EOS":
result = juman.result(data)
print(",".join(mrph.genkei for mrph in result.mrph_list()))
data = ""
% echo "下鴨神社の参道は暗かった。" | jumanpp > sample.juman
% python3 read_juman_results.py
下鴨,神社,の,参道,は,暗い,。
KNP
--- read_knp_results.py ---
from pyknp import KNP
knp = KNP()
data = ""
with open("sample.knp") as file_in:
for line in file_in:
data += line
if line.strip() == "EOS":
result = knp.result(data)
print(",".join(mrph.genkei for mrph in result.mrph_list()))
data = ""
% echo "下鴨神社の参道は暗かった。" | jumanpp | knp -tab > sample.knp
% python3 read_knp_results.py
下鴨,神社,の,参道,は,暗い,。
係り受け情報を取得する方法¶
係り受け関係は木構造をなす。
bnst.parent は親文節を返す。ただし一番後ろの文節は親文節を持たないので None が返る。
bnst.children は子文節のリストを返す。子が一つもない (空リスト) こともあるし、複数の場合もある。
以下のコードは各係り受け関係を矢印 -> でつないでプリントする
--- dpnd.py ---
from pyknp import KNP
knp = KNP()
result = knp.parse("望遠鏡で泳いでいる少女を見た。")
for bnst in result.bnst_list():
parent = bnst.parent
if parent is not None:
child_rep = " ".join(mrph.repname for mrph in bnst.mrph_list())
parent_rep = " ".join(mrph.repname for mrph in parent.mrph_list())
print(child_rep, "->", parent_rep)
% python3 tests/dpnd.py
望遠/ぼうえん 鏡/かがみ -> 見る/みる
泳ぐ/およぐ いる/いる -> 少女/しょうじょ
少女/しょうじょ -> 見る/みる
述語項構造情報を取得する方法¶
述語項構造とは、何がどうした、という述語とその項からなる構造のことである。 KNPにおいて述語項構造情報は、基本句レベルの情報として保持される。 pyknpではTagクラスのpasオブジェクトがこの情報を保持しており、 述語の基本句ではPasオブジェクト、その他の基本区ではNoneを指す。
Pasオブジェクトは、該当述語の述語と項の情報を管理する。 Pasオブジェクト中のargumentsオブジェクトは、{格: Argumentオブジェクトのリスト} という辞書である。Argumentオブジェクトは項の情報を管理する。 格と項の情報が1対1対応でないのは、ガ格などが複数の項を取り得るためである。
Pas, Argument クラスの詳細は下記ドキュメントの Pas module の項目を参照してほしい。 Tag modules
下記は文中の述語と項を取り出すサンプルプログラムである。
--- get_pas.py ---
from pyknp import KNP
knp = KNP()
result = knp.parse("望遠鏡で泳いでいる少女を見た。")
for tag in result.tag_list():
if tag.pas is not None: # find predicate
print('述語: %s' % ''.join(mrph.midasi for mrph in tag.mrph_list()))
for case, args in tag.pas.arguments.items(): # case: str, args: list of Argument class
for arg in args: # arg: Argument class
print('\t格: %s, 項: %s (項の基本句ID: %d)' % (case, arg.midasi, arg.tid))
% python3 get_pas.py
述語: 泳いでいる
格: ガ, 項: 少女 (項の基本句ID: 3)
述語: 見た。
格: ヲ, 項: 少女 (項の基本句ID: 3)
格: デ, 項: 鏡 (項の基本句ID: 1)
Author/Contact¶
京都大学 黒橋・河原研究室 (contact@nlp.ist.i.kyoto-u.ac.jp)
John Richardson, Tomohide Shibata, Yuta Hayashibe, Tomohiro Sakaguchi