これは何?
rjavacmecabは、takscape/cmecab-javaをrJava経由で呼び出してMeCabを利用するためのパッケージです。
このパッケージの開発のモチベーションは、既存のRパッケージよりも、比較的利用しやすい形態素解析の選択肢を提供することです。
rjavacmecabはRMeCabやRcppMeCabを代替するものではありません。あいだにJavaを経由することから、解析速度は他のパッケージよりも遅い一方で、このパッケージには次にあげるようなアドバンテージがあります。
- C/C++をビルドする必要がないため、ソースパッケージからのインストールが容易。
- 他のパッケージでは利用しづらいものを含む、MeCabから返される全ての素性情報を利用できる。
環境の準備
あらかじめMeCabとJDKが利用できるようになっている必要があります。
MeCabの準備
MeCabの辞書はUTF-8を指定してインストールされていることを前提にしています。Windowsで64bit用のJDKを利用する場合、MeCabも64bit向けのものを用意する必要があります。Windows 64bitの場合、以下などを利用してください。
rjavacmecabはcmecab-javaのrJavaラッパーです。cmecab-javaを利用するためにはMeCabのダイナミックライブラリにパスが通っている必要があります。
Windowsの場合、インストールしたMeCabのディレクトリ以下のbin
ディレクトリにパスを通します。LinuxやMacの場合、LD_LIBRARY_PATH
にlibmecab.so
(Linuxの場合)やlibmecab.dylib
(Macの場合)のあるディレクトリを追加してください。
rJava周りで問題が発生する場合
環境によってはrJavaパッケージはソースからビルドされている必要があります。rJavaをソースからビルドするには、多くの場合はJavaを適切にインストールしたあとにR CMD javareconf
を実行したうえで、R上でinstall.packages("rJava", type="source")
などとすれば解決します。
rJavaの周辺は比較的問題が起こりやすく、たとえばパッケージの読みこみ時にjvm
のロードに失敗したりするといったことがあります(古いバージョンのRStudioを使用している場合などに発生することが報告されています)。こうした場合はdyn.load()
関数に使用したいJREに付属しているダイナミックライブラリを明示的に渡すか、rJavaが読みにいっているファイルにシンボリックリンクを上書きするなどして対処します。
また、パッケージのビルド時にclang: error: unsupported option '-fopenmp
が発生してビルドに失敗する場合、Rパッケージのビルドに使用されるコンパイラの設定をしなおす必要があります。詳しくは以下に挙げる記事などを参考にしてください。
使用例
cmecab-javaの呼び出し
if (rjavacmecab::is_mecab_available()) {
rjavacmecab::rebuild_tagger()
res <- rjavacmecab::cmecab(c("長期的自己実現で福楽は得られない", "幸せは刹那の中にあり"))
str(res)
}
#> tibble [18 × 3] (S3: tbl_df/tbl/data.frame)
#> $ doc_id : int [1:18] 1 1 1 1 1 1 1 1 1 1 ...
#> $ token : chr [1:18] "長期" "的" "自己" "実現" ...
#> $ feature: chr [1:18] "名詞,一般,*,*,*,*,長期,チョウキ,チョーキ" "名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ" "名詞,一般,*,*,*,*,自己,ジコ,ジコ" "名詞,サ変接続,*,*,*,*,実現,ジツゲン,ジツゲン" ...
if (rjavacmecab::is_mecab_available()) {
res <- rjavacmecab::prettify(res) ## データフレームに整形します
str(res)
}
#> tibble [18 × 11] (S3: tbl_df/tbl/data.frame)
#> $ doc_id : int [1:18] 1 1 1 1 1 1 1 1 1 1 ...
#> $ token : chr [1:18] "長期" "的" "自己" "実現" ...
#> $ POS1 : chr [1:18] "名詞" "名詞" "名詞" "名詞" ...
#> $ POS2 : chr [1:18] "一般" "接尾" "一般" "サ変接続" ...
#> $ POS3 : chr [1:18] NA "形容動詞語幹" NA NA ...
#> $ POS4 : chr [1:18] NA NA NA NA ...
#> $ X5StageUse1: chr [1:18] NA NA NA NA ...
#> $ X5StageUse2: chr [1:18] NA NA NA NA ...
#> $ Original : chr [1:18] "長期" "的" "自己" "実現" ...
#> $ Yomi1 : chr [1:18] "チョウキ" "テキ" "ジコ" "ジツゲン" ...
#> $ Yomi2 : chr [1:18] "チョーキ" "テキ" "ジコ" "ジツゲン" ...
整形されたデータフレームは次のカラムからなります。IPA辞書とは異なる品詞体系の辞書を使っている場合は、素性情報をinto
引数に渡してください。
- doc_id: 文番号
- token: 表層形(surface form)
- POS1~POS4: 品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3
- X5StageUse1: 活用型(ex. 五段, 下二段…)
- X5StageUse2: 活用形(ex. 連用形, 基本形…)
- Original: 原形(lemmatised form)
- Yomi1: 読み(readings)
- Yomi2: 発音(pronunciation)
if (rjavacmecab::is_mecab_available()) {
res <- rjavacmecab::pack(res) ## さらに整形して分かち書きにします
print(res)
}
#> doc_id text
#> 1 1 長期 的 自己 実現 で 福 楽 は 得 られ ない
#> 2 2 幸せ は 刹那 の 中 に あり
辞書の差し替え
確認できたかぎりでは-d
オプションは動作します。rjavacmecab::cmecab(str, "-d /MeCab/ipadic-neologd", sep = "\t")
のようにしてオプションを渡してください。
Igoの呼び出し
rjavacmecab::cmecab
とほぼ同様のAPIから、パッケージに同梱されているIgo
(v0.4.5,
IPA辞書)を利用することも可能です。ただし、仕様上、MeCabとは解析結果が異なる可能性があります。詳細はIgoのドキュメントを確認してください。
res <- rjavacmecab::igo("お前がそう思うんならそうなんだろう、お前ん中ではな")
str(res)
#> tibble [18 × 3] (S3: tbl_df/tbl/data.frame)
#> $ doc_id : int [1:18] 1 1 1 1 1 1 1 1 1 1 ...
#> $ token : chr [1:18] "お前" "が" "そう" "思う" ...
#> $ feature: chr [1:18] "名詞,代名詞,一般,*,*,*,お前,オマエ,オマエ" "助詞,格助詞,一般,*,*,*,が,ガ,ガ" "副詞,助詞類接続,*,*,*,*,そう,ソウ,ソー" "動詞,自立,*,*,五段・ワ行促音便,基本形,思う,オモウ,オモウ" ...
rjavacmecab::igo
については、分かち書きの機能も利用できます。
Google Colaboratoryで試す方法
あらかじめ次のようなことをすればColabで試すことができます。
- rpy2のロード
- MeCab(+IPAdic)のインストール
- Java(JRE/JDK)のアップデート
- JAVA_HOMEの設定
- R CMD javareconf
- rJavaのインストール
セットアップ
JAVA_HOMEの設定
Pythonから設定してしまうと簡単です。
import os
"JAVA_HOME"] = "/usr/lib/jvm/java-11-openjdk-amd64" os.environ[
rJavaのインストール
aptから入れることができます。
%%bash
apt install r-cran-rjava
Rのinstall.packages()
から入れる場合、libjvm.soをdyn.load()
で明示的に指定して読み込まないとパッケージのインストールに失敗するため、先にdyn.load()
を呼びます。
%%R # このマジックコマンドをコードブロックの先頭に付けるとそのブロックにRが書ける
dyn.load("/usr/lib/jvm/java-11-openjdk-amd64/lib/server/libjvm.so")
install.packages("rJava")