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
引数を利用することで、結果に含める品詞を指定できます。
## [[1]]
## [[1]]$token
## [1] "青く" "青く" "澄んで" "美しい" "見つめた" "いい" "なった"
##
## [[1]]$pos
## [1] "形容詞" "形容詞" "動詞" "形容詞" "動詞" "形容詞" "動詞"
##
## [[1]]$subtype
## [1] "*" "*" "*" "*" "*" "*" "*"
##
## [[1]]$lemma
## [1] "青い" "青い" "澄む" "美しい" "見つめる" "いい" "なる"
pos()
関数は、list
を返しますが、list
の各要素を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] "形容詞" "接尾辞" "助詞" "動詞" "助動詞" "名詞" "特殊"
keep
やformat
引数は、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
引数を利用することで、結果をリストとして返すことができます。
## [[1]]
## [1] "青く" "青く" "澄んで" "美しい" "見つめた" "いい" "なった"
## [[1]]
## [1] "青い" "青い" "澄む" "美しい" "見つめる" "いい" "なる"
これらの関数も複数の文章を処理することもできます。
## [1] "青く 青く 澄んで 美しい 見つめた いい なった"
## [2] "つかみ 一生懸命に たぐり のぼり 始め"
## [3] "忘れて むせび 合う"
## [[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の関数を利用できます。