Skip to content

Instantly share code, notes, and snippets.

@pizzacat83
Last active February 14, 2023 11:19
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save pizzacat83/f314d48bfd9c3f69757e40cee4805e9b to your computer and use it in GitHub Desktop.
Save pizzacat83/f314d48bfd9c3f69757e40cee4805e9b to your computer and use it in GitHub Desktop.
pyKNPについてのメモ(自分用)

pyKNPについてのメモ

JUMAN・JUMAN++・KNPのPythonバインディングであるpyKNPの詳しい説明がNot Foundで手探り状態なので、後の作業の際に使うべくメモを残しておく。

有用そうなリンク

import

import pyknp

py"KNP" ではないことに注意

とりあえず解析

knp = pyknp.KNP()
result = knp.parse(line)

pyknp.KNP コンストラクタ

def __init__(self, command='knp', server=None, port=31000, timeout=60, option='-tab', rcfile='', pattern=r'EOS', jumancommand='juman', jumanrcfile='', jumanpp=False)
  • command
    KNPの実行コマンド名
  • server
    何度もKNPを呼び出すときのオーバーヘッドを軽減するためのサーバー機能だと思う(未確認)
  • port, timeout
    server時のオプション?(未確認)
  • option
    KNPに渡すオプション
    オプションについてはKNPの主なオプションなど
  • rcfile
    KNPの設定ファイルへのパス?(未確認)
  • pattern
  • jumancommand
    JUMANの実行コマンド名
    JUMAN++も使用でき、その場合はjumanppオプションをTrueにする
  • jumanrcfile
    JUMANの設定ファイルへのパス?(未確認)
  • jumanpp
    JUMAN++を形態素解析に用いる際はTrueにする

解析結果

  • all(self)
    KNPの出力の文字列っぽい

  • bnst_list(self)
    文節のリスト

  • comment

    後に続く解析文の文ID,KNPのバージョン,解析日,解析スコアに関する情報

    KNPの基本的な出力の読み方

    参考: KNPへの入力

  • draw_bnst_tree(self, fh=None)

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

    • fh
      書き込むfileオブジェクト
  • draw_tag_tree(self, fh=None)

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

    • fh
      書き込むfileオブジェクト
  • draw_tree(self, fh=None)

    構文木を指定された fh に出力する.指定を省略した場合は,標準出力に出力される.

    draw_bnst_treeと同じ?

    • fh
      書き込むfileオブジェクト
  • draw_tree_leaves(self)

    draw_tree メソッドとの通信用のメソッド

    bnst_listと==で比較したらTrueだった。

  • get_clause_starts(self, concat_clause_in_paren=False, disable_levelA=False)

  • get_tag_span(self, tag_id)
    tag_idに対応する基本句がparse元の文字列に位置する範囲のタプル

    • tag_id
      調べる基本句のID(前から順に0, 1, 2, ...?)
  • leaf_string(self, leaf)
    leafに対応する構文木の葉の文字列(Jとかpとかvとかが挿入されている)

    • leaf 調べたい文節または基本句またはpyknp.lnp.blist.BListオブジェクト
      (mrpf_list属性が必要っぽい)
  • mrpf_list(self)
    形態素のリスト

  • mrph_positions
    それぞれの形態素がパース元の文字列で位置する範囲のリスト
    n(n≧0)番目の形態素は[mrph_positions[n], mrph_positions[n+1])に位置する

  • newstyle
    よくわからないけどBool値だった(Juman++かどうか?)

  • parse(self, spec)
    KNPの出力した文字列をパースする?

    • spec
      KNPの出力した文字列?(JUMAN・JUMAN++の出力は未確認)
  • pattern
    文末を示す文字列?
    'EOS'だった。

  • push_bnst(self, bnst)
    文節を追加?(未確認)

  • set_parent_child(self)

  • set_positions(self)

  • set_readonly(self)

  • sid
    文ID(commentに書いてあるS-ID)
    参考: KNPへの入力

  • spec(self)
    all(self)と==で比較したらTrueだった。

  • sprint_tree(self)

    構文木を文字列で返す。

  • tag_list(self)
    基本句のリスト
  • tag_positions
    それぞれの基本句がパース元の文字列で位置する範囲のリスト
    n(n≧0)番目の基本句は[tag_positions[n], tag_positions[n+1])に位置する
    get_tag_span(self, tag_id)もあるので適宜使い分けよう

文節

bnst = result.bnst_list()[i]

※以下のattributesは全てではない

  • fstring
    feature的なアレの文字列
  • mrpf_list()
    形態素のリスト
  • parent
    自分が係る文節(構文木における親)
    「雨が降る」…「雨が」:子 「降る」:親
  • pstring
    よくわからない
    試した限りでは空文字列ばかり
  • push_mrph(mrph)
    文節に形態素を追加する?(未確認)
  • push_tag(tag)
    文節に基本句を追加する?(未確認)
  • repname
    自立語の?代表表記
  • spec()
    よくわからない。(0, 0)ばかり。
  • tag_list()
    基本句のリスト

基本句

tag = bnst.tag_list()[j]

KNPでは,基本的に"1つの自立語とそれに続く付属語"から成る基本句という単位で係り受けなどを扱っている
文節単位で考えた場合"麻生太郎は"で1つの文節となるが,基本句単位で考えた場合,"麻生"と"太郎は"の2つの基本句となる
係り受けなどの書式は * から始まる行と同様

KNPの基本的な出力の読み方

※以下のattributesは全てではない

  • repname
    自立語の代表表記
  • get_surface()
    表層形の文字列

形態素 (pyknp.juman.morpheme.Morpheme)

参考: KNPの形態素に関する情報の出力書式

入力形態素 読み 原型 品詞 品詞ID 品詞細分類 細分類ID 活用型 活用型ID 活用形 活用形ID その他の情報

KNPの基本的な出力の読み方

  • bunrui
    品詞細分類の文字列
    ex. 数詞

  • bunrui_id
    品詞細分類IDを表す整数
    ex. 7(名詞であれば数詞であることを表す)
    品詞ごとに1, 2, 3, ...と番号が振られているよう。(品詞細分類が*の場合は0、以降のID系統も同様)
    JUMAN 品詞体系 に書かれた順番の通りかも(品詞の順番は違いそう)。

  • doukei
    表記は同じだが異なる語?のMorphemeオブジェクトのリスト(未確認)
    とするとKNPを通すことで一つに定められるので、KNPのパース結果ならば空リストになる

  • fstring
    KNPが付与したfeatureタグ一覧の文字列

  • genkei
    原型の文字列

  • hinsi
    品詞の文字列

  • hinsi_id
    品詞IDを表す整数 ex. 6(名詞)

  • imis
    その他の情報の文字列

  • katuyou1
    活用型の文字列
    ex. イ形容詞アウオ段

  • katuyou1_id
    活用型IDを表す整数
    ex. 18(イ形容詞アウオ段)

  • katuyou2
    活用形の文字列 ex. 語幹

  • katuyou2_id
    活用形IDを表す整数 ex. 1(イ形容詞アウオ段のとき語幹を表す)

  • midasi
    入力形態素の文字列(そのまま)

  • mrph_id
    形態素のIDを表す整数
    多分前から順に0, 1, 2, ...

  • mrph_index
    mrph_idと同じ?

  • new_spec(self, prev_mrph_id=None, span=None)

  • parse_fstring(self, fstring)

  • prev_mrph_id
    ひとつ前の形態素のID?
    先頭の形態素は自信と同じ0だった。

  • push_doukei(self, mrph)

  • repname
    形態素の代表表記を返す

  • repnames(self)

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

  • span
    よくわからない。試した限りでは(0, 0)

  • spec(self)
    形態素に関する出力すべての文字列

  • yomi
    読みの文字列

よく出るエラー

  • parse時のAssertionError
    入力文字列をdecode('utf-8')していない可能性が高い。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment