rjumanpp パッケージは、表記ゆれや話し言葉に強いと言われる日本語形態素解析器 JUMAN++ を R から操作するためのパッケージです。
githubinstall::githubinstall()
関数または devtools::install_github()
関数でインストールします。
# if you have not installed "githubinstall" and "devtools" packages
install.packages(c("githubinstall", "devtools"))
# using githuninstall
githubinstall::githubinstall("rjumanpp")
# usingdevtools
devtools::install_github("ymattu/rjumanpp")
rjumanpp パッケージのソースコードは以下のGitHubレポジトリで公開しています。
rjumanpp パッケージは形態素解析に関する基本的な関数を提供します。
また、JUMAN++ をサーバーモードで動かすための関数もサポートしています。
関数には jum
という共通のプレフィックスをつけています。関数を使うためには、 rjumanpp パッケージを以下のように読み込む必要があります。
library(rjumanpp)
文字列を引数として単純な形態素解析をしたい場合は、jum_c()
関数を使います。 RMeCab::RMeCabC()
のように、品詞が names 属性のリストを返します。
jum_c("私はミルクティを飲みました")
#> [[1]]
#> 名詞
#> "私"
#>
#> [[2]]
#> 助詞
#> "は"
#>
#> [[3]]
#> 名詞
#> "ミルクティ"
#>
#> [[4]]
#> 助詞
#> "を"
#>
#> [[5]]
#> 動詞
#> "飲み"
#>
#> [[6]]
#> 接尾辞
#> "ました"
単純に文章を入力して分かち書きを得たい場合は jum_wakati()
関数を使います。オプションを何も指定しない場合は、入力した文字列の表層形を返します。
jum_wakati("私はミルクティを飲みました")
#> [1] "私 は ミルクティ を 飲み ました"
品詞を指定して分かち書きを得ることもできます。
jum_wakati("私はミルクティを飲みました", pos = "名詞")
#> [1] "私 ミルクティ"
pos
引数は ICU 正規表現による指定が可能で、pos = "名詞|形容詞"
のように書くこともできます。
第二引数(mypref
)を1にすると、活用のある品詞に関してはその原形を返します。
# 活用形は原形で
jum_wakati("私はミルクティを飲みました", 1)
#> [1] "私 は ミルクティ を 飲む ます"
redirect
オプションを TRUE
にすることで、表記ゆれ(JUMAN++ の Wikipedia リダイレクトで取得)を置き換えることができます。
jum_wakati("私はけんさくえんじんぐーぐるを使う", redirect = TRUE)
#> [1] "私 は けんさく えんじん Google を 使う"
jum_wakati("私はけんさくえんじんぐーぐるを使う", pos = "名詞", redirect = TRUE)
#> [1] "私 けんさく えんじん Google"
pos
, redirect
, mypref
, 後述する server
引数は現在以下の関数で使うことができます。
また、以下の関数では server
引数のみをサポートしています。
実際にデータ解析をする場合、データフレームの特定の列に対して形態素解析をしたいことがしばしばあります。そのような時は、 dplyr::rowwise()
関数で1行ごとに区切って jum_wakati()
関数に渡します。
library(dplyr)
library(knitr) # 出力のため
a <- data_frame(id = c(1:3),
text = c("新しいスマートフォンを買った", "今夜はミルクティを飲む", "私には外国人参政権がある"))
a %>%
rowwise() %>%
mutate(wakati = jum_wakati(text)) %>%
kable()
id | text | wakati |
---|---|---|
1 | 新しいスマートフォンを買った | 新しい スマートフォン を 買った |
2 | 今夜はミルクティを飲む | 今夜 は ミルクティ を 飲む |
3 | 私には外国人参政権がある | 私 に は 外国 人 参政 権 が ある |
jum_text()
関数JUMAN++に文字列を渡して、素の結果を出力します。
jum_text("新しいスマートフォンを買った")
#> [[1]]
#> [1] "新しい" "あたらしい"
#> [3] "新しい" "形容詞"
#> [5] "3" "*"
#> [7] "0" "イ形容詞イ段"
#> [9] "19" "基本形"
#> [11] "2" "\"代表表記:新しい/あたらしい"
#> [13] "反義:形容詞:古い/ふるい\""
#>
#> [[2]]
#> [1] "スマートフォン" "スマートフォン"
#> [3] "スマートフォン" "名詞"
#> [5] "6" "普通名詞"
#> [7] "1" "*"
#> [9] "0" "*"
#> [11] "0" "\"自動獲得:Wikipedia"
#> [13] "Wikipedia上位語:用語/ようご\""
#>
#> [[3]]
#> [1] "を" "を" "を" "助詞" "9" "格助詞" "1"
#> [8] "*" "0" "*" "0" "NIL"
#>
#> [[4]]
#> [1] "買った" "かった"
#> [3] "買う" "動詞"
#> [5] "2" "*"
#> [7] "0" "子音動詞ワ行"
#> [9] "12" "タ形"
#> [11] "10" "\"代表表記:買う/かう"
#> [13] "ドメイン:家庭・暮らし;ビジネス" "反義:動詞:売る/うる\""
jum_file()
関数jum_text()
関数の入力をテキストファイルにしたバージョンです。
JUMAN++ はサーバーモードとして常に起動しておくことができます。これにより、新しい入力のたびにJUMAN++ を呼び出すオーバーヘッドを回避し、結果を高速に得ることができます。
サーバーモードを使うためには、Ruby
がインストールされている必要があるため、インストールされていない場合は適宜インストールをしてください。
rjumanppパッケージからサーバーモードを使うためには、まず jum_start_server()
関数でサーバーを起動します。そして、形態素解析の関数で server = TRUE
を指定します。
# JUMAN++サーバーを起動
jum_start_server()
# 関数内でserver=TRUEを指定
jum_wakati("新しいスマートフォンを買った", server = TRUE)
#> [1] "新しい スマートフォン を 買った"
jum_start_server()
関数は、必要に応じてサーバーの名前とポート番号を指定することができます。デフォルトではlocalhostの12000ポートにつなぎます。
jum_start_server(host.name = "hoge", port = 1234)
サーバーモードで JUMAN++ を利用することで、どの程度実行が速くなるのか見てみましょう。
# サーバーを利用しない
system.time(jum_wakati("新しいスマートフォンを買った", server = FALSE))
#> ユーザ システム 経過
#> 0.124 0.260 0.395
# サーバーを利用する
system.time(jum_wakati("新しいスマートフォンを買った", server = TRUE))
#> ユーザ システム 経過
#> 0.082 0.090 0.210
実行時間に明らかに差が出ていることが分かります。
解析が終了したら、 JUMAN++ のサーバーを停止します。