3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

 徳島県人です。PythonとRを勉強中です。
 以前、「Rでnagisa」という記事を書きました。だが、「徳島県人ならスダチでしょ。」ということで、今回はRでSudachiPyを使ってみたいと思います。

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

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

1. R環境の準備

・Google Colaboratoryの場合

 次のリンクから、Colabを開く
https://colab.research.google.com/notebook#create=true&language=r

・JupyterLab Desktop Appの場合

 次の記事を参考にしてください。

2. SudachiPyのインストール

・Google Colaboratoryの場合

 セルで、次のコードを実行する。

system("pip install sudachipy sudachidict_core sudachidict_full")

・JupyterLab Desktop Appの場合

 ランチャーのコンソールで、次のコードを実行する。

pip install sudachipy sudachidict_core sudachidict_full

3. RでSudachiPyを使うための準備

 ここから、Rのコードになります。

# reticulateはPythonとRの間で相互運用するためのパッケージ
install.packages("reticulate")
library(reticulate)

sudachipy <- import("sudachipy")

4. 基本的な使い方

 参考にした記事の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のコードにするには、.$に変えてつなげていけば良いです。

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コードです。

>>> morphemes = tokenizer.tokenize("吾輩は猫である")
>>> print(*[m.surface() for m in morphemes])
吾輩    ある

 reticulateパッケージは、PythonのオブジェクトをRの対応するオブジェクトに変換してくれるが、MorphemeListは独自実装なので、そのままでは、次のようなエラーが出て、forで使えない。

morphemes <- tokenizer$tokenize("吾輩は猫である")
for (m in morphemes) cat(m$surface(),"")
# Error in for (m in morphemes) cat(m$surface(), ""):  for() ループが不正です 
# Traceback:

 そこで、reticulateパッケージのiterate関数で、Listに変換してから使う。

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))>

 分かち書きの出力です。

morphemes <- tokenizer$tokenize("吾輩は猫である")
it_morphemes <- iterate(morphemes)
for (m in it_morphemes) cat(m$surface(),"")
# 吾輩 は 猫 で ある 

 sapply関数を使うと、分かち書きの結果をベクトルで出力することができます。

morphemes <- tokenizer$tokenize("吾輩は猫である")
it_morphemes <- iterate(morphemes)
sapply(it_morphemes, function(m) m$surface())
# '吾輩'・'は'・'猫'・'で'・'ある'

 形態素の見出し(surface())だけなら、reticulateパッケージのpy_str関数、基本関数のas.character関数、format関数でも分かち書きを出力できます。

morphemes <- tokenizer$tokenize("吾輩は猫である")

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

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

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

6. 分割のレベルの指定

 参考にした記事の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のコードです。.$に変えてつなげていけば良いだけです。

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. 辞書の変更

 元記事には無いけれど、辞書の変更も試してみました。これも、.$に変えてつなげていけば良いだけです。

# 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を。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?