# PythonのMeCabモジュールをRから使う関数
# 以下の条件を満たすマシンでのみ動作する
# 1) reticulateパッケージを導入済み
# 2) pythonを導入済み
# 3) pythonでmecab-python3を導入済み
# オプション：
# dic：システム辞書ファイル（dic）のあるディレクトリを指定（Windowsではパスを\\で区切る）
# udic：ユーザー辞書ファイル（dic）のパスを指定
# header：出力時のヘッダ；辞書の見出し数と一致する数の文字ベクトル
mecaby <- function(target, dic = NA, udic = NA, header = NA){
    mecabpy <- reticulate::import(module = "MeCab")
    if(is.na(dic)){
        tagger <- mecabpy$Tagger()# デフォルトで設定されている辞書
    }else{
        tagger <- mecabpy$Tagger(paste0("-d \"", dic, "\""))
    }
    if(!is.na(udic)){# ユーザー辞書も指定されている場合
        tagger <- mecabpy$Tagger(paste0("-d \"", dirname(tagger$dictionary_info()$filename), "\" -u \"", udic, "\""))
    }
    res <- tagger$parse(target)
    decres <- strsplit(res, "\n")[[1]]
    divlet <- lapply(decres[-length(decres)], function(x) strsplit(x, "\t|((\"[^\",]+.*?\")(*SKIP)(*F)|,)", perl = TRUE)[[1]])# UniDicでは項目内にカンマがあるので正規表現検索で対応
    if(all(is.na(header))){
        divlim <- max(sapply(divlet, length), 10)# IPA辞書のヘッダ数を最小値とする
    }else{
        divlim <- length(header)
    }
    analyzedmat <- do.call("rbind", lapply(divlet, function(x) c(x, rep(NA, divlim - length(x)))))
    analyzeddat <- as.data.frame(analyzedmat)

    if(all(is.na(header))){# 指定がない場合
        if(divlim == 10){
            if(length(grep("unidic", basename(gsub(paste0(.Platform$file.sep, "dicdir"), "", dirname(tagger$dictionary_info()$filename))))) != 0){# Python版UniDicのヘッダを付ける
                names(analyzeddat) <- c("sufrace", "pron", "lForm", "lemma", "pos", "cType", "cForm", 
                                 "aType1", "aType2", "aModType")
            }else{# IPA辞書のヘッダを付ける
                names(analyzeddat) <- c("Surface_Value", "Part_of_Speech", "Part_of_Speech1", 
                                 "Part_of_Speech2", "Part_of_Speech3", "Conjugation", "Inflection", 
                                 "Root_Form", "Reading", "Pronunciation")
            }
        }else if(length(grep("unidic", basename(gsub(paste0(.Platform$file.sep, "dicdir"), "", dirname(tagger$dictionary_info()$filename))))) != 0){# 国研UniDicのヘッダを付ける
            names(analyzeddat) <- c("surface", "pos1", "pos2", "pos3", "pos4", "cType", "cForm", 
            "lForm", "lemma", "orth", "pron", "orthBase", "pronBase", "goshu", "iType", "iForm", 
            "fType", "fForm", "iConType", "fConType", "lType", "kana", "kanaBase", "form", "formBase", 
            "aType", "aConType", "aModType", "lid", "lemma_id")
        }
    }else{
        names(analyzeddat) <- header
    }
    return(analyzeddat)
}

