★データ解析備忘録★

ゆる〜い技術メモ

形態素解析器JUMAN++をRから操作するパッケージを作り始めました

はじめに

JUMAN++という日本語の形態素解析器が昨年登場したようです。 速度はMeCabには劣るものの、解析精度(特に表記ゆれや話し言葉)に強いようです。

JUMAN++自体のインストールや使い方は公式マニュアルや以下のリンクが参考になります。

qiita.com

あと、おそらくJUMAN++は現時点ではWindows非対応なので、以下の話は全部MacLinux限定の話になります…

パッケージを作りたい

OSは限られるものの、やっぱりこういうのってRから操作したくなります。 C++ラッパーがあればRcppで書けるのですがそれも探したところないようなので、以下のリンクを参考にコマンドラインで実行したものをRの変数に入れるというやや強引な方法で関数を書いています。

wanko-sato.hatenablog.com

また、まだ本当に作り始めたばっかりで現状1種類の関数しかないという大変お粗末な状況です。これからがんばります。作ったパッケージは以下になります。

github.com

devtools::install_github("ymattu/rjumanpp")

# または
githubinstall::githubinstall("rjumanpp")

でインストールできます。

使い方

分かち書きをする

とりあえず自分の目の前の用途に合わせて、テキストを入力したら分かち書きをして文字列で返すという単純な関数を用意しました。分かち書きさえできれば {tidytext} パッケージで色々できるので…

##' @param input input text
##' @param pattern extract pattern i.e. "名詞|動詞"
##' @return seperated words of the input text
##' @export
##' @importFrom magrittr %>%
##' @importFrom stringr str_subset str_split str_detect
jum_wakati <- function (input, pos = NULL){
  if (!is.character(input)) {
    input <- as.character(input)
  }
  if (nchar(input) < 1) {
    stop("first argument must be specified")
  }

  command <- paste("echo", input, "| jumanpp --force-single-path")

  # 素の結果を出力
  res <- system(command, intern = T) %>%
    str_subset("^(?!EOS)") # EOSを削除

  # リスト化
  res_list <- lapply(res, function(x){
    out <- unlist(str_split(x, pattern = " "))
    return(unlist(out))
  })

  # 品詞の指定があれば、指定したものだけを出力
  if(is.null(pos) == TRUE) {
    res_morph <- unlist(sapply(res_list, function(x){return(x[1])}))
  } else {
    res_morph <- unlist(sapply(res_list, function(x){
      if(str_detect(x[4], pattern) == TRUE){
        return(x[1])
      }
    }))
  }

  wakati <- paste(res_morph, collapse = " ")

  return(wakati)

}
使い方
jum_wakati("私には外国人参政権がある。")
#> [1] "私 に は 外国 人 参政 権 が ある 。"

品詞を指定して分かち書きを得ることもできます。

jum_wakati("私には外国人参政権がある。", pos = "名詞")
#> [1] "私 外国 人 参政 権"

pattern引数は ICU 正規表現による指定が可能で、pos = "名詞|形容詞"のように書くこともできます。

今後の開発予定

これからファイルを入力したときへの対応や、JUMAN++の目玉である表記ゆれなどへのオプションや関数を作って行く予定です。

Enjoy!!