はじめに
SudachiPyは、 Java で書かれたオープンソースの日本語形態素解析器SudachiのPython版です。
SudachiPyは、形態素解析の無料ツールとして活用できます。
www.mlab.im.dendai.ac.jp
日本語形態素解析で有名なmecabと比べて後発の後発の形態素解析器で、
複数の分割単位、固有表現抽出などの特徴があります。
特に、GiNZA(spaCy)を使ってUD(単語単位の依存構造)解析したいときに利用できます*1。
今回、R/RStudio上でのSudachiPyの実行例を概説します。Macターミナルでの実行もできます。
個人的には、RユーザーにとってPythonパッケージがR環境上で実行できると、いろいろとメリットが大きいと考えています*2。
例の如く、HomeBrewでPythonの環境構築を行います。詳しくは、過去の記事を参照のこと。
https://skume.hatenablog.com/entry/2020/05/10/225341skume.hatenablog.com
実行環境
MacOSX 10.15.6
R version 4.0.2 (2020-06-22)
RStudio 1.3.1056
Python 3.8.5
pip 20.1.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
SudachiPyのデフォルト・インストール
さて、ターミナルを起動して、SudachiPyをインストールします。
pip install sudachipy
pip install sudachidict_core
Sudachi 辞書 fullの設定
Sudachiでは、3種類の辞書が提供されています。
small: UniDicの語彙のみが含まれる。
core: 基本的な語彙を含む(デフォルト)。
full: その他の固有名詞が含まれる。
ここでは、Sudachi 辞書 full をインストールして、その辞書への切り替えをやってみます。
pip install sudachidict_full
sudachipy link -t full
また、SudachiPyには、コマンドライン版とPython版があり、pipでどちらもインストールされます。
上記コマンドは、RStudioのターミナルタブからも実行できます。
また、もう面倒で、Rコンソール上でインストールしたい場合には、以下で通るはずです。
system("pip install sudachipy sudachidict_core sudachidict_full")
system("sudachipy link -t full")
R環境でのコマンドライン版sudachipyの実行
次に、コマンドライン版sudachipyの実行例を下記に示します。
Rのsystem()を使うと、ターミナルコマンドを実行できます。
また、" "内の文字列を、ターミナル上で実行することも可能です。
system("sudachipy tokenize -h")
system('echo "外国人参政権" | sudachipy')
system('echo "外国人参政権" | sudachipy -a')
Res <- system('echo "外国人参政権" | sudachipy', intern=T)
Res
system('echo "外国人参政権" | sudachipy -m A')
Split modeについては、補足に記載しています。
続いて、Python版の実行方法についても概説します。
R環境でのPythonパッケージ版sudachipyの実行
HomeBrewでインストールしたPythonは、/usr/local/bin/python
に入っています。
お使いの環境で、use_pythonのパスは変更しておきます。
それでは、Pythonパッケージ版sudachipyの実行例を下記に示します。
また、R環境上でのPython実行は、reticulateパッケージを使います。
reticulate::use_python("/usr/local/bin/python", required =T)
sudachipy <- reticulate::import(module = "sudachipy")
reticulate::py_help(sudachipy)
ここから、SudachiPyで形態素解析を実行してみます。
tokenizer_obj = sudachipy$dictionary$Dictionary()$create()
tokenizer_obj
text = '国家公務員'
m = tokenizer_obj$tokenize(text=text)[0]
m$surface()
m$dictionary_form()
m$reading_form()
m$part_of_speech()
次に、Split modeのオプジェクトを設定して、
Splitモードの違いで、形態素解析の結果がどのように変わるかをみていきます。
SplitA = sudachipy$tokenizer$Tokenizer$SplitMode$A
SplitB = sudachipy$tokenizer$Tokenizer$SplitMode$B
SplitC = sudachipy$tokenizer$Tokenizer$SplitMode$C
tokenizer_obj$tokenize(text=text, mode=SplitA)[0]
tokenizer_obj$tokenize(text=text, mode=SplitA)[1]
tokenizer_obj$tokenize(text=text, mode=SplitA)[2]
tokenizer_obj$tokenize(text=text, mode=SplitB)[0]
tokenizer_obj$tokenize(text=text, mode=SplitB)[1]
tokenizer_obj$tokenize(text=text, mode=SplitC)[0]
また、SudachiPyでは、標準的な日本語に補正してくれる、語彙のノーマライズ機能 (Ex. 附属 => 付属)もあるようです。
m1 = tokenizer_obj$tokenize(text="附属")[0]
m1$normalized_form()
自作関数SudachiTokenizerRについて
Pythonパッケージ版SudachiをR環境で動かすのは若干面倒なんですが、実行挙動を逆手にとって関数を作成しました*3。
これまでのコマンドが動作した環境が前提で、コマンドライン版とほぼ同出力となる関数を作成しました。以下が実行例です。
source("https://gist.githubusercontent.com/kumeS/db75fdb0389f9a84846c58f5dcf302c1/raw/662d60b9c1d371577e40b3d1a311cd7d1b1de327/SudachiTokenizerR")
Res <- SudachiTokenizerR(text='国家公務員', mode=SplitA)
Res
print(system('echo "国家公務員" | sudachipy -m A', intern=T))
まとめ
R環境で、Sudachi形態素解析が使えれば、自然言語処理やテキスト処理などの処理の幅も広がるはずです。
SudachiTokenizerRで、Pythonパッケージ版の形態素解析もR環境で少しは使いものになりそうです*4。
補足
辞書の設定ファイル「sudachi.json」について
python3.10版SudachiPyのsudachi.jsonを開きます。
open /opt/homebrew/lib/python3.10/site-packages/sudachipy/resources/sudachi.json
full辞書のsystem.dicは以下のフォルダパスにあります。
#sudachidict_fullのフォルダを開く
open /opt/homebrew/lib/python3.10/site-packages/sudachidict_full/resources
以下の通り、sudachi.jsonを修正します。
"systemDict" : null,
↓↓↓
"systemDict" : "/opt/homebrew/lib/python3.10/site-packages/sudachidict_full/resources/system.dic",
github.com
Rはイチスタート、Pythonはゼロスタート
Rでは、1,2,3...
と 1 からベクトル位置が始まりますが、Pythonや他言語では、0,1,2,3...
と 0 からベクトル位置が始まるのが一般的です。
'
と"
の使い分け
Rでは、"..."
(ダブルクォーテーション囲い)は、文字列指定の際に使用します。
"..."
内にもう一度、"..."
を入れたい場合は、個人的な使い方としては、'..."..."...'
というように、外側を'...'
(シングルクォーテーション囲い)にして、内側を"..."
と記載します*5。
一部、'...'
を使っているところもあるけども、R上ではだいたい同じ挙動となります。
Split mode について
英語原文より
Sudachi provides three modes of splitting.
In A mode, texts are divided into the shortest units equivalent to the UniDic short unit.
In C mode, it extracts named entities.
In B mode, into the middle units.
日本語サイトより
次に、トークナイザーのモードを定義する必要があります。
モードは、トークナイザーがテキストを分割する方法を決定するために使用されます。
A :テキストは、UniDicショートユニットに相当する最短ユニットに分割されます
B :テキストをAとCの間の中間単位に分割します
C :名前付きエンティティを抽出します
Rコード: SudachiTokenizerR
gist.github.com
参考資料
pypi.org
github.com
ichi.pro