MeCab-Pythonを使ったIPADICとUNIDICの比較

MeCab-Pythonを使ったIPADICとUNIDICの比較

環境はPython3.4.2, Windows8です。

手順

  1. MeCab-Python導入を参考にmecab, mecab-pythonをインストール
  2. http://sourceforge.jp/projects/unidic/downloads/58338/unidic-mecab-2.1.2_bin.zip/よりunidic-mecab-2.1.2_bin.zipをダウンロード(クリックしたらダウンロード始まります)
  3. 解凍したら、出てきたフォルダをまるごとMeCabのインストールフォルダにあるMeCab\dic内部に移動。そこにはipadicもある。長いフォルダ名をunidicに変更するとよい。
  4. MeCab\etc\mecabrc内部のdicdirのパスの先をipadicからunidicに変更 (これでデフォルトで使う辞書がオプション-dを使わずともunidicになる)


unidicでは-Ochasenは使えない

unidic\dicrcを見ると、使えるオプションがわかります。ipadic\dicrcと比較するとわかりやすい。ipadicで使えた-Ochasenはunidicでは、unidic\dicrc内部に記述を追加しない限り使えないことがわかります。

python-mecabの辞書指定-dオプションにおけるRuntimeError

python-MeCabでは-dオプションがうまく使えず、辞書の場所を絶対パスで指定しても

<ipython-input-27-eb40ed1bd787> in <module>()
----> 1 m3 = MeCab.Tagger(r'-d c:\program files (x86)\MeCab\dic\ipadic')

c:\Python_venv\lib\site-packages\MeCab.py in __init__(self, *args)
    305     if _newclass:version = staticmethod(_MeCab.Tagger_version)
    306     def __init__(self, *args):
--> 307         this = _MeCab.new_Tagger(*args)
    308         try: self.this.append(this)
    309         except: self.this = this

RuntimeError:

が返ってきたので、mecabrc内部を書き換えてデフォルトの使用辞書を変更して対応。

辞書の比較

IPADIC

m0 = MeCab.Tagger('') #  ipadic was used

In [30]: m0.parse('徹夜明けでマックのハッシュポテト食べてるんご')
Out[30]: '徹夜\t名詞,サ変接続,*,*,*,*,徹夜,テツヤ,テツヤ\n明け\t名詞,接尾,一般,*
,*,*,明け,アケ,アケ\nで\t助詞,格助詞,一般,*,*,*,で,デ,デ\nマック\t名詞,固有名詞,
組織,*,*,*,マック,マック,マック\nの\t助詞,連体化,*,*,*,*,の,ノ,ノ\nハッシュ\t名
詞,一般,*,*,*,*,ハッシュ,ハッシュ,ハッシュ\nポテト\t名詞,一般,*,*,*,*,ポテト,ポ
テト,ポテト\n食べ\t動詞,自立,*,*,一段,連用形,食べる,タベ,タベ\nてる\t動詞,非自立
,*,*,一段,基本形,てる,テル,テル\nん\t名詞,非自立,一般,*,*,*,ん,ン,ン\nご\t接頭詞
,名詞接続,*,*,*,*,ご,ゴ,ゴ\nEOS\n'

IPADIC (茶筌フォーマット)



m1 = MeCab.Tagger('-Ochasen') # ipadic was used
In [29]: m1.parse('徹夜明けでマックのハッシュポテト食べてるんご')
Out[29]: '徹夜\tテツヤ\t徹夜\t名詞-サ変接続\t\t\n明け\tアケ\t明け\t名詞-接尾-一
般\t\t\nで\tデ\tで\t助詞-格助詞-一般\t\t\nマック\tマック\tマック\t名詞-固有名詞-
組織\t\t\nの\tノ\tの\t助詞-連体化\t\t\nハッシュ\tハッシュ\tハッシュ\t名詞-一般\t
\t\nポテト\tポテト\tポテト\t名詞-一般\t\t\n食べ\tタベ\t食べる\t動詞-自立\t一段\t
連用形\nてる\tテル\tてる\t動詞-非自立\t一段\t基本形\nん\tン\tん\t名詞-非自立-一
般\t\t\nご\tゴ\tご\t接頭詞-名詞接続\t\t\nEOS\n'

# MeCab\etc\mecabrcのdicdirをunidicに変更

UNIDIC

In [20]: m2 = MeCab.Tagger()

In [21]: m2.parse('徹夜明けでマックのハッシュポテト食べてるんご')
Out[21]: '徹夜\t名詞,普通名詞,サ変可能,*,*,*,テツヤ,徹夜,徹夜,テツヤ,徹夜,テツヤ
,漢,*,*,*,*,テツヤ,テツヤ,テツヤ,テツヤ,*,*,0,C2,*\n明け\t名詞,普通名詞,一般,*,*
,*,アケ,明け,明け,アケ,明け,アケ,和,*,*,*,*,アケ,アケ,アケ,アケ,*,*,0,C4,*\nで\t
助詞,格助詞,*,*,*,*,デ,で,で,デ,で,デ,和,*,*,*,*,デ,デ,デ,デ,*,*,*,"動詞%F2@0,名
詞%F1",*\nマック\t名詞,固有名詞,一般,*,*,*,マック,マック,マック,マック,マック,マ
ック,固,*,*,*,*,マック,マック,マック,マック,*,*,1,*,*\nの\t助詞,格助詞,*,*,*,*,
ノ,の,の,ノ,の,ノ,和,*,*,*,*,ノ,ノ,ノ,ノ,*,*,*,名詞%F1,*\nハッシュ\t名詞,普通名
詞,一般,*,*,*,ハッシュ,ハッシュ-hash,ハッシュ,ハッシュ,ハッシュ,ハッシュ,外,*,*,
*,*,ハッシュ,ハッシュ,ハッシュ,ハッシュ,*,*,1,C1,*\nポテト\t名詞,普通名詞,一般,*
,*,*,ポテト,ポテト-potato,ポテト,ポテト,ポテト,ポテト,外,*,*,*,*,ポテト,ポテト,
ポテト,ポテト,*,*,1,C1,*\n食べ\t動詞,一般,*,*,下一段-バ行,連用形-一般,タベル,食
べる,食べ,タベ,食べる,タベル,和,*,*,*,*,タベ,タベル,タベ,タベル,*,*,2,C1,*\nてる
\t助動詞,*,*,*,下一段-タ行,連体形-一般,テル,てる,てる,テル,てる,テル,和,*,*,*,*,
テル,テル,テル,テル,*,*,*,動詞%F1,*\nん\t感動詞,フィラー,*,*,*,*,ンー,んー,ん,ン
,ん,ン,和,*,*,*,*,ン,ン,ン,ン,*,*,0,*,*\nご\t記号,一般,*,*,*,*,ゴ,ゴ,ご,ゴ,ご,ゴ
,記号,*,*,*,*,ゴ,ゴ,ゴ,ゴ,*,*,1,*,*\nEOS\n'


/n/tをリストに、リストをHTMLに変換するコード

#!/usr/bin/env python
# -*- coding: utf-8 -*

def mecab_into_HTML(s):
    s = s.replace('\t',',')
    lst = [row.split(',') for row in s.split('\n')]
    clms = max([len(row) for row in lst])
    html = ''
    for row in lst:  
        num = len(row)
        html += ''+''.join([''.format(ele) for ele in row])+''*(clms-num)+''
    html += '
{0}
' return html



このコードで整形すると、テーブルが横に大きすぎてブログに表示しきれず。

参考文献

コメント

人気の投稿