SudachiR is an R version of Sudachi, a Japanese morphological analyzer.
You can install the released version of {sudachir}
from CRAN with:
install.packages("sudachir")
and also, the developmment version from GitHub.
if (!requireNamespace("remotes"))
install.packages("remotes")
remotes::install_github("uribo/sudachir")
{sudachir}
works with
sudachipy
(>= 0.6.*) via the
reticulate package.
To get started, it requires a Python environment that has sudachipy and its dictionaries already installed and available.
This package provides a function install_sudachipy
which helps users
prepare a Python virtual environment. The desired modules (sudachipy
,
sudachidict_core
, pandas
) can be installed with this function, but
can also be installed manually.
library(reticulate)
library(sudachir)
if (!virtualenv_exists("r-sudachipy")) {
install_sudachipy()
}
use_virtualenv("r-sudachipy", required = TRUE)
Use tokenize_to_df
for tokenization.
txt <- c(
"国家公務員は鳴門海峡に行きたい",
"吾輩は猫である。\n名前はまだない。"
)
tokenize_to_df(data.frame(doc_id = c(1, 2), text = txt))
#> # A tibble: 18 × 13
#> doc_id sentence_id token_id surface dicti…¹ norma…² readi…³ 品詞1 品詞2 品詞3
#> <dbl> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 1 1 1 国家公… 国家公… 国家公… コッカ… 名詞 普通… 一般
#> 2 1 1 2 は は は ハ 助詞 係助… <NA>
#> 3 1 1 3 鳴門 鳴門 鳴門 ナルト 名詞 固有… 地名
#> 4 1 1 4 海峡 海峡 海峡 カイキ… 名詞 普通… 一般
#> 5 1 1 5 に に に ニ 助詞 格助… <NA>
#> 6 1 1 6 行き 行く 行く イキ 動詞 非自… <NA>
#> 7 1 1 7 たい たい たい タイ 助動… <NA> <NA>
#> 8 2 1 1 吾輩 吾輩 我が輩 ワガハ… 代名… <NA> <NA>
#> 9 2 1 2 は は は ハ 助詞 係助… <NA>
#> 10 2 1 3 猫 猫 猫 ネコ 名詞 普通… 一般
#> 11 2 1 4 で だ だ デ 助動… <NA> <NA>
#> 12 2 1 5 ある ある 有る アル 動詞 非自… <NA>
#> 13 2 1 6 。 。 。 。 補助… 句点 <NA>
#> 14 2 2 1 名前 名前 名前 ナマエ 名詞 普通… 一般
#> 15 2 2 2 は は は ハ 助詞 係助… <NA>
#> 16 2 2 3 まだ まだ 未だ マダ 副詞 <NA> <NA>
#> 17 2 2 4 ない ない 無い ナイ 形容… 非自… <NA>
#> 18 2 2 5 。 。 。 。 補助… 句点 <NA>
#> # … with 3 more variables: 品詞4 <chr>, 活用型 <chr>, 活用形 <chr>, and
#> # abbreviated variable names ¹dictionary_form, ²normalized_form,
#> # ³reading_form
You can control which dictionary features are parsed using the
col_select
argument.
tokenize_to_df(txt, col_select = 1:3) |>
dplyr::glimpse()
#> Rows: 18
#> Columns: 10
#> $ doc_id <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
#> $ sentence_id <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2
#> $ token_id <dbl> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5
#> $ surface <chr> "国家公務員", "は", "鳴門", "海峡", "に", "行き", "た…
#> $ dictionary_form <chr> "国家公務員", "は", "鳴門", "海峡", "に", "行く", "た…
#> $ normalized_form <chr> "国家公務員", "は", "鳴門", "海峡", "に", "行く", "た…
#> $ reading_form <chr> "コッカコウムイン", "ハ", "ナルト", "カイキョウ", "ニ"…
#> $ 品詞1 <chr> "名詞", "助詞", "名詞", "名詞", "助詞", "動詞", "助動…
#> $ 品詞2 <chr> "普通名詞", "係助詞", "固有名詞", "普通名詞", "格助詞"…
#> $ 品詞3 <chr> "一般", NA, "地名", "一般", NA, NA, NA, NA, NA, "一般"…
tokenize_to_df(
txt,
into = dict_features("en"),
col_select = c("pos1", "pos2")
) |>
dplyr::glimpse()
#> Rows: 18
#> Columns: 9
#> $ doc_id <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
#> $ sentence_id <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2
#> $ token_id <dbl> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5
#> $ surface <chr> "国家公務員", "は", "鳴門", "海峡", "に", "行き", "た…
#> $ dictionary_form <chr> "国家公務員", "は", "鳴門", "海峡", "に", "行く", "た…
#> $ normalized_form <chr> "国家公務員", "は", "鳴門", "海峡", "に", "行く", "た…
#> $ reading_form <chr> "コッカコウムイン", "ハ", "ナルト", "カイキョウ", "ニ"…
#> $ pos1 <chr> "名詞", "助詞", "名詞", "名詞", "助詞", "動詞", "助動…
#> $ pos2 <chr> "普通名詞", "係助詞", "固有名詞", "普通名詞", "格助詞"…
The as_tokens
function can tidy up tokens and the first part-of-speech
informations into a list of named tokens. Also, you can use the form
function as a shorthand of tokenize_to_df(txt) |> as_tokens()
.
tokenize_to_df(txt) |> as_tokens(type = "surface")
#> $`1`
#> 名詞 助詞 名詞 名詞 助詞 動詞
#> "国家公務員" "は" "鳴門" "海峡" "に" "行き"
#> 助動詞
#> "たい"
#>
#> $`2`
#> 代名詞 助詞 名詞 助動詞 動詞 補助記号 名詞 助詞
#> "吾輩" "は" "猫" "で" "ある" "。" "名前" "は"
#> 副詞 形容詞 補助記号
#> "まだ" "ない" "。"
form(txt, type = "surface")
#> $`1`
#> 名詞 助詞 名詞 名詞 助詞 動詞
#> "国家公務員" "は" "鳴門" "海峡" "に" "行き"
#> 助動詞
#> "たい"
#>
#> $`2`
#> 代名詞 助詞 名詞 助動詞 動詞 補助記号 名詞 助詞
#> "吾輩" "は" "猫" "で" "ある" "。" "名前" "は"
#> 副詞 形容詞 補助記号
#> "まだ" "ない" "。"
form(txt, type = "normalized")
#> $`1`
#> 名詞 助詞 名詞 名詞 助詞 動詞
#> "国家公務員" "は" "鳴門" "海峡" "に" "行く"
#> 助動詞
#> "たい"
#>
#> $`2`
#> 代名詞 助詞 名詞 助動詞 動詞 補助記号 名詞 助詞
#> "我が輩" "は" "猫" "だ" "有る" "。" "名前" "は"
#> 副詞 形容詞 補助記号
#> "未だ" "無い" "。"
form(txt, type = "dictionary")
#> $`1`
#> 名詞 助詞 名詞 名詞 助詞 動詞
#> "国家公務員" "は" "鳴門" "海峡" "に" "行く"
#> 助動詞
#> "たい"
#>
#> $`2`
#> 代名詞 助詞 名詞 助動詞 動詞 補助記号 名詞 助詞
#> "吾輩" "は" "猫" "だ" "ある" "。" "名前" "は"
#> 副詞 形容詞 補助記号
#> "まだ" "ない" "。"
form(txt, type = "reading")
#> $`1`
#> 名詞 助詞 名詞 名詞
#> "コッカコウムイン" "ハ" "ナルト" "カイキョウ"
#> 助詞 動詞 助動詞
#> "ニ" "イキ" "タイ"
#>
#> $`2`
#> 代名詞 助詞 名詞 助動詞 動詞 補助記号 名詞
#> "ワガハイ" "ハ" "ネコ" "デ" "アル" "。" "ナマエ"
#> 助詞 副詞 形容詞 補助記号
#> "ハ" "マダ" "ナイ" "。"
tokenize_to_df(txt, instance = rebuild_tokenizer("B")) |>
as_tokens("surface", pos = FALSE)
#> $`1`
#> [1] "国家" "公務員" "は" "鳴門" "海峡" "に" "行き" "たい"
#>
#> $`2`
#> [1] "吾輩" "は" "猫" "で" "ある" "。" "名前" "は" "まだ" "ない"
#> [11] "。"
tokenize_to_df(txt, instance = rebuild_tokenizer("A")) |>
as_tokens("surface", pos = FALSE)
#> $`1`
#> [1] "国家" "公務" "員" "は" "鳴門" "海峡" "に" "行き" "たい"
#>
#> $`2`
#> [1] "吾輩" "は" "猫" "で" "ある" "。" "名前" "は" "まだ" "ない"
#> [11] "。"
You can touch dictionary options using the rebuild_tokenizer
function.
if (py_module_available("sudachidict_full")) {
tokenizer_full <- rebuild_tokenizer(mode = "C", dict_type = "full")
tokenize_to_df(txt, instance = tokenizer_full) |>
as_tokens("surface", pos = FALSE)
}
#> $`1`
#> [1] "国家公務員" "は" "鳴門海峡" "に" "行き"
#> [6] "たい"
#>
#> $`2`
#> [1] "吾輩は猫である" "。" "名前" "は"
#> [5] "まだ" "ない" "。"