[PyCon2019] レポート Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト分析〜

Session: https://pycon.jp/2019/schedule/?sessionId=115

参加して来ました。

詳細は資料を見れば良いと思いますので、自分がピンと来た部分だけをピックアップして紹介します。

# 資料

- GitHub https://github.com/taishi-i/nagisa
- nagisa: RNNによる日本語単語分割・品詞タグ付けツール https://qiita.com/taishi-i/items/5b9275a606b392f7f58e
- Pythonで動く形態素解析ツール「nagisa」を使ってみた https://upura.hatenablog.com/entry/2018/09/18/203540
- 形態素解析ツールのnagisa(なぎさ)を知っていますか? https://yolo.love/nlp/nagisa/
- PyPI https://pypi.org/project/nagisa/


## 主旨

発表者: 池田 大志(Taishi Ikeda) さん

手軽に使える [nagisa](https://pypi.org/project/nagisa/) のご紹介

## 特徴

- BLSTMs による単語分割と品詞タグ付けの機能を提供
- 系列ラベリングモデルの学習が可能
- pip install nagisa でインストール可能

# nagisaを使うべき理由

社内のSlackに流れる知見を自動抽出したいなぁ、、という動機があり、特に以下の2点には非常に有用性を感じました。

- ユーザー辞書の追加が簡単
- URLや顔文字記号に対して頑健

どちらも既存ライブラリでは少々面倒な手続きが必要で億劫だったところでした。特に顔文字とURLは、Slackでは頻出しがちかつ非常にノイジーな存在でしたので、これがnagisaではどのように上手く（そして手軽に）抽出できるか非常に楽しみです。

コードスニペットは作者の池田さんが [basic_usage.ipynb](https://github.com/taishi-i/nagisa-tutorial-pycon2019/blob/master/notebooks/basic_usage.ipynb) に公開されています。手軽さが非常によくわかるスニペットでしたので、以下ではそれをまるっと引用させていただきますが、作者の池田さんご自身が非常に親切なドキュメントを残してくれてますので是非そっちをご覧ください。

まずはベーシックな使い方から。

```python

# シンプルな単語分割と品詞タグ付け機能を提供
import nagisa                                                           
                                                                        
text = 'Pythonで簡単に使えるツールです'                                 
tokens = nagisa.tagging(text)                                           
                                                                        
print(tokens)                                                           
print(tokens.words)                                                     
print(tokens.postags)
# >>> Python/名詞 で/助詞 簡単/形状詞 に/助動詞 使える/動詞 ツール/名詞 です/助動詞
# >>> ['Python', 'で', '簡単', 'に', '使える', 'ツール', 'です']
# >>> ['名詞', '助詞', '形状詞', '助動詞', '動詞', '名詞', '助動詞']
```

## ユーザー辞書の追加が簡単

Taggerインスタンスの生成時に、ユーザー定義の単語リストである `single_word_list` を与えるだけです。

```python
# ユーザー辞書の追加が容易
import nagisa                                                           
                                                                        
text = "3月に見た「3月のライオン」"                                     
print(nagisa.tagging(text))                                             
                                                                        
new_tagger = nagisa.Tagger(                                             
    single_word_list=['3月のライオン']                                  
)                                                                       
print(new_tagger.tagging(text))
# >>> 3/名詞 月/名詞 に/助詞 見/動詞 た/助動詞 「/補助記号 3/名詞 月/名詞 の/助詞 ライオン/名詞 」/補助記号
# >>> 3/名詞 月/名詞 に/助詞 見/動詞 た/助動詞 「/補助記号 3月のライオン/名詞 」/補助記号
```

## URLや顔文字記号に対して頑健

```python
# 顔文字やURLに対して頑健な解析
import nagisa                                                           
                                                                        
text = 'https://github.com/taishi-i/nagisaでコードを公開中(๑¯ω¯๑)'         
tokens = nagisa.tagging(text)                                           
print(tokens)
# >>> https://github.com/taishi-i/nagisa/URL 
# >>> で/助詞 
# >>> コード/名詞 
# >>> を/助詞 
# >>> 公開/名詞 
# >>> 中/接尾辞 
# >>> (๑　̄ω　̄๑)/補助記号
```

# まとめ

めちゃくちゃ簡単ですね。

URLの文字列をちゃんとURLとして抽出できるのは非常にありがたいです。Slackに貼られているURLって、参考リンクの提示だったりするのでできれば前処理で除去したくないんですよね。nagisaを知る以前は、URLを過剰分割してしまい非常に鬱陶しかったので前処理で正規表現使って一括除去してました。。。

Slackのテキストだとemojiあたりも非常にノイジーなインプットになりますが、そのへんをどう処理できるかは後日試してみようと思います。

非常に素晴らしいツールのご紹介、ありがとうございました。