【Alteryx Tips】MeCabで形態素解析を行う

MeCabで手軽に形態素解析を行う方法をご紹介します

日本語のテキストマイニングを行う場合、一番ベーシックとなるのが形態素解析です。ここでは、AlteryxのPythonツールで利用できる形態素解析用のパッケージ「MeCab」を使う方法をご紹介します。

ところで、形態素解析といえば、MeCabです。ただ、以前はPythonやRから使う際もインストーラを使ってインストールを行う必要がありましたが、MeCab-Python3パッケージの出現により、別途インストールが不要となりました。これにより、手軽に形態素解析を始めることができるようになりました。

MeCab-Python3のパッケージのインストール方法

MeCab-Python3を使用する前に、Microsoft Visual C++ 再頒布可能パッケージのインストールが必要になります。これは、Microsoftのホームページからダウンロードし、インストール願います。

次に以下の一文をPythonツールのJupyterNotebookに記入します。これでMecab-Python3が利用可能です。

Package.installPackages(['mecab-python3'])

 

また、辞書が必要になるので、unidic-liteもインストールしましょう。unidicを使いたい、ということであれば、別途ローカルにダウンロードする必要があります。

Package.installPackages(['unidic-lite'])

 

入力データとワークフロー

それでは、適当な例文にはなりますが、MeCabで形態素解析してみたいと思います。

明日は目黒川で花見をします。

ワークフローとしては以下のような形になります。

MeCabサンプルWF

MeCabの使い方

まず、いちばん簡単な形でMeCabを使ってみたいと思います。Pythonのコードとしては以下のとおりです(パッケージのインストールなどは上で行なった通り実施済みとします)。

 

from ayx import Alteryx
import pandas as pd
import MeCab

#unidicを一度インストールしてしまうと、辞書のパス(-rオプションと-dオプション)を明示的に指定する必要があります
import unidic_lite
dic_path = unidic_lite.__path__[0].replace('\\','/') + '/dicdir/'
rc_path = unidic_lite.__path__[0].replace('\\','/') + '/dicdir/mecabrc'
mecaboption = "-r '" + rc_path + "' -d '" + dic_path + "'"

#MeCabインスタンス作成
mecab = MeCab.Tagger(mecaboption)

#データ読み込み
contents = Alteryx.read("#1") 
#形態素解析処理実行
values = mecab.parse(contents.loc[0,'Field1']).splitlines()
#出力用にDataFrame作成
df = pd.DataFrame(values,columns=['MeCab output'])

# データ出力
Alteryx.write(df,1)

 

unidic_liteがインストール済みで、unidicをインストールしてなければ、mecaboptionを作成している5~9行目は不要です。unidicをインストールしている場合は、明示的に辞書のパスを指定する必要があるので、このようなコードを追加しています。

 

MeCabをインポート後、Taggerメソッドのインスタンスを作成します。この時、辞書のパスなどをオプションで渡すことができます。その後、parseメソッドでテキストを形態素解析することができます。

ただ、得られた結果は若干加工しないとそのままではAlteryxのワークフローに渡せません(Alteryxに渡すデータは、データフレーム型である必要があります)。その部分は、19行目です。

 

なお、parseメソッドで得られる結果は以下のような形になります。分かち書きされた各要素自体が改行コードで区切られているので、splitlines()メソッドで分割しています。その詳細はさらにタブ区切りで区切られています。そして最後になぜかEOSが入っています。

['明日\tアス\tアス\t明日\t名詞-普通名詞-副詞可能\t\t\t2,0',
 'は\tワ\tハ\tは\t助詞-係助詞\t\t\t',
 '目黒\tメグロ\tメグロ\tメグロ\t名詞-固有名詞-地名-一般\t\t\t1',
 '川\tカワ\tカワ\t川\t名詞-普通名詞-一般\t\t\t2',
 'で\tデ\tデ\tで\t助詞-格助詞\t\t\t',
 '花見\tハナミ\tハナミ\t花見\t名詞-普通名詞-一般\t\t\t3',
 'を\tオ\tヲ\tを\t助詞-格助詞\t\t\t',
 'し\tシ\tスル\t為る\t動詞-非自立可能\tサ行変格\t連用形-一般\t0',
 'ます\tマス\tマス\tます\t助動詞\t助動詞-マス\t終止形-一般\t',
 '。\t\t\t。\t補助記号-句点\t\t\t',
 'EOS']

 

今回はこのまま出力してみましょう。

MeCabそのままの出力結果

それぞれタブ区切りとハイフン区切りをAlteryxで処理すると、以下のようになります。

結果

 

実際のコード

複数行を読み込み処理を行うためのワークフローおよびPythonのコードは以下の通りとなります。さらにPython内でタブ区切りの分割までは済ませています。

MeCabWF

 

from ayx import Alteryx
import pandas as pd
import MeCab

#unidicを一度インストールしてしまうと、辞書のパス(-rオプションと-dオプション)を明示的に指定する必要があります
import unidic_lite
dic_path = unidic_lite.__path__[0].replace('\\','/') + '/dicdir/'
rc_path = unidic_lite.__path__[0].replace('\\','/') + '/dicdir/mecabrc'
mecaboption = "-r '" + rc_path + "' -d '" + dic_path + "'"

#MeCabインスタンス作成
mecab = MeCab.Tagger(mecaboption)

contents = Alteryx.read("#1")
lines = [] #出力用データ保存用
i = 0 #レコードカウンタ(元の文章) 
j = 0 #レコードカウンタ(分かち書き後)

for txt in contents['Field1']: #※1 ループ
    j = 0
    values = mecab.parse(txt).splitlines()
    for value in values:
        lines.append((str(i)+"\t"+str(j)+"\t"+value).split('\t'))
        j = j + 1
    del lines[-1] #最後のレコードは「EOS」のため削除
    i = i + 1

df = pd.DataFrame(lines,columns=['Record_No','No','表層','発音','読み','原型','品詞','活用型','活用形','アクセント型'])
#dicrcファイルに記載のフォーマットで定義される(https://clrd.ninjal.ac.jp/unidic/faq.html)

# データ出力
Alteryx.write(df,1)

 

複数レコードが入ってきても処理できるように、ループを組んでいます(※1の部分です)。

最終的な結果は以下のとおりです。

結果

問題なく形態素解析が完了しています。

サンプルワークフロー

MeCab_python3_Sample

  • MeCab-Python3基礎.yxmd ・・・ シンプルなバージョン
  • MeCabを使う.yxmd ・・・ 複数レコードに対応したバージョン

参考URL

mecab-python3

PythonでMeCabを動かそうとしたらmecabrc ファイルが無いというエラーが出たので原因を調べた

マクロ版

 

written by AkimasaKajitani

おすすめの記事