tokenize()
とtokenize_tbl()
が最速、次にlemmatize()
とlemmatize_tbl()
、最後にpos_simple()
とpos()
となっています。
最も遅いpos()
でも、RMeCab
のRMeCabC()
より高速です。
pos()
とtokenize()
では速度に大きな差があるため、利用目的に応じて使い分けたり、並列化することが考えられます。
microbenchmark
パッケージを用いて、RMeCab
との簡易的な速度比較を行います。
library(RcppJagger)
library(microbenchmark)
library(RMeCab)
『Rによる日本語のテキスト分析入門』で使用されたデータを用います。
data <- readr::read_csv(
"https://raw.githubusercontent.com/koheiw/workshop-IJTA/master/data/asahi_head.txt",
col_names = FALSE
) |> dplyr::rename(text = X1)
head(data)
## # A tibble: 6 × 1
## text
## <chr>
## 1 解散時期、政権見極め 支持率・株価も考慮か 同日選視野
## 2 大統領府が談話、世論沈静化図る 日韓合意受け2度目
## 3 (新発想で挑む 地方の現場から:1)常識を打ち破ろう 水田にトウモロコシ、農…
## 4 「中国はいずれTPPに参加」 「『Gゼロ』後の世界」著者、イアン・ブレマー氏
## 5 国産空母の建造、中国政府認める
## 6 韓国、大学生30人を検挙 慰安婦問題合意で抗議行動
分析内容が最も近い、RcppJagger::pos_simple()
とRMeCab::RMeCabC()
の速度を比較します。
model_path <- "/usr/local/lib/jagger/model/kwdlc"
res1 <- microbenchmark(
"RcppJagger" = {
res <- pos_simple(data$text, model_path = model_path)
},
"RMeCab" = {
res <- purrr::map(data$text, RMeCabC)
},
times = 10
)
Model | Min | 1st Qu. | Mean | Median | 3rd Qu. | Max | Count |
---|---|---|---|---|---|---|---|
RcppJagger | 0.85 s | 0.88 s | 1.04 s | 0.89 s | 1.08 s | 1.51 s | 10 |
RMeCab | 4.69 s | 4.80 s | 5.17 s | 4.88 s | 5.03 s | 7.13 s | 10 |
中央値での比較では、RcppJagger
の方がRMeCab
よりも約5.5倍速いことがわかります。
実装上の工夫をすることで、更なる高速化を期待できます。
RcppJaggerの関数にも速度の違いがあります。
model_path <- "/usr/local/lib/jagger/model/kwdlc"
res2 <- microbenchmark(
"pos" = {
res <- pos(data$text, model_path = model_path)
},
"pos_simple" = {
res <- pos_simple(data$text, model_path = model_path)
},
"tokenize" = {
res <- tokenize(data$text, model_path = model_path)
},
"tokenize2" = {
res <- tokenize(data$text, model_path = model_path, concat = FALSE)
},
"tokenize_tbl" = {
res <- tokenize_tbl(data, "text", model_path = model_path)
},
"lemmatize" = {
res <- lemmatize(data$text, model_path = model_path)
},
"lemmatize2" = {
res <- lemmatize(data$text, model_path = model_path, concat = FALSE)
},
"lemmatize_tbl" = {
res <- lemmatize_tbl(data, "text", model_path = model_path)
},
times = 10
)
Function | Min | 1st Qu. | Mean | Median | 3rd Qu. | Max | Count |
---|---|---|---|---|---|---|---|
pos | 2.03 s | 2.16 s | 2.16 s | 2.16 s | 2.19 s | 2.24 s | 10 |
pos_simple | 0.87 s | 0.92 s | 0.94 s | 0.95 s | 0.96 s | 0.99 s | 10 |
tokenize | 0.20 s | 0.22 s | 0.23 s | 0.23 s | 0.24 s | 0.24 s | 10 |
tokenize2 | 0.30 s | 0.31 s | 0.33 s | 0.33 s | 0.34 s | 0.38 s | 10 |
tokenize_tbl | 0.21 s | 0.21 s | 0.23 s | 0.24 s | 0.24 s | 0.25 s | 10 |
lemmatize | 0.57 s | 0.58 s | 0.60 s | 0.59 s | 0.60 s | 0.63 s | 10 |
lemmatize2 | 0.64 s | 0.66 s | 0.70 s | 0.71 s | 0.73 s | 0.75 s | 10 |
lemmatize_tbl | 0.57 s | 0.58 s | 0.60 s | 0.60 s | 0.62 s | 0.63 s | 10 |
中央値の比較では、tokenize()
とlemmatize()
の方がpos()
とpos_simple()
よりも高速であることがわかります。