Sudachi でなのは問題を (一部) 解決する

## なのは問題

かつて形態素解析業界を震撼させた「魔法少女リリカルなのは問題」という出来事がありました。

https://twitter.com/itimasan/status/5841320748781568

名詞-固有名詞-人名-名「なのは」をユーザー辞書に登録したいけれど、登録すると「～なのは」がただしく解析できなくなる問題です。

## [Sudachi](https://github.com/WorksApplications/Sudachi) でなんとかする

さていまさらですがこの問題に (部分的に) 対処してみましょう。

Sudachi 辞書には複数の分割粒度を登録することができます。そこで「魔法少女リリカルなのは」をC単位で、「なのは」をA単位で登録することにします。

```plaintext:nanoha.csv
なのは,4789,4789,-32768,なのは,名詞,固有名詞,人名,名,*,*,ナノハ,なのは,*,A,*,*,*,*
魔法少女リリカルなのは,4786,4786,-32768,魔法少女リリカルなのは,名詞,固有名詞,一般,*,*,*,マホウショウジョリリカルナノハ,
魔法少女リリカルなのは,*,C,"魔法,名詞,普通名詞,一般,*,*,*,マホウ/少女,名詞,普通名詞,一般,*,*,*,ショウジョ/リリカル,形状
詞,一般,*,*,*,*,リリカル/なのは,名詞,固有名詞,人名,名,*,*,ナノハ","魔法,名詞,普通名詞,一般,*,*,*,マホウ/少女,名詞,普通名詞,一般,*,*,*,ショウジョ/リリカル,形状詞,一般,*,*,*,*,リリカル/なのは,名詞,固有名詞,人名,名,*,*,ナノハ",*
```

[マニュアル](https://github.com/WorksApplications/Sudachi/blob/develop/docs/user_dict.md)の推奨値にしたがって連接IDは名詞-固有名詞-人名-名を4789、名詞-固有名詞-一般を4786とし、コストは辞書読み込み時の自動推定機能をつかうために-32768としました。品詞は飾りです (解析結果の表示にしかつかわれない)。


```bash
$ java -cp sudachi-0.5.3.jar com.worksap.nlp.sudachi.dictionary.UserDictionaryBuilder -o nanoha.dic -s system_core.dic nanoha.csv
reading the source file... 2 words
writing the POS table... 2 bytes
writing the connection matrix... 4 bytes
building the trie..done
writing the trie... 1,028 bytes
writing the word-ID table... 14 bytes
writing the word parameters... 16 bytes
writing the wordInfos... 124 bytes
writing wordInfo offsets... 8 bytes
$ echo 魔法少女リリカルなのは | java -jar sudachi-0.5.3.jar -s '{"userDict":["nanoha.dic"]}'
魔法少女リリカルなのは  名詞,固有名詞,一般,*,*,*        魔法少女リリカルなのは
EOS
$ echo 魔法少女リリカルなのは | java -jar sudachi-0.5.3.jar -s '{"userDict":["nanoha.dic"]}' -m A
魔法    名詞,普通名詞,一般,*,*,*        魔法
少女    名詞,普通名詞,一般,*,*,*        少女
リリカル        形状詞,一般,*,*,*,*     リリカル
なのは  名詞,固有名詞,人名,名,*,*       なのは
EOS
```

一見これでうまくいっているようにみえますが問題は解決していません。

```bash
$ echo 駄目なのは自明。 | java -jar sudachi-0.5.3.jar -s '{"userDict":["nanoha.dic"]}'
駄目    名詞,普通名詞,形状詞可能,*,*,*  駄目
なのは  名詞,固有名詞,人名,名,*,*       なのは
自明    名詞,普通名詞,形状詞可能,*,*,*  自明
。      補助記号,句点,*,*,*,*   。
EOS
```

構成語である「なのは」も登録しているためです。

構成語としてのみ利用し辞書引きの TRIE には登録しない (解析に影響しない) ようにするためには、連接IDに-1を指定します。

```plaintext:nanoha.csv
なのは,-1,-1,-32768,なのは,名詞,固有名詞,人名,名,*,*,ナノハ,なのは,*,A,*,*,*,*
魔法少女リリカルなのは,4786,4786,-32768,魔法少女リリカルなのは,名詞,固有名詞,一般,*,*,*,マホウショウジョリリカルナノハ,\魔法少女リリカルなのは,*,C,"魔法,名詞,普通名詞,一般,*,*,*,マホウ/少女,名詞,普通名詞,一般,*,*,*,ショウジョ/リリカル,形状\詞,一般,*,*,*,*,リリカル/なのは,名詞,固有名詞,人名,名,*,*,ナノハ","魔法,名詞,普通名詞,一般,*,*,*,マホウ/少女,名詞,普通\\名詞,一般,*,*,*,ショウジョ/リリカル,形状詞,一般,*,*,*,*,リリカル/なのは,名詞,固有名詞,人名,名,*,*,ナノハ",*
```

これでうまく解析できるようになりました。

```bash
$ echo 魔法少女リリカルなのは。駄目なのは自明。 | java -jar sudachi-0.5.3.jar -s '{"userDict":["nanoha.dic"]}' -m A
魔法    名詞,普通名詞,一般,*,*,*        魔法
少女    名詞,普通名詞,一般,*,*,*        少女
リリカル        形状詞,一般,*,*,*,*     リリカル
なのは  名詞,固有名詞,人名,名,*,*       なのは
。      補助記号,句点,*,*,*,*   。
EOS
駄目    名詞,普通名詞,形状詞可能,*,*,*  駄目
な      助動詞,*,*,*,助動詞-ダ,連体形-一般      だ
の      助詞,準体助詞,*,*,*,*   の
は      助詞,係助詞,*,*,*,*     は
自明    名詞,普通名詞,形状詞可能,*,*,*  自明
。      補助記号,句点,*,*,*,*   。
EOS
```

## 余談

じつは Sudachi のシステム辞書には名詞-固有名詞-人名-名の「なのは」が登録されています (UniDic 由来)。

```plaintext:small_lex.csv
なのは,4789,4789,10507,なのは,名詞,固有名詞,人名,名,*,*,ナノハ,なのは,*,A,*,*,*,*
```

ですが「～なのは」にくらべてコストが高いためでてきません。「リリカル」が形状詞であることも不利にはたらいています。(トータルで9010高い)

![nanoha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370833/ce36859e-4fba-f53d-128b-b99c4555197c.png)

人名っぽい文脈であればでてきます。

```bash
$ echo なのはさん。 | java -jar sudachi-0.5.3.jar -m A
なのは  名詞,固有名詞,人名,名,*,*       なのは
さん    接尾辞,名詞的,一般,*,*,*        さん
。      補助記号,句点,*,*,*,*   。
EOS
```

では、よい Sudachi life を。