R で nagisa

# 1. 何をしている

python の言語処理ライブラリ [nagisa](https://github.com/taishi-i/nagisa) を R で使えるか試してみた。環境は、Google Colaboratory を利用した。

言語処理ライブラリ nagisa を Python で使ってみた感想は、
- `pip install nagisa` のみでインストールできるので簡単
- シンプルなコードで単語分割と品詞タグ付けができるので憶えやすい
- ユーザー辞書の追加が簡単にできるので便利

この nagisa が、R でも使えたら便利だと考えたので、挑戦してみた。

# 2. 環境作成

## (1) Google Colaboratory で、Rのノートブックを作成

Google Colaboratory で、次のリンクからRのノートブックを作成する。  
https://colab.research.google.com/notebook#create=true&language=r

## (2) nagisaのインストール

Colab のコードセルで、
```r
system('pip install nagisa', intern=TRUE)
```

## (3) reticulate パッケージのインストール

[reticulate](https://rstudio.github.io/reticulate/index.html) パッケージは、PythonとRの間で相互運用するためのツールを提供するパッケージである。

```r
install.packages("reticulate")
library(reticulate)
```

## (4) Colab では必要ないが、Python の Path の指定方法

python のパス確認

```r
system('which python', intern=TRUE)
```
出力結果
```
'/usr/local/bin/python'
```

上の出力結果をコピーして、`use_python()` 関数の引数に貼り付ける。

```r
use_python("/usr/local/bin/python")
```

# 3. 基本的な使い方

　https://github.com/taishi-i/nagisa で紹介されている Python のコードを R のコードに変換。

## (1) 単語分割と品詞タグ付け

```r
nagisa <- import("nagisa")

text <- 'Pythonで簡単に使えるツールです'
words <- nagisa$tagging(text)
print(py_str(words), quote=FALSE)
# [1] Python/名詞 で/助詞 簡単/形状詞 に/助動詞 使える/動詞 ツール/名詞 です/助動詞

# 単語列のリストを取得
print(words$words)
# [1] "Python" "で"     "簡単"   "に"     "使える" "ツール" "です"  

# 品詞タグのリストを取得
print(words$postags)
# [1] "名詞"   "助詞"   "形状詞" "助動詞" "動詞"   "名詞"   "助動詞"
```

- Python で `nagisa.tagging(text)` と `.` を使っているのを、R では `nagisa$tagging(text)` と `$` を使う。

- `print(words)` では、`<nagisa.tagger.Tagger._Token object at 0x7fa6bee39f50>` と出力されるので、reticulate パッケージの `py_str()` 関数を使う。

## (2) 単語をフィルタリングして抽出

```r
# 特定の品詞タグの単語をフィルタリングする
words <- nagisa$filter(text, filter_postags=list('助詞', '助動詞'))
print(py_str(words), quote=FALSE)
# [1] Python/名詞 簡単/形状詞 使える/動詞 ツール/名詞

# 名詞のみを抽出する
words <- nagisa$extract(text, extract_postags=list('名詞'))
print(py_str(words), quote=FALSE)
# [1] Python/名詞 ツール/名詞

# nagisaで利用可能な品詞タグの一覧
print(nagisa$tagger$postags)
#  [1] "oov"        "補助記号"   "名詞"       "空白"       "助詞"      
#  [6] "接尾辞"     "動詞"       "連体詞"     "助動詞"     "形容詞"    
# [11] "感動詞"     "接頭辞"     "記号"       "接続詞"     "副詞"      
# [16] "代名詞"     "形状詞"     "web誤脱"    "URL"        "英単語"    
# [21] "漢文"       "未知語"     "言いよどみ" "ローマ字文"
```

- R から Python にリストを渡すとき
  - 要素が複数あるとき、`c()`、`list()` どちらで Python に渡しても、Python でリストとして認識される。
  - 要素が１個のときは、`c()` で Python に渡すと、Python ではリストとして認識されない。

```r
print(r_to_py(c('助詞', '助動詞')))
# ['助詞', '助動詞']

print(r_to_py(list('助詞', '助動詞')))
# ['助詞', '助動詞']

print(r_to_py(c('名詞')))
# '名詞'

print(r_to_py(list('名詞')))
# ['名詞']
```

## (3) ユーザー辞書の追加

```r
# 既定
text <- "3月に見た「3月のライオン」"
print(py_str(nagisa$tagging(text)), quote=FALSE)
# [1] 3/名詞 月/名詞 に/助詞 見/動詞 た/助動詞 「/補助記号 3/名詞 月/名詞 の/助詞 ライオン/名詞 」/補助記号

# single_word_listに単語リストを指定すると、1つの単語として認識される
new_tagger <- nagisa$Tagger(single_word_list=list("3月のライオン"))
print(py_str(new_tagger$tagging(text)), quote=FALSE)
# [1] 3/名詞 月/名詞 に/助詞 見/動詞 た/助動詞 「/補助記号 3月のライオン/名詞 」/補助記号
```

# 4. 参考URL

- [taishi-i/nagisa: A Japanese tokenizer based on recurrent neural networks](https://github.com/taishi-i/nagisa)
- [nagisa · PyPI](https://pypi.org/project/nagisa/)
- [nagisa: RNNによる日本語単語分割・品詞タグ付けツール - Qiita](https://qiita.com/taishi-i/items/5b9275a606b392f7f58e)
- [Interface to Python • reticulate](https://rstudio.github.io/reticulate/index.html)