結論

tokenize()tokenize_tbl()が最速、次にlemmatize()lemmatize_tbl()、最後にpos_simple()pos()となっています。 最も遅いpos()でも、RMeCabRMeCabC()より高速です。

pos()tokenize()では速度に大きな差があるため、利用目的に応じて使い分けたり、並列化することが考えられます。

RMeCabとの比較

microbenchmarkパッケージを用いて、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の関数同士の比較

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()よりも高速であることがわかります。