nagisa: RNNによる日本語単語分割・品詞タグ付けツール

今年の言語処理学会（NLP2018）では、形態素解析に関するワークショップ[（形態素解析の今とこれから）](https://sites.google.com/view/nlp2018ws/)が開催されました。そこで**「RNNを用いた日本語単語分割/品詞タグ付けツールの紹介」**というタイトルで LT を行いましたので、そのツールについて Qiita でもご紹介したいと思います。

発表したツールは [nagisa](https://github.com/taishi-i/nagisa) という名前で Github に公開されており、**これから NLP を始めようと考えている Python ユーザーの方にも使いやすいツール**を目指し開発しています。

また PyCon JP 2019 では**「Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト分析〜」** というタイトルで発表しました。
発表スライド：https://speakerdeck.com/taishii/pycon-jp-2019

**他の形態素解析器との違い**
--- 
日本語の形態素解析器は、[MeCab](http://taku910.github.io/mecab/)、 [JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)、 [KyTea](http://www.phontron.com/kytea/index-ja.html)、 [Sudachi](https://github.com/WorksApplications/Sudachi) などのソフトウェアが存在しますが、[nagisa](https://github.com/taishi-i/nagisa) には以下の特徴があります。

- ```pip install nagisa``` でインストール可能
    - パッケージにモデルファイルが含まれているので、辞書のインストールが不要です。
- Bidirectional-LSTM を用いた日本語単語分割と品詞推定
    - Bi-LSTM を用いた文字単位の系列ラベリングによる解析を行うので、顔文字やURLに対して頑健な解析が可能です。
- 複数の後処理機能を備える
    - ユーザーによる出力単語の微調整や品詞による出力単語のフィルタリングが可能です。

![models.jpg](https://qiita-image-store.s3.amazonaws.com/0/257779/64dec051-a9a1-f08f-e0ac-6374e4a053fa.jpeg)


**インストール方法** 
--- 
Python2系と3系ともに `pip install nagisa` でインストール可能です。

Windows でインストールが失敗する場合は、こちらの記事をご確認ください:bow_tone1:
["pip install nagisa"でいろいろやった話](https://qiita.com/F_murasaki/items/9359cab8dd56a30c885e)
→ Windows 用の wheel を登録したので Build Tools なしにインストール可能になりました:ok_hand:


**基本的な使い方**
--- 
`import nagisa` でインポートし、`nagisa.tagging(text)` で単語分割と品詞タグ付けを行います。

```python

import nagisa
text  = 'Pythonで簡単に使えるツールです'
words = nagisa.tagging(text)
print(words)
#=> Python/名詞 で/助詞 簡単/形状詞 に/助動詞 使える/動詞 ツール/名詞 です/助動詞
```

`words.words` で出力単語列のリストを得ることができ、`words.postags` では出力単語列に対応する品詞のリストを得ることができます。

```python
print(words.words) 
#=> ['Python', 'で', '簡単', 'に', '使える', 'ツール', 'です']
print(words.postags) 
#=> ['名詞', '助詞', '形状詞', '助動詞', '動詞', '名詞', '助動詞']
```

**品詞による出力単語のフィルタリング**
--- 
引数に品詞を指定することで、出力単語をフィルタリングすることも可能です。

`nagisa.extract` は、必要な品詞の単語だけを抽出する関数です。

```python
words = nagisa.extract(text, extract_postags=['名詞'])
print(words) 
#=> Python/名詞 ツール/名詞
```

`nagisa.filter` は、不要な品詞の単語を取り除く関数です。

```python
words = nagisa.filter(text, filter_postags=['助詞', '助動詞'])
print(words) 
#=> Python/名詞 簡単/形状詞 使える/動詞 ツール/名詞
```

`nagisa.tagger.postags` には、利用可能な品詞の一覧が含まれていますので、品詞を確認しつつ、フィルタリングする品詞を選択することが可能です。

```python

print(nagisa.tagger.postags) 
#=> ['oov', '感動詞', '補助記号', 'web誤脱', '接尾辞', '動詞', '接頭辞', '言いよどみ', '形状詞', '形容詞', '空白', '助動詞', '英単語', '漢文', '未知語', '記号', '代名詞', '連体詞', 'URL', 'ローマ字文', '接続詞', '副詞', '名詞', '助詞']
```

**出力単語を微調整する方法**
---
入力として、「ニューラルネットワークを使ってます。」という文を nagisa に与えた場合、デフォルトの設定では「ニューラル/名詞」と「ネットワーク/名詞」の２つの単語として分割されてしまいます。 

```python

text = 'ニューラルネットワークを使ってます。'
print(nagisa.tagging(text)) 
#=> ニューラル/名詞 ネットワーク/名詞 を/助詞 使っ/動詞 て/助動詞 ます/助動詞 。/補助記号
```

例えば、「ニューラルネットワーク」は1つの単語として、出力して欲しいと思った場合、 `nagisa.Tagger` の引数に  `single_word_list=["ニューラルネットワーク"]` と指定することで `single_word_list` に含まれる単語は強制的に１つの単語として出力することが可能です。

```python

tagger_nn = nagisa.Tagger(single_word_list=['ニューラルネットワーク'])
print(tagger_nn.tagging(text)) 
#=> ニューラルネットワーク/名詞 を/助詞 使っ/動詞 て/助動詞 ます/助動詞 。/補助記号
```


**顔文字やURLに対して頑健な解析**
---
単語分割モデルでは、文字単位の Bidirectional-LSTM を用いて入力文の単語境界を求めるので、顔文字や URL を１つの単語として出力してくれます。
 
```python

text = '(人•ᴗ•♡)こんばんは♪'
words = nagisa.tagging(text)
print(words) 
#=> (人•ᴗ•♡)/補助記号 こんばんは/感動詞 ♪/補助記号

url = 'https://github.com/taishi-i/nagisaでコードを公開中(๑¯ω¯๑)'
words = nagisa.tagging(url)
print(words) 
#=> https://github.com/taishi-i/nagisa/URL で/助詞 コード/名詞 を/助詞 公開/名詞 中/接尾辞 (๑　̄ω　̄๑)/補助記号
```
**おわりに**
---
良い点はたくさん述べたものの、 MeCab と比較すると解析速度は非常に遅いなど、改善すべき点はまだまだ存在します。
ですが、もしプログラムを書いている途中に**「必要があるたびに名詞のみを抽出するプログラムを書いている」**、**「ユーザー辞書を準備するほどでもないけど、この単語の出力はこうなっていて欲しい」**などと思ったことがあるのであれば、一度 nagisa を試してみるのはいかがでしょうか？
ちょっとした手間を省けるような使いやすいツールを目指し nagisa の開発を続けたいと思います！

nagisa: https://github.com/taishi-i/nagisa

**nagisa に関する記事**
---
- [Pythonで動く形態素解析ツール「nagisa」を使ってみた] (https://upura.hatenablog.com/entry/2018/09/18/203540)
- [形態素解析ツールのnagisa（なぎさ）を知っていますか？] (https://yolo.love/nlp/nagisa/)
- [Japanese Text Segmentation and Analysis with Web ChaMame] (https://digitalorientalist.com/2019/03/19/japanese-text-segmentation-with-web-chamame/)
- [「進撃の巨人」に一番似てる文章は？〜word2vec入門〜](https://qiita.com/NagayoshiShinya/items/872536cbef1660ebab40)
- [日本語形態素解析エンジンnagisaは古典中国語(漢文)を学習できるのか](https://srad.jp/~yasuoka/journal/632602/)
- [Deep Manzai Part 2 〜 前半戦 〜](https://akasatanahama.com/posts/30/)
- [Pythonで自分のどんなツイートが「いいね」されやすいかを分析してみた](https://www.pc-koubou.jp/magazine/24224)
- [[PyCon2019] レポート Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト分析〜](https://qiita.com/hassaku_63/items/a08fdaf5c7268415984e#_reference-072f596087e14bef3921)
- [nagisaで自然言語処理を試してみる](https://blog.mtb-production.info/entry/2019/09/29/231028)
- [日语分词器的介绍与比较](https://avnpc.com/pages/japanese-morphological-analysis-compare)
- [Text Summarization of Japanese Articles using python and NLP](https://medium.com/@shubhamsingh_31435/text-summarization-of-japanese-articles-using-python-and-nlp-47a214d769b)
- [An Overview of Japanese NLP Libraries](https://towardsdatascience.com/an-overview-of-nlp-libraries-for-japanese-be1805837143)

**nagisa が利用されているプロジェクト**
---
- [NTT's Machine Translation Systems for WMT19 Robustness Task](https://arxiv.org/abs/1907.03927)
- [Wordless: An Integrated Corpus Tool with Multi-language Support for the Study of Language, Literature and Translation](https://github.com/BLKSerene/Wordless)
- [TextRank Demo](https://github.com/ceshine/textrank_demo)
- [cloudia](https://github.com/vaaaaanquish/cloudia)