はじめに
徳島県人です。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を。