pyknp: Python Module for JUMAN++/KNP

About

形態素解析器JUMAN++(JUMAN)と構文解析器KNPのPythonバインディング (Python2系,3系の両方に対応)

Requirements

  • Python
    • Verified Versions: 2.7.15, 3.5.6, 3.6.6.

  • 形態素解析器 JUMAN++ (JUMAN)
    • JUMAN++はJUMANの後継となる形態素解析器

    • English pages of JUMAN++ (Japanese Morphological Analyzer): EN_JUMAN++ (EN_JUMAN)

  • 構文解析器 KNP
    • English page of KNP (Japanese Dependency and Case Structure Analyzer): EN_KNP

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

詳しい使い方はこちらを参照してください。 Usage Details and Tips
関数やクラスの詳細は下記ドキュメントも参照してください。

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

KNPの実行例。出力の読み方は次のURLを参照。
% 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

juman(input_str, juman_format=0)[source]

analysis関数と同じ

analysis(input_str, juman_format=0)[source]

入力文字列に対して形態素解析し、その結果を MList オブジェクトとして返す

Parameters
  • input_str (str) – 文を表す文字列

  • juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式

Returns

形態素列オブジェクト

Return type

MList

result(input_str, juman_format=0)[source]

Juman出力結果に対して、その結果を MList オブジェクトとして返す

Parameters
  • input_str (str) – Juman出力結果

  • juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式

Returns

形態素列オブジェクト

Return type

MList

Morpheme modules

MorphemeList module
class pyknp.juman.mlist.MList(spec='', juman_format=0)[source]

Bases: object

ある文に関する形態素列を保持するオブジェクト.

__init__(spec='', juman_format=0)[source]

Initialize self. See help(type(self)) for accurate signature.

push_mrph(mrph)[source]
set_readonly()[source]
spec()[source]

形態素列の全文字列を返す.Juman による出力と同じ形式の結果が得られる.

new_spec()[source]
mrph_list()[source]

保持する全ての形態素のリストを返す.

Returns

形態素オブジェクトMorphemeのリスト

Return type

list of Morpheme

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

__init__(spec, mrph_id=None, juman_format=0)[source]

Initialize self. See help(type(self)) for accurate signature.

push_doukei(mrph)[source]
repnames()[source]

形態素の代表表記(曖昧性がある場合は「?」で連結)を返す.

Returns

形態素の代表表記文字列

Return type

str

spec()[source]
new_spec(prev_mrph_id=None, span=None)[source]

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.

knp(sentence)[source]

parse関数と同じ

parse(sentence, juman_format=0)[source]

入力された文字列に対して形態素解析と構文解析を行い、文節列オブジェクトを返す

Parameters
  • sentence (str) – 文を表す文字列

  • juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式

Returns

文節列オブジェクト

Return type

BList

parse_juman_result(juman_str, juman_format=0)[source]

JUMAN出力結果に対して構文解析を行い、文節列オブジェクトを返す

Parameters
  • juman_str (str) – ある文に関するJUMANの出力結果

  • juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式

Returns

文節列オブジェクト

Return type

BList

reparse_knp_result(knp_str, juman_format=0)[source]

KNP出力結果に対してもう一度構文解析を行い、文節列オブジェクトを返す。 KNPのfeatureを再付与する場合などに用いる。中身はparse_juman_result関数と同じ。

Parameters
  • knp_str (str) – ある文に関するKNPの出力結果

  • juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式

Returns

文節列オブジェクト

Return type

BList

result(input_str, juman_format=0)[source]

ある文に関するKNP解析結果を文節列オブジェクトに変換する

Parameters
  • input_str (str) – ある文に関するKNPの出力結果

  • juman_format (JUMAN_FORMAT) – Jumanのlattice出力形式

Returns

文節列オブジェクト

Return type

BList

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.

parse(spec)[source]

KNPの出力を読み取る

Parameters

spec (str) – KNP出力

get_tag_span(tag_id)[source]

基本句の位置情報を返す

Parameters

tag_id (int) – 基本句ID

Returns

(基本句の開始位置, 終了位置)

Return type

tuple

push_bnst(bnst)[source]
tag_list()[source]

文を構成する全基本句オブジェクトを返す

Returns

基本句オブジェクトTagのリスト

Return type

list of Tag

mrph_list()[source]

文を構成する全形態素オブジェクトを返す

Returns

形態素オブジェクトMorphemeのリスト

Return type

list of Morpheme

bnst_list()[source]

文を構成する全文節オブジェクトを返す

Returns

文節オブジェクトBunsetsuのリスト

Return type

list of Bunsetsu

set_readonly()[source]
spec()[source]
all()[source]

KNPの出力結果を返す

draw_tree(fh=None, show_pos=True)[source]
draw_bnst_tree(fh=None, show_pos=True)[source]

文節列の依存関係を木構造として表現して出力する.

draw_tag_tree(fh=None, show_pos=True)[source]

タグ列の依存関係を木構造として表現して出力する.

sprint_tree(show_pos=True)[source]
get_clause_starts(concat_clause_in_paren=False, discourse_clause=False)[source]

節の冒頭句の位置情報を返す

Parameters
  • concat_clause_in_paren (bool) – 括弧内では節を切らないかどうか

  • discourse_clause (bool) – 補文節、連体修飾節を切らないかどうか

Returns

節の冒頭となる基本句idのリスト

Return type

list

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

親の文節オブジェクト

Type

Bunsetsu

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

__init__(spec, bnst_id=0, juman_format=0)[source]

Initialize self. See help(type(self)) for accurate signature.

push_mrph(mrph)[source]

新しい形態素オブジェクトをセットする

push_tag(tag)[source]

新しい基本句オブジェクトをセットする

set_midasi()[source]

midasiをセットする

spec()[source]

文節に対応するKNP出力

mrph_list()[source]

文節を構成する全形態素オブジェクトを返す

Returns

形態素オブジェクトMorphemeのリスト

Return type

list

tag_list()[source]

文節を構成する全基本句オブジェクトを返す

Returns

基本句オブジェクトTagのリスト

Return type

list

pstring(string=None)[source]

draw_treeしたときに右側に出力する文字列を返す

Tag modules

TagList module
class pyknp.knp.tlist.TList[source]

Bases: object

ある文に関する基本句列を保持するオブジェクト

__init__()[source]

Initialize self. See help(type(self)) for accurate signature.

push_tag(tag)[source]
push_mrph(mrph)[source]
push_synnodes(synnodes)[source]
push_synnode(synnode)[source]
spec()[source]
set_readonly()[source]
draw_tree(fh=None, show_pos=True)[source]
draw_tag_tree(fh=None, show_pos=True)[source]

タグ列の依存関係を木構造として表現して出力する.

sprint_tree()[source]
tag_list()[source]

基本句列を構成する全基本句オブジェクトを返す

Returns

基本句オブジェクトTagのリスト

Return type

list of Tag

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

親の基本句オブジェクト

Type

Tag

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

features

基本句のfeatureを表すFeatureオブジェクト

Type

Features

pas

基本句が述語の場合は項の情報(Pasオブジェクト), そうでない場合None

Type

Pas

__init__(spec, tag_id=0, juman_format=0)[source]

Initialize self. See help(type(self)) for accurate signature.

push_mrph(mrph)[source]

新しい形態素オブジェクトをセットする

set_midasi()[source]

midasiをセットする

spec()[source]

基本句に対応するKNP出力

mrph_list()[source]

基本句を構成する全形態素オブジェクトを返す

Returns

形態素オブジェクトMorphemeのリスト

Return type

list

pstring(string=None)[source]

draw_treeしたときに右側に出力する文字列を返す

get_surface()[source]

基本句の見出しを返す

Returns

基本句の見出し

Return 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.

is_valid()[source]
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

get_orig_result()[source]
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

__init__(sid=None, tid=None, eid=None, midasi='', flag=None, sdist=None)[source]

Initialize self. See help(type(self)) for accurate signature.

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

Drawing Tree module

pyknp.knp.drawtree.draw_tree(leaves, fh=None, show_pos=True)[source]
pyknp.knp.drawtree.sprint_tree(leaves, show_pos=True)[source]

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

Indices and Tables