Skip to contents

これは何?

rjavacmecabは、takscape/cmecab-javaをrJava経由で呼び出してMeCabを利用するためのパッケージです。

このパッケージの開発のモチベーションは、既存のRパッケージよりも、比較的利用しやすい形態素解析の選択肢を提供することです。

rjavacmecabはRMeCabRcppMeCabを代替するものではありません。あいだにJavaを経由することから、解析速度は他のパッケージよりも遅い一方で、このパッケージには次にあげるようなアドバンテージがあります。

  1. C/C++をビルドする必要がないため、ソースパッケージからのインストールが容易。
  2. 他のパッケージでは利用しづらいものを含む、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_PATHlibmecab.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パッケージのビルドに使用されるコンパイラの設定をしなおす必要があります。詳しくは以下に挙げる記事などを参考にしてください。

使用例

インストール

remotes::install_github("paithiov909/rjavacmecab")

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については、分かち書きの機能も利用できます。

res <- rjavacmecab::igo("お前がそう思うんならそうなんだろう、お前ん中ではな", mode = "wakati")
str(res)
#> List of 1
#>  $ 1: chr [1:18] "お前" "が" "そう" "思う" ...

Google Colaboratoryで試す方法

あらかじめ次のようなことをすればColabで試すことができます。

  • rpy2のロード
  • MeCab(+IPAdic)のインストール
  • Java(JRE/JDK)のアップデート
  • JAVA_HOMEの設定
  • R CMD javareconf
  • rJavaのインストール

セットアップ

rpy2のロード

Rのランタイムはデフォルトで入っているので、rpy2経由でRを利用できます。マジックコマンドでロードします。

%load_ext rpy2.ipython

MeCabのインストール

aptやaptitudeで入れることができます。

%%bash
apt install mecab libmecab-dev mecab-ipadic-utf8

Javaのアップデート

%%bash
apt install default-jre default-jdk
java -version   # check java version

JAVA_HOMEの設定

Pythonから設定してしまうと簡単です。

import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-11-openjdk-amd64"

R CMD javareconf

%%bash
R CMD javareconf

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

rJavaに依存するパッケージのインストール

ここまでの手順を踏んでrJavaがちゃんと入っていると、ふつうに入れることができます。

%%R
remotes::install_github("paithiov909/rjavacmecab")