JUMANをPyKNPから使う際に気をつけたい記号

~~~bash:実行環境
$ python3 -V
Python 3.6.4

$ pip3 show pyknp
Name: pyknp
Version: 0.4.1

$ juman -v
juman 7.01
~~~

## JUMANとは
[JUMAN](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN)は京大の黒橋・河原研究室が提供している日本語形態素解析システム。 
以下のようにコマンドラインから形態素解析を行うことができる。

~~~bash:実行結果
$ juman
本日は晴天なり
本日 ほんじつ 本日 名詞 6 時相名詞 10 * 0 * 0 "代表表記:本日/ほんじつ カテゴリ:時間"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
晴天 せいてん 晴天 名詞 6 普通名詞 1 * 0 * 0 "代表表記:晴天/せいてん カテゴリ:抽象物"
なり なり なり 助詞 9 接続助詞 3 * 0 * 0 NIL
EOS
~~~

## PyKNPとは
[PyKNP](https://pyknp.readthedocs.io/en/latest/)は同じく黒橋・河原研究室が提供しているJUMANとKNP(日本語構文・格・照応解析システム)のPythonバインディング。 
pipでインストールすることが可能。

~~~bash
pip install pyknp
~~~

使い方はこのような感じ。

~~~Python:juman.py
from pyknp import Juman
t = Juman(jumanpp=False)
text = "本日は晴天なり"
print("入力文:{}".format(text))
print("↓↓↓解析結果↓↓↓")
for mrph in t.analysis(text).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))
~~~

~~~bash:出力
$ python3 juman.py 
入力文:本日は晴天なり
↓↓↓解析結果↓↓↓
見出し:本日, 読み:ほんじつ, 原形:本日, 品詞:名詞, 品詞細分類:時相名詞, 活用型:*, 活用形:*, 意味情報:代表表記:本日/ほんじつ カテゴリ:時間, 代表表記:本日/ほんじつ
見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:晴天, 読み:せいてん, 原形:晴天, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:代表表記:晴天/せいてん カテゴリ:抽象物, 代表表記:晴天/せいてん
見出し:なり, 読み:なり, 原形:なり, 品詞:助詞, 品詞細分類:接続助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
~~~

## JUMANをPyKNPから使用するときに気をつけたい記号
JUMANの出力結果には、特別な意味で使用される記号がある。 
これらが解析対象の文字列に含まれていると、**PyKNPが意図したように機能してくれない**場合があるので注意が必要。

## ダブルクォーテーションマーク(")
ダブルクォーテーションマークは以下のようにJUMANの解析結果において**代表表記やカテゴリをまとめて出力するため**に使用される。

~~~bash:実行結果
$ juman
本日
本日 ほんじつ 本日 名詞 6 時相名詞 10 * 0 * 0 "代表表記:本日/ほんじつ カテゴリ:時間"
EOS
~~~

**ダブルクォーテーションが解析結果において単独に区切られなかった場合**において、以下のようにPyKNPの出力が意図しないものとなる可能性がある。

~~~bash:実行結果
$ python3 juman.py 
入力文:"A"さん
↓↓↓解析結果↓↓↓
見出し:A, 読み:A, 原形:A, 品詞:未定義語, 品詞細分類:その他, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:さん, 読み:さん, 原形:さん, 品詞:接尾辞, 品詞細分類:名詞性名詞接尾辞, 活用型:*, 活用形:*, 意味情報:代表表記:さん/さん, 代表表記:さん/さん
~~~

ダブルクォーテーションマークが解析結果から消えているのがわかる。

これについては、[Juman × PyKNPで解析結果から引用符(")が消える。](https://qiita.com/NLPingu/items/2eadb36af1e0ce8a01f4)のエントリで説明している。 
お粗末ながら[本家](https://github.com/ku-nlp/pyknp)に[プルリク](https://github.com/ku-nlp/pyknp/pull/17)も送らせていただいています。

## アットマーク(@)
アットマークは、以下のように**解析において単語の品詞が特定できない場合に並列に表記するため**に使用されるようである。

~~~bash:実行結果
$ juman
シャープ
シャープ しゃーぷ シャープ 名詞 6 組織名 6 * 0 * 0 "代表表記:シャープ/しゃーぷ"
@ シャープ しゃーぷ シャープだ 形容詞 3 * 0 ナ形容詞 21 語幹 1 "代表表記:シャープだ/しゃーぷだ 反義:形容詞:フラットだ/ふらっとだ"
EOS
~~~

これも**アットマークが単体の文字に区切られなかった場合に意図した出力が得られない**場合がある。

~~~bash:実行結果
$ python3 juman.py 
入力文:ツイッターIDは@NLPingu
↓↓↓解析結果↓↓↓
見出し:ツイッター, 読み:ツイッター, 原形:ツイッター, 品詞:名詞, 品詞細分類:普通名詞, 活用型:*, 活用形:*, 意味情報:自動獲得:Wikipedia Wikipediaリダイレクト:Ｔｗｉｔｔｅｒ, 代表表記:
見出し:ID, 読み:ID, 原形:ID, 品詞:未定義語, 品詞細分類:その他, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
見出し:は, 読み:は, 原形:は, 品詞:助詞, 品詞細分類:副助詞, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
~~~

さようならツイッタID。 
入力文がアットマークから始まる場合はエラーを吐くのでさらに気をつける必要あり。

~~~bash:実行結果
$ python3 juman.py 
入力文:@NLPinguが僕のツイッターID
↓↓↓解析結果↓↓↓
Traceback (most recent call last):
  File "juman.py", line 6, in <module>
    for mrph in t.analysis(text).mrph_list(): # 各形態素にアクセス
  File "/home/kota/perl5/lib/python3.6/site-packages/pyknp/juman/juman.py", line 91, in analysis
    return self.juman(input_str, juman_format)
  File "/home/kota/perl5/lib/python3.6/site-packages/pyknp/juman/juman.py", line 78, in juman
    result = MList(self.juman_lines(input_str), juman_format)
  File "/home/kota/perl5/lib/python3.6/site-packages/pyknp/juman/mlist.py", line 26, in __init__
    self._mrph[-1].push_doukei(Morpheme(line[2:], mid, juman_format))
IndexError: list index out of range
~~~

## ハッシュマーク(#)

ハッシュマークはKNPを使用した際コメントを出力するために使用される記号。

~~~bash:実行結果
$ echo "本日" | juman | knp -tab
# S-ID:1 KNP:4.19-CF1.1 DATE:2019/06/28 SCORE:-1.92238
* -1D <文頭><文末><時間><強時間><体言><用言:判><体言止><レベル:C><区切:5-5><ID:（文末）><提題受:30><主節><状態述語><正規化代表表記:本日/ほんじつ><主辞代表表記:本日/ほんじつ>
...
~~~

ハッシュに関しては以下のように問答無用で消されることが多い。

~~~bash:実行結果
$ python3 juman.py 
入力文:#インスタ
↓↓↓解析結果↓↓↓
見出し:インスタ, 読み:インスタ, 原形:インスタ, 品詞:未定義語, 品詞細分類:カタカナ, 活用型:*, 活用形:*, 意味情報:NIL, 代表表記:
~~~

## まとめ
JUMANをPyKNPから使う際は
- **ダブルクォーテーション(")**
- **アットマーク(@)**
- **ハッシュマーク(#)**
に気をつけようという話でした。 

~~余力があるときにダブルクォーテーション以外も本家の方に修正版のプルリクを送ろうと思います。~~
**本家の方より「これら記号は全角に変換することを奨励する。」とのことでした。**

以上。