# sudachipyをRから使う関数
# 以下の条件を満たすマシンでのみ動作する
# 1) reticulateパッケージを導入済み
# 2) pythonを導入済み
# 3) pythonでsudachipyを導入済み
# 動作しているpython環境，バージョンの確認にはreticulateパッケージpy_config()関数を用いる
# オプション：
# mode：A，B，C（語の区切りが短，中，長）
# dic：small，core，full（辞書のサイズ；それぞれを予めインストールしておく必要がある）

# メイン関数
sudachy <- function(target, mode = "B", dic = "core"){
    sudachipy <- reticulate::import(module = "sudachipy")
    tokenizer_obj <- sudachipy$dictionary$Dictionary(dict_type = dic)$create()
    selectedM <- sudachipy$tokenizer$Tokenizer$SplitMode[mode]
    res <- tokenizer_obj$tokenize(text = target, mode = selectedM)
    analyzedmat <- do.call("rbind", lapply(1:res$size(), function(x) getMorph(res[x-1])))
    analyzeddat <- as.data.frame(analyzedmat)
    return(analyzeddat)
}


# tokenizer_objの出力から形態素情報を取り出す関数
getMorph <- function(res_part){
    posv <- res_part["part_of_speech"]() |> unlist()
    names(posv) <- paste0("POS", 1:6)
    morphv <- c("surface" = res_part["surface"](), 
        #"part_of_speech_id" = res_part["part_of_speech_id"](), 
        posv, 
        "normalized_form" = res_part["normalized_form"](), 
        "dictionary_form" = res_part["dictionary_form"](), 
        "reading_form" = res_part["reading_form"](), 
        "dictionary_id" = res_part["dictionary_id"]())
    return(morphv)
}
