julia 0.6 で、PyCall 経由で、MeCab を動かして形態素解析

MeCab.jl が残念ながら、julia 0.6 では動かないようです。
julia 0.6.4 で、Pkg.add("MeCab") をすると、インストールができないばかりか、バージョンの依存性がメチャクチャになるので、Pkg.add("MeCab")はしてはいけません。

なお、1.0 用の fork が出ているようですが、上記のようなことがあり、試していません。

仕方が無いので、PyCall 経由で、MeCab を動かしましょう。

大前提は、julia から呼べる python で、MeCab が動くことです。

$ brew install mecab
$ brew install mecab-ipadic
$ pip install mecab-python3

こんな感じで、python3 から、MeCab が使えるはずです。

続いて、この python を、julia 側から呼び出せるようにしましょう。julia を立ち上げてから、

julia> ENV["PYTHON"] = "/usr/bin/python3" # 例
julia> Pkg.build("PyCall")

などとします。python のありかは、ターミナルで、

which python

と、入力したら出てくるずです。

ひきつづき julia 側から、PyCall で、MeCab を呼び出してみましょう。

using PyCall
MeCab = pyimport("MeCab")
m =  MeCab.Tagger("")
array_text ="親譲りの無鉄砲で小供の時から損ばかりしている。
  小学校に居る時分学校の二階から飛び降りて一週間ほど腰かした事がある。
  なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。
  新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、
  そこから飛び降りる事は出来まい。弱虫やーい。と囃したからである。
  小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて
  腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。"

function noun_array(array_text)
  parsed_item = m.parse(array_text)
  array_items = split(parsed_item, "\n")
  array_items = array_items[1:(length(array_items)-2)]
  row_true = findall(occursin.("\t名詞",array_items) )
  items_noun = array_items[row_true]
  for i in 1:length(items_noun)
    items_noun[i] = split(items_noun[i],"\t")[1]
  end
  return items_noun
end


function adj_array(array_text)
  parsed_item = m.parse(array_text)
  array_items = split(parsed_item, "\n")
  array_items = array_items[1:(length(array_items)-2)]
  row_true = findall( occursin.("\t形容詞",array_items) )
  items_adj = array_items[row_true]
  for i in 1:length(items_adj)
    items_adj[i] = split(items_adj[i],"\t")[1]
  end
  return items_adj
end

と、こんな感じで、array_text に入れた文章から noun_array(array_text) で名詞を返して、adj_array(array_text) で形容詞を返してくれます。

julia> noun_array(array_text)
39-element Array{SubString{String},1}:
 "親譲り"
 "無鉄砲"
 "供"
 "時"
 "損"
 "小学校"
 "時分"
 "学校"
 "二"
 "階"
 ⋮
 "い"
 "小使"
 "時"
 "おやじ"
 "眼"
 "二"
 "階"
 "腰"
 "奴"
 "次"

julia> adj_array(array_text)
2-element Array{SubString{String},1}:
 "深い"
 "ない"

array1 = noun_array(array_text) みたいに代入を忘れないで下さいね。

julia 1.0.x, PyCall v1.91.x で動くように書き替えました。

B! LINE