Rでも、良いSudachi Lifeを送りたい

# はじめに
　徳島県人です。PythonとRを勉強中です。
　以前、「[Rでnagisa](https://qiita.com/Mitz-TADA/items/a5ab178bd13e8f393371)」という記事を書きました。だが、「徳島県人ならスダチでしょ。」ということで、今回はRでSudachiPyを使ってみたいと思います。

　SudachiPyについては、下記の記事をご覧ください。私のこの記事は、下記の記事
のPythonコードをRに変換することを目標に書いています。

https://qiita.com/eiennohito/items/20472187b236cf45fe12

　Google ColaboratoryとJupyterLab Desktop Appで動作することを確認しています。

# 1. R環境の準備
## ・Google Colaboratoryの場合
　次のリンクから、Colabを開く
https://colab.research.google.com/notebook#create=true&language=r
## ・JupyterLab Desktop Appの場合
　次の記事を参考にしてください。

https://qiita.com/Mitz-TADA/items/af14fe3b27a5f569727a

# 2. SudachiPyのインストール
## ・Google Colaboratoryの場合
　セルで、次のコードを実行する。
```r
system("pip install sudachipy sudachidict_core sudachidict_full")
```
## ・JupyterLab Desktop Appの場合
　ランチャーのコンソールで、次のコードを実行する。
```
pip install sudachipy sudachidict_core sudachidict_full
```

# 3. RでSudachiPyを使うための準備
　ここから、Rのコードになります。
```r
# reticulateはPythonとRの間で相互運用するためのパッケージ
install.packages("reticulate")
library(reticulate)

sudachipy <- import("sudachipy")
```
# 4. 基本的な使い方
　参考にした記事のPythonコードです。
> ```python
> >>> dict = sudachipy.Dictionary() # まずは辞書を作る
> >>> tokenizer = dict.create() # 辞書から分割器を作る
> >>> tokenizer.tokenize("吾輩は猫である") # 分割自体を行う
> <MorphemeList[
>   <Morpheme(吾輩, 0:2, (0, 350242))>,
>   <Morpheme(は, 2:3, (0, 122101))>,
>   <Morpheme(猫, 3:4, (0, 571106))>,
>   <Morpheme(で, 4:5, (0, 101816))>,
>   <Morpheme(ある, 5:7, (0, 12492))>,
> ]>
> ```
　Rのコードにするには、`.`を`$`に変えてつなげていけば良いです。
```r
dict <- sudachipy$Dictionary()
tokenizer <- dict$create()
tokenizer$tokenize("吾輩は猫である")
# <MorphemeList[
#   <Morpheme(吾輩, 0:2, (0, 349262))>,
#   <Morpheme(は, 2:3, (0, 121599))>,
#   <Morpheme(猫, 3:4, (0, 569572))>,
#   <Morpheme(で, 4:5, (0, 101426))>,
#   <Morpheme(ある, 5:7, (0, 12716))>,
# ]>
```

# 5. 分かち書きの出力
　参考にした記事のPythonコードです。
> ```python
> >>> morphemes = tokenizer.tokenize("吾輩は猫である")
> >>> print(*[m.surface() for m in morphemes])
> 吾輩 は 猫 で ある
> ```
　reticulateパッケージは、PythonのオブジェクトをRの対応するオブジェクトに変換してくれるが、MorphemeListは独自実装なので、そのままでは、次のようなエラーが出て、`for`で使えない。
```r
morphemes <- tokenizer$tokenize("吾輩は猫である")
for (m in morphemes) cat(m$surface(),"")
# Error in for (m in morphemes) cat(m$surface(), ""):  for() ループが不正です 
# Traceback:
```
　そこで、reticulateパッケージの`iterate`関数で、Listに変換してから使う。
```r
morphemes <- tokenizer$tokenize("吾輩は猫である")
it_morphemes <- iterate(morphemes)
print(it_morphemes)
# [[1]]
# <Morpheme(吾輩, 0:2, (0, 349262))>
#
# [[2]]
# <Morpheme(は, 2:3, (0, 121599))>
#
# [[3]]
# <Morpheme(猫, 3:4, (0, 569572))>
#
# [[4]]
# <Morpheme(で, 4:5, (0, 101426))>
#
# [[5]]
# <Morpheme(ある, 5:7, (0, 12716))>
```
　分かち書きの出力です。
```r
morphemes <- tokenizer$tokenize("吾輩は猫である")
it_morphemes <- iterate(morphemes)
for (m in it_morphemes) cat(m$surface(),"")
# 吾輩 は 猫 で ある 
```
　`sapply`関数を使うと、分かち書きの結果をベクトルで出力することができます。
```r
morphemes <- tokenizer$tokenize("吾輩は猫である")
it_morphemes <- iterate(morphemes)
sapply(it_morphemes, function(m) m$surface())
# '吾輩'・'は'・'猫'・'で'・'ある'
```
　形態素の見出し（surface()）だけなら、reticulateパッケージの`py_str`関数、基本関数の`as.character`関数、`format`関数でも分かち書きを出力できます。
```r
morphemes <- tokenizer$tokenize("吾輩は猫である")

py_str(morphemes)
# '吾輩 は 猫 で ある'

as.character(morphemes)
# '吾輩 は 猫 で ある'

format(morphemes)
# '吾輩 は 猫 で ある'
```

# 6. 分割のレベルの指定
　参考にした記事のPythonコードです。
> ```python
> >>> tokenizer = dict.create(mode=sudachipy.SplitMode.C) # 既定値はC
> >>> tokenizer.tokenize("関西国際空港")
> <MorphemeList[
>   <Morpheme(関西国際空港, 0:6, (0, 1564531))>,
> ]>
> >>> tokenizer = dict.create(mode=sudachipy.SplitMode.A)
> >>> tokenizer.tokenize("関西国際空港")
> <MorphemeList[
>   <Morpheme(関西, 0:2, (0, 735344))>,
>   <Morpheme(国際, 2:4, (0, 365535))>,
>   <Morpheme(空港, 4:6, (0, 602797))>,
> ]>
> ```
　変換したRのコードです。`.`を`$`に変えてつなげていけば良いだけです。
```r
tokenizer <- dict$create(mode=sudachipy$SplitMode$C)
tokenizer$tokenize("関西国際空港")
# <MorphemeList[
#   <Morpheme(関西国際空港, 0:6, (0, 1563656))>,
# ]>

tokenizer <- dict$create(mode=sudachipy$SplitMode$A)
tokenizer$tokenize("関西国際空港")
# <MorphemeList[
#   <Morpheme(関西, 0:2, (0, 733448))>,
#   <Morpheme(国際, 2:4, (0, 364545))>,
#   <Morpheme(空港, 4:6, (0, 601187))>,
# ]>
```

# 7. 辞書の変更
　元記事には無いけれど、辞書の変更も試してみました。これも、`.`を`$`に変えてつなげていけば良いだけです。
```r
# sudachidict_full の場合
dict <- sudachipy$Dictionary(dict="full")
tokenizer <- dict$create()  # 辞書変更すると分割器の再作成が必要
tokenizer$tokenize("鬼滅の刃")
# <MorphemeList[
#   <Morpheme(鬼滅の刃, 0:4, (0, 2902306))>,
# ]>

# sudachidict_core の場合
dict <- sudachipy$Dictionary()
tokenizer <- dict$create()  # 辞書変更するとその都度、分割器の再作成が必要
tokenizer$tokenize("鬼滅の刃")
# <MorphemeList[
#   <Morpheme(鬼, 0:1, (0, 759996))>,
#   <Morpheme(滅, 1:2, (-1, 4))>,
#   <Morpheme(の, 2:3, (0, 119135))>,
#   <Morpheme(刃, 3:4, (0, 310429))>,
# ]>
```

　それではRでも、良いSudachi Lifeを。