概要

rjumanpp パッケージは、表記ゆれや話し言葉に強いと言われる日本語形態素解析器 JUMAN++ を R から操作するためのパッケージです。

インストール

JUMAN++のインストール

現在、JUMAN++ は Windows には対応していないようです。

Mac

Homebrew でインストールできます。

$ brew install jumanpp

Linux(例: Ubuntu)

$ wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.01.tar.xz
$ tar xJvf jumanpp-1.01.tar.xz
$ cd jumanpp-1.01/
$ ./configure
$ make
$ sudo make install

rjumanpp のインストール

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レポジトリで公開しています。

https://github.com/ymattu/rjumanpp

詳細

関数

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++ のサーバーを停止します。

関連するソフト、パッケージ