ku-nlp / pyknp

A Python Module for JUMAN++/KNP
Other
89 stars 23 forks source link

述語項構造にNEの情報が付与されている場合,パースに失敗する #30

Closed shirayu closed 4 years ago

shirayu commented 4 years ago

これはエラーとなります.

$ echo '1,000円とお得な値段です。' |  jumanpp|knp -tab -ne-crf -anaphora | knp-drawtree
Traceback (most recent call last):
  File "/home/username/.local/bin/knp-drawtree", line 91, in <module>
    main()
  File "/home/username/.local/bin/knp-drawtree", line 87, in main
    draw_trees(inf, outf, opts.lattice_format)
  File "/home/username/.local/bin/knp-drawtree", line 65, in draw_trees
    bl = pyknp.BList(u"".join(lines), juman_format=juman_format)
  File "/home/username/.local/lib/python3.7/site-packages/pyknp/knp/blist.py", line 42, in __init__
    self._set_pas(self.juman_format)
  File "/home/username/.local/lib/python3.7/site-packages/pyknp/knp/blist.py", line 78, in _set_pas
    tag.pas = Pas(tag.tag_id, self)
  File "/home/username/.local/lib/python3.7/site-packages/pyknp/knp/pas.py", line 91, in __init__
    self.__set_args(tag_predicate.features.get("述語項構造"), CaseInfoFormat.PASv42)
  File "/home/username/.local/lib/python3.7/site-packages/pyknp/knp/pas.py", line 205, in __set_args
    for items in self.__parse_case_analysis_items(analysis_result, case_info_format):
  File "/home/username/.local/lib/python3.7/site-packages/pyknp/knp/pas.py", line 201, in __parse_case_analysis_items
    yield self.__parse_case_info_format(items, case_info_format)
  File "/home/username/.local/lib/python3.7/site-packages/pyknp/knp/pas.py", line 160, in __parse_case_info_format
    sdist = int(items[3])
ValueError: invalid literal for int() with base 10: '5;ニ'
$ echo '1,000円とお得な値段です。' |  jumanpp|knp -tab -anaphora | knp-drawtree

ではエラーになりません.

-ne-crfをつけると以下のように, MON:が付与されるのが原因です.

+ 2D <BGH:得だ/とくだ><連体修飾><用言:形><係:連格><レベル:B-><区切:0-5><ID:(形判連体)><連体節><状態述語><正規化代表表記:得だ/とくだ><主辞代表表記:得だ/とくだ><用言
代表表記:得だ/とくだ><時制:非過去><格関係2:ガ:値段><標準用言代表表記:得だ/とくだ><EID:6><述語項構造:得だ/とくだ:形2:ガ2/E/著者/2/-1/0;ガ/N/値段/0/2/7;ガ/N/MON:1,000円/0/0/5;ニ/E/不特定-その他/2/-1/3;ト/-/-/-/-/-;デ/-/-/-/-/-;カラ/-/-/-/-/-;ヨリ/-/-/-/-/-;マデ/-/-/-/-/-;時間/-/-/-/-/-;外の関係/-/-/-/-/-;修飾/-/-/-/-/-;ニムケ
ル/-/-/-/-/-;ニクラベル/-/-/-/-/-><省略解析信頼度:0.000><ガ格省略解析信頼度:0.000>

pas.pyの以下の正規表現を修正する必要があります.

arg_pat = re.compile(r';(.+?/[CNODEU]/.+?(?:/(?:-?\d*)){3})'

修正方法までは調べきれていませんが,ひとまず報告させていただきます.

nobu-g commented 4 years ago

ご報告ありがとうございます. pas.py で以下の正規表現が greedy だったのが原因でした.

cf_pat = re.compile(r'(.+/.+):(.+):(.+?/[CNODEU]/.+?(?:/(?:-?\d*)){3})')

こちら修正し,master を更新しました.

shirayu commented 4 years ago

早速ありがとうございます. 無事動作しました.

お手数をおかけいたしますが,PyPIもアップデートしていただけると助かります.

nobu-g commented 4 years ago

PyPI にアップロードいたしました. (0.4.3 に少し不具合があったので最新ver が 0.4.4 となっています)

shirayu commented 4 years ago

ありがとうございました!