pos()pos_simple()

Rで、以下のようにJaggerを利用できます。

library(RcppJagger)
sentence <- "青く青く、澄んでいる。美しい夕空を、ながいこと見つめたから、こんなにいい目になったのかしら。"
pos(sentence)
## [[1]]
## [[1]]$token
##  [1] "青く"     "青く"     "、"       "澄んで"   "いる"     "。"      
##  [7] "美しい"   "夕空"     "を"       "、"       "ながい"   "こと"    
## [13] "見つめた" "から"     "、"       "こんなに" "いい"     "目"      
## [19] "に"       "なった"   "の"       "かしら"   "。"      
## 
## [[1]]$pos
##  [1] "形容詞" "形容詞" "特殊"   "動詞"   "接尾辞" "特殊"   "形容詞" "名詞"  
##  [9] "助詞"   "特殊"   "名詞"   "名詞"   "動詞"   "助詞"   "特殊"   "指示詞"
## [17] "形容詞" "接尾辞" "助詞"   "動詞"   "助動詞" "名詞"   "特殊"  
## 
## [[1]]$subtype
##  [1] "*"                "*"                "読点"             "*"               
##  [5] "動詞性接尾辞"     "句点"             "*"                "一般"            
##  [9] "格助詞"           "読点"             "サ変名詞"         "形式名詞"        
## [13] "*"                "接続助詞"         "読点"             "副詞形態指示詞"  
## [17] "*"                "名詞性名詞接尾辞" "格助詞"           "*"               
## [21] "*"                "普通名詞"         "句点"            
## 
## [[1]]$lemma
##  [1] "青い"     "青い"     "、"       "澄む"     "いる"     "。"      
##  [7] "美しい"   "夕空"     "を"       "、"       "ながい"   "こと"    
## [13] "見つめる" "から"     "、"       "こんなに" "いい"     "目"      
## [19] "に"       "なる"     "のだ"     "かしら"   "。"

エラーが出てRが終了してしまう場合や、形態素解析が行われない場合は、インストールのStep 6で確認したモデルのパスを指定してください。

以下のように、model_path引数を利用することで、モデルのパスを指定できます。 これは以下の全ての関数に共通です。

model_path <- "/usr/local/lib/jagger/model/kwdlc"
pos(sentence, model_path = model_path)

keep引数を利用することで、結果に含める品詞を指定できます。

pos(sentence, model_path = model_path, keep = c("動詞", "形容詞"))
## [[1]]
## [[1]]$token
## [1] "青く"     "青く"     "澄んで"   "美しい"   "見つめた" "いい"     "なった"  
## 
## [[1]]$pos
## [1] "形容詞" "形容詞" "動詞"   "形容詞" "動詞"   "形容詞" "動詞"  
## 
## [[1]]$subtype
## [1] "*" "*" "*" "*" "*" "*" "*"
## 
## [[1]]$lemma
## [1] "青い"     "青い"     "澄む"     "美しい"   "見つめる" "いい"     "なる"

pos()関数は、listを返しますが、listの各要素をdata.frameとすることができます。

pos(sentence, model_path = model_path, keep = c("動詞", "形容詞"), format = "data.frame")
## [[1]]
##      token    pos subtype    lemma
## 1     青く 形容詞       *     青い
## 2     青く 形容詞       *     青い
## 3   澄んで   動詞       *     澄む
## 4   美しい 形容詞       *   美しい
## 5 見つめた   動詞       * 見つめる
## 6     いい 形容詞       *     いい
## 7   なった   動詞       *     なる

また、複数の文章を処理することもできます。

texts <- c(
  "青く青く、澄んでいる。美しい夕空を、ながいこと見つめたから、こんなにいい目になったのかしら。",
  "早速その蜘蛛の糸を両手でしっかりとつかみながら、一生懸命に上へ上へとたぐりのぼり始めました。",
  "二人はそこにすべてを忘れて、感激の涙にむせび合うたのであった。"
)
pos(texts, model_path = model_path, format = "data.frame",  keep = c("動詞", "形容詞"))
## [[1]]
##      token    pos subtype    lemma
## 1     青く 形容詞       *     青い
## 2     青く 形容詞       *     青い
## 3   澄んで   動詞       *     澄む
## 4   美しい 形容詞       *   美しい
## 5 見つめた   動詞       * 見つめる
## 6     いい 形容詞       *     いい
## 7   なった   動詞       *     なる
## 
## [[2]]
##        token    pos subtype      lemma
## 1     つかみ   動詞    自立     つかむ
## 2 一生懸命に 形容詞       * 一生懸命だ
## 3     たぐり   動詞    自立     たぐる
## 4     のぼり   動詞       *     のぼる
## 5       始め   動詞       *     始める
## 
## [[3]]
##    token  pos subtype  lemma
## 1 忘れて 動詞       * 忘れる
## 2 むせび 動詞    自立 むせぶ
## 3   合う 動詞       *   合う

詳細な結果が必要ない場合は、pos_simple()関数を利用することで、より高速に処理できます。

pos_simple(sentence, model_path = model_path)
## [[1]]
## [[1]]$token
##  [1] "青く"     "青く"     "、"       "澄んで"   "いる"     "。"      
##  [7] "美しい"   "夕空"     "を"       "、"       "ながい"   "こと"    
## [13] "見つめた" "から"     "、"       "こんなに" "いい"     "目"      
## [19] "に"       "なった"   "の"       "かしら"   "。"      
## 
## [[1]]$pos
##  [1] "形容詞" "形容詞" "特殊"   "動詞"   "接尾辞" "特殊"   "形容詞" "名詞"  
##  [9] "助詞"   "特殊"   "名詞"   "名詞"   "動詞"   "助詞"   "特殊"   "指示詞"
## [17] "形容詞" "接尾辞" "助詞"   "動詞"   "助動詞" "名詞"   "特殊"

keepformat引数は、pos_simple()にも利用できます。

pos_simple(texts, model_path = model_path, keep = c("動詞", "形容詞"), format = "data.frame")
## [[1]]
##      token    pos
## 1     青く 形容詞
## 2     青く 形容詞
## 3   澄んで   動詞
## 4   美しい 形容詞
## 5 見つめた   動詞
## 6     いい 形容詞
## 7   なった   動詞
## 
## [[2]]
##        token    pos
## 1     つかみ   動詞
## 2 一生懸命に 形容詞
## 3     たぐり   動詞
## 4     のぼり   動詞
## 5       始め   動詞
## 
## [[3]]
##    token  pos
## 1 忘れて 動詞
## 2 むせび 動詞
## 3   合う 動詞

tokenize()lemmatize()

RcppJaggerには、pos()関数以外にも、以下の関数があります。

tokenize(sentence, model_path = model_path)
## [1] "青く 青く 、 澄んで いる 。 美しい 夕空 を 、 ながい こと 見つめた から 、 こんなに いい 目 に なった の かしら 。"
lemmatize(sentence, model_path = model_path)
## [1] "青い 青い 、 澄む いる 。 美しい 夕空 を 、 ながい こと 見つめる から 、 こんなに いい 目 に なる のだ かしら 。"

keep引数は、tokenize()lemmatize()にも利用できます。 また、concat引数を利用することで、結果をリストとして返すことができます。

tokenize(sentence, model_path = model_path, keep = c("動詞", "形容詞"), concat = FALSE)
## [[1]]
## [1] "青く"     "青く"     "澄んで"   "美しい"   "見つめた" "いい"     "なった"
lemmatize(sentence, model_path = model_path,  keep = c("動詞", "形容詞"), concat = FALSE)
## [[1]]
## [1] "青い"     "青い"     "澄む"     "美しい"   "見つめる" "いい"     "なる"

これらの関数も複数の文章を処理することもできます。

tokenize(texts, model_path = model_path, keep = c("動詞", "形容詞"), concat = TRUE)
## [1] "青く 青く 澄んで 美しい 見つめた いい なった"
## [2] "つかみ 一生懸命に たぐり のぼり 始め"        
## [3] "忘れて むせび 合う"
lemmatize(texts, model_path = model_path,  keep = c("動詞", "形容詞"), concat = FALSE)
## [[1]]
## [1] "青い"     "青い"     "澄む"     "美しい"   "見つめる" "いい"     "なる"    
## 
## [[2]]
## [1] "つかむ"     "一生懸命だ" "たぐる"     "のぼる"     "始める"    
## 
## [[3]]
## [1] "忘れる" "むせぶ" "合う"

tokenize_tbl()lemmatize_tbl()

RcppJaggerには、tibbleに特化した関数もあります。

documents <- tibble::tibble(
  ID = seq_len(length(texts)),
  text = texts
)
t_tbl <- tokenize_tbl(documents, "text", model_path = model_path)
l_tbl <- lemmatize_tbl(documents, "text", model_path = model_path, keep = c("動詞", "名詞"))

*_tbl()は、quantedaパッケージと組み合わせて使う際に便利です。

library(quanteda)
corpus_test <- corpus(l_tbl, text_field = "lemmatized")
token_test <- tokens(corpus_test, what = "fastestword")
dfm_test <- dfm(token_test)
dfm_test
## Document-feature matrix of: 3 documents, 22 features (66.67% sparse) and 2 docvars.
##        features
## docs    澄む 夕空 ながい こと 見つめる なる かしら 蜘蛛 糸 両手
##   text1    1    1      1    1        1    1      1    0  0    0
##   text2    0    0      0    0        0    0      0    1  1    1
##   text3    0    0      0    0        0    0      0    0  0    0
## [ reached max_nfeat ... 12 more features ]

並列化

furrrパッケージを用いることで、並列化することができます。 以下のコードでは『Rによる日本語のテキスト分析入門』で使用されたデータを用います。

library(furrr)
library(dplyr)
nworkers <- 5
plan(multisession, workers = nworkers)

data <- readr::read_csv(
  "https://raw.githubusercontent.com/koheiw/workshop-IJTA/master/data/asahi_head.txt",
  col_names = FALSE
) %>%
  rename(text = X1) %>%
  mutate(ID = row_number()) %>%
  relocate(ID, text)

nrows <- nrow(data)
batch_size <- ceiling(nrows / nworkers)
split_index <- split(1:nrows, ceiling((1:nrows)/batch_size))

# pos
pos_list_furrr <- future_map(
  split_index,
  function(index) {
    pos(data[index, ][["text"]], model_path = model_path, keep = c("動詞", "名詞"))
  },
  .options = furrr_options(packages = c("RcppJagger", "tibble"), seed = TRUE)
) %>% unlist(recursive = FALSE, use.names = FALSE)
pos_list <- pos(data[["text"]], keep = c("動詞", "名詞"))
identical(pos_list, pos_list_furrr)

# lemmatize_tbl
l_tbl_furrr <- future_map_dfr(
  split_index,
  function(index) {
    lemmatize_tbl(data[index, ], "text", model_path = model_path, keep = c("動詞", "名詞"))
  },
  .options = furrr_options(packages = c("RcppJagger", "tibble"), seed = TRUE)
)

l_tbl <- lemmatize_tbl(data, "text", keep = c("動詞", "名詞"))
identical(l_tbl, l_tbl_furrr)

注意

readr::tokenize()がRcppJaggerの関数をマスクしてしまうことに気をつけてください。 library(tidyverse)や、library(readr)とした際にメッセージが表示されます。 マスクされた場合は、RcppJagger::tokenize()とすることで、RcppJaggerの関数を利用できます。