Skip to content

Fixed a parse bug for special symbols #40

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

meokz
Copy link

@meokz meokz commented Feb 20, 2021

発生した不具合

  • スペースが含まれる文章をjumanppにかけたとき、\ の形式で吐き出されるが、pyknp側でその際のパースを対応できてなかった。

例)

% jumanpp
こんにちは(^ ^)
こんにち こんにち こんにち 名詞 6 時相名詞 10 * 0 * 0 "代表表記:今日/こんにち カテゴリ:時間"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
( ( ( 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"
^ ^ ^ 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"
\ ^ \ ^ \ ^ 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"
) ) ) 未定義語 15 その他 1 * 0 * 0 "品詞推定:名詞"

この場合、顔文字の右目部分が \ ^ で表記される。

このときpyknpにかけると、以下の例外となる

Traceback (most recent call last):
  File "test_py.py", line 21, in <listcomp>
    res = [jumanpp.analysis(transcript) if transcript != "" else None for transcript in transcripts]
  File "/Users/otao/Projects/github/pyknp/pyknp/juman/juman.py", line 89, in analysis
    return self.juman(input_str, juman_format)
  File "/Users/otao/Projects/github/pyknp/pyknp/juman/juman.py", line 76, in juman
    result = MList(self.juman_lines(input_str), juman_format)
  File "/Users/otao/Projects/github/pyknp/pyknp/juman/mlist.py", line 29, in __init__
    mrph = Morpheme(line, mid, juman_format)
  File "/Users/otao/Projects/github/pyknp/pyknp/juman/morpheme.py", line 79, in __init__
    self._parse_spec(spec.strip("\n"))
  File "/Users/otao/Projects/github/pyknp/pyknp/juman/morpheme.py", line 142, in _parse_spec
    self.hinsi_id = int(parts[4])
ValueError: invalid literal for int() with base 10: '\\'

対応

  • partをappendする部分に part != "\\" の判定式を追加した
  • 変数のスコープに合わせて、変数の宣言位置を移動した

@nobu-g
Copy link
Member

nobu-g commented Feb 22, 2021

使用している Juman++ はどのバージョンでしょうか.
最新の 2.0.0-rc3 では不具合の修正が確認できませんでした.
また,修正版ではこちらのテストケースに失敗してしまうようです.

pyknp は現在 Juman++2.0.0-rc3 を想定して開発しています.
速度や精度面でも Pre-release となっていますが 2.0.0-rc3 を使っていただくことをおすすめします.

@meokz
Copy link
Author

meokz commented Mar 4, 2021

@nobu-g
申し訳ありません、こちら1.02の結果でした。

% jumanpp --version
JUMAN++ 1.02

一方で、2.0.0-rc3を使った場合では以下のような結果となり、顔文字の中にスペースがあるためやはりpyknpのパース処理では扱えない問題があります。

こんにちは(^ ^)
こんにちは こんにちは こんにちは 感動詞 12 * 0 * 0 * 0 "代表表記:こんにちは/こんにちは"
(^ ^) (^ ^) (^ ^) 特殊 1 記号 5 * 0 * 0 "代表表記:顔文字/顔文字 顔文字"
EOS

このときの pyknp 0.4.6の実行結果は以下の通りで、パースに失敗しています。

  File "/root/.local/lib/python3.7/site-packages/pyknp-0.4.6-py3.7.egg/pyknp/juman/juman.py", line 89, in analysis
    return self.juman(input_str, juman_format)
  File "/root/.local/lib/python3.7/site-packages/pyknp-0.4.6-py3.7.egg/pyknp/juman/juman.py", line 76, in juman
    result = MList(self.juman_lines(input_str), juman_format)
  File "/root/.local/lib/python3.7/site-packages/pyknp-0.4.6-py3.7.egg/pyknp/juman/mlist.py", line 29, in __init__
    mrph = Morpheme(line, mid, juman_format)
  File "/root/.local/lib/python3.7/site-packages/pyknp-0.4.6-py3.7.egg/pyknp/juman/morpheme.py", line 79, in __init__
    self._parse_spec(spec.strip("\n"))
  File "/root/.local/lib/python3.7/site-packages/pyknp-0.4.6-py3.7.egg/pyknp/juman/morpheme.py", line 142, in _parse_spec
    self.hinsi_id = int(parts[4])
ValueError: invalid literal for int() with base 10: '(^'

本家jumannppの方でパース処理について問い合わせると、以下のような解答でした。
ku-nlp/jumanpp#128

\t の入力を想定せず簡易に実装するなら -s 1 オプションを、曖昧さを無くしてちゃんとパースするならprotobufを使うのが良さそうです

こちらにIssueとして残しておきましたので #42
このPRは閉じさせて頂きます。

@meokz meokz closed this Mar 4, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants