05. MeCabインストール

次に手間と知識が必要なインストールなのが形態素解析用パッケージ「MeCab」です。
MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース形態素解析エンジンで、32ビット版windowsアプリとして存在したものを途中からpythonインターフェースが追加されさらました。

ややこしくしているのが昔は32ビット版windowsアプリであった点で、ベースは通常アプリをインストールするようにEXEを使用しインストールして、後にpython用インターフェースとしてpython-windowsモジュールをインストールする必要があるためで、最近ではベースをインストールせずpythonからインストールできる形態素解析のみを使用出来る簡易版と二種類存在します。但し後者の初期リリースが2018年ですから本サイト開始当初は出回ってい居なかった模様です。

https://github.com/SamuraiT/mecab-python3

★ MeCab本体インストール 64ビットアプリ版

現在我々が使用しているディープラーニング用必要モジュールの多くは既に64ビット専用であるため、お持ちのPCも64ビットのはずです。ところがMeCabのオリジナル版は「32ビット版windowsアプリ」となっています。
このため32ビット版をインストールしても差支えありませんが、一応非公式に「64ビット版」が存在するため、こちらを使用していきますので、自己責任でダウンロードし使用して下さい。

① 64版インストール
下記サイトに現在32ビット版と64ビット版があるため64版をダウンロードしインストールしてください。尚、32ビット版を使用する場合使用するフォルダー名は32ビット版に読み替えて下さい。
  MeCab : http://taku910.github.io/mecab/

② 「MeCab」アプリのインストール
本体「MeCab」はパソコンUI用アプリであるため、pythonとは無関係にEXEを実行するアプリ用インストール手法で行います。
インストールウィザード実行途中使用する文字エンコードを聞いてきますので、本サイトではテキストエディタやpython仕様を「UTF-8仕様」で統一しています。
UTF-8仕様の場合、インストール完了後、windowsディスクトップ上にアイコンが登場されアプリとして使用できますが、ウィンドウズはshiftJIS仕様であるため使用不可となりますので削除して下さい。
また、システム環境変数「Path」内にMecabアプリのインストールフォルダー(「C:\Program Files\MeCab\bin」)が登録されているかの確認してください。

★ MeCab本体インストール python版

前述の32ビット版は随分古いウィンドウズの名残だし、64ビット版は非公式であり怪しい為、pipを使用してpytonに簡単にインストールできないかということで、MeCabの形態素解析処理部のみをpythonで使用するラッパー「mecab-python3」があります。あくまでwindows専用ラッパーでMeCab本体ではありませんのでコマンドとして使用することはできませんが、形態素解析ならpythonで使用可能となります。

但し、 サポート対象はpython 3.6~3.9の狭い範囲で、2022年の最近python3.6以降全ての範囲に拡張されているようです。 またインストール時「Microsoft Visual C++ Redistributable」が必要になりますが、今回は解説はしませんので下記公式サイトをご覧ください。
https://pypi.org/project/mecab-python3/1.0.6/

mecab-python3をpipでインストールする前最初にpipをアップグレードしてから実施する方が良いと思われます。

python -m pip install --upgrade pip setuptools
pip3 install mecab-python3

しかしながら、pipでインストールできましたが実際に形態素解析を行う場合辞書をどうするかや、使用する文字コードは何を基準で行うことが出来るかなど公式サイトに書かれていないことや、実施しないといけないことがあるため、あまりお勧めできない手法と言えます。

★ アプリとpythonリンクモジュールインストール

やはり一番お勧めなのは正規に64版をインストールする方法で、これなら文字コードの指定やデフォルトで辞書の他、ユーザー辞書を作成するためのコンパイラが同梱されています。
但しアプリ版は、そのままではpythonからインポートできず、アプリとpythonとの紐付けを行う外部モジュールをインストールしなければいけませんず、下記のように行います。

pip install mecab-python-windows

一部のネット情報では、動作しない場合下記の2つを同時にインストールすると動作すると書いてあります。

pip install ipykernel
pip install mecab-python-windows

★ ユーザ辞書のインストールおよび更新

これでpythonによる形態素解析が可能になりましたので、例文を形態素解析してみましょう。

# 形態素解析を試みる
sentence = "【鬼滅の刃】もいいけれど、櫻坂46の【そこ曲がった櫻坂】も観たいな"
mecab = MeCab.Tagger("-Ochasen -u c:\\VisualStudio2017\\Python3.5_GPU\\DeZero\\common\\custom.dic")
words = mecab.parse(sentence)
print(words)

# [result]
# (py36) C:\VisualStudio2017\Python3.5_GPU\DeZero\steps>python CASE01_step03_MeCab_TXT_04.py
# 【      【      【      記号-括弧開
# 鬼滅の刃                        名詞-一般
# 】      】      】      記号-括弧閉
# も      モ      も      助詞-係助詞
# いい    イイ    いい    形容詞-非自立   形容詞・イイ    基本形
# けれど  ケレド  けれど  助詞-接続助詞
# 、      、      、      記号-読点
# 櫻      サクラ  櫻      名詞-一般
# 坂      ザカ    坂      名詞-接尾-一般
# 46      46      46      名詞-数
# の      ノ      の      助詞-連体化
# 【      【      【      記号-括弧開
# そこ    ソコ    そこ    名詞-代名詞-一般
# 曲がっ  マガッ  曲がる  動詞-自立       五段・ラ行      連用タ接続
# た      タ      た      助動詞  特殊・タ        基本形
# 櫻      サクラ  櫻      名詞-一般
# 坂      ザカ    坂      名詞-接尾-一般
# 】      】      】      記号-括弧閉
# も      モ      も      助詞-係助詞
# 観      ミ      観る    動詞-自立       一段    連用形
# たい    タイ    たい    助動詞  特殊・タイ      基本形
# な      ナ      な      助詞-終助詞
# EOS

このケースでは 「櫻坂46」が形態素解析されていません。
理由として、オリジナル32ビット版が作成されたのが昔であるため、デフォルト辞書が古いため、最近の固有名詞を把握することが出来ないためです。

そこでMeCabのユーザー辞書を作成し、登録するまでの手順を示していきます。

★ wikipedia indexファイルのダウンロード

ユーザ辞書はネットなどで探すと既にアップされている辞書もありますが、最新版 新語・流行語等はウィキペディアから作成します。

ウィキペディアには全てのインデックのみ、インデックス+簡易内容、インデックス+内容要約を圧縮してアーカイブしているバックドアページが存在し、一か月に数回更新されています。
https://dumps.wikimedia.org/jawiki/latest/

アーカイブ用ファイル名はインデックのみ、インデックス+簡易内容、インデックス+内容要約と様々ですが各グループの最新版は常に同じ名称で登録されているため、形態素解析辞書にする場合、一連のスクレイピング処理と同時にプログラム化が可能になっています。
    http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz

最初は手動で行うと、 リンクをクリックすると該当ファイルがダウンロードされます。
    「jawiki-latest-all-titles-in-ns0.gz」(13.5MB)

次に「jawiki-latest-all-titles-in-ns0.gz」を解凍すると、次のようなファイルが出来ます。
    「jawiki-latest-all-titles-in-ns0」(拡張子無し:48.7MB)


★ 「jawiki-latest-all-titles-in-ns0」のクリーニング

拡張子無し「jawiki-latest-all-titles-in-ns0」の内容はテキストであるため、テキストエディタを用いて一度開いてみると句読点等ゴミが混ざっていることがわかります。

page_title
!
!!
!!!
!!!!!!!!/君という仮説
!!!Fuck_You!!!
!=
!?
!BYE_BYE
!LOUD!
!SHOUT!
!_-attention-
!wagero!
![ai-ou]
"
"3人のゴースト"のテーマ
"3人のゴースト"のテーマ〜恋をあなたに

同時に「jawiki-latest-all-titles-in-ns0」の文字エンコードが「UTF-8」で作成されていることを確認します。


次に、ゴミとなる句読点や記号をクリーニングするために下記サイトさんが作ったクリーニングプログラムを使用します。

【参照サイト】
テキストからWikipedia見出し語を抽出
http://aidiary.hatenablog.com/entry/20101230/1293691668

結果、CSV辞書ファイル「custom.csv」が作成されます。

【cleaner.py】
#coding:utf-8
import codecs
import re
import unicodedata
import sys

alias = re.compile(r'_\(.*?\)')
alldigit = re.compile(r'^[0-9]+$')

def isValid(word):
    """wordが登録対象の単語のときTrueを返す"""
    # 1文字の単語は登録しない
    if len(word) == 1:
        return False
    # コジコジ_(小惑星)のように別名は登録しない
    if alias.search(word) != None:
        return False
    # 数字だけの単語は登録しない
    if alldigit.search(word) != None:
        return False
    # 仮名2文字の単語は登録しない
    if len(word) == 2 and unicodedata.name(word[0])[0:8] == "HIRAGANA" and unicodedata.name(word[1])[0:8] == "HIRAGANA":
        return False
    # 仮名、漢字、数字、英字以外の文字を含む単語は登録しない
    for c in word:
        if not (unicodedata.name(c)[0:8] == "HIRAGANA" or
                unicodedata.name(c)[0:8] == "KATAKANA" or
                unicodedata.name(c)[0:3] == "CJK" or
                unicodedata.name(c)[0:5] == "DIGIT" or
                unicodedata.name(c)[0:5] == "LATIN"):
            return False
    return True

if __name__ == "__main__":
    fout = codecs.open("custom.csv", "w", "utf-8")
    fin = codecs.open("jawiki-latest-all-titles-in-ns0", "r", "utf-8")
    for line in fin:
        word = line.rstrip()
        # Wikipedia見出し語を整形
        if isValid(word):
            cost = int(max(-36000, -400 * len(word)**1.5))
            fout.write("%s,-1,-1,%d,名詞,一般,*,*,*,*,*,*,*,wikipedia\n" % (word, cost))
    fin.close()
    fout.close()


★ ユーザ辞書の作成

「custom.csv」をユーザ辞書「custom.dic」にするためには専用コンパイラーでコンパイルする必要がありますがマニュアル通りに行うとエラーが出ます。

(py36) D:\temp\wiki_index>mecab-dict-index -u custom.dic -f utf-8 -t utf-8 custom.csv
dictionary_compiler.cpp(82) [param.load(DCONF(DICRC))] no such file or directory: .\dicrc

これを回避するため、任意のフォルダーのファイル「custom.csv」をMeCabが入っているフォルダーの辞書フォルダー内にコピーしてコンパイルしなおします。 その際、我々は既に以前に作成したユーザ辞書ファイルがある場合は名前をリネームしてからコピーしてください。

    c:\Program Files\MeCab\dic\ipadicにある「custom.csv」を「custom_v000.csv」に変更
    c:\Program Files\MeCab\dic\ipadicにある「custom.dic」を「custom_v000.dic」に変更

尚、MeCabはインストールした対象によって格納フォルダーが変わり、

    32ビット版の格納フォルダは、「c:\Program Files (x86)\MeCab\dic\ipadic」
    64ビット版の格納フォルダは、「c:\Program Files\MeCab\dic\ipadic」

となります。

前準備が出来たら、「UTF-8」で実施することを宣言してコンパイルを行うと成功します。

【成功事例】
(py36) c:\Program Files\MeCab\dic\ipadic>mecab-dict-index -u custom.dic -f utf-8 -t utf-8 custom.csv
reading custom.csv ... 1735369
emitting double-array: 100% |###########################################|

done!


★ ユーザ辞書のコピー


次にMeCabフォルダー内に先ほど作成されたcustum.dicが出来上がっていることを確認します。次に同フォルダから「etc」フォルダーへカレントフォルダを移動すると、「mecabrc」というファイルがあります。


(py36) C:\>cd c:\Program Files\MeCab\
(py36) c:\Program Files\MeCab>cd etc
(py36) c:\Program Files\MeCab\etc>dir
 ドライブ C のボリューム ラベルは OS です

 c:\Program Files\MeCab\etc のディレクトリ

2020/11/08 日 11:53 <DIR> .
2020/11/08 日 11:53 <DIR> ..
2022/08/10 水 11:12 359 mecabrc

mecabrc」をテキストエディター等で開いて、先ほど作成したユーザー辞書「custom.dic」を「userdic」に絶対パス付で登録すると完了です。

【mecabrc.py】
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = $(rcpath)\..\dic\ipadic
userdic = C:\Program Files\MeCab\dic\ipadic\custom.dic

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n


★ ユーザ辞書の動作確認

それでは、ユーザー辞書が形態素解析で機能しているか動作確認してみましょう。
下記のようになれば、登録完了です。

ちなみに、「櫻坂46」ヨコの品詞が「名詞、一般」になっていますが、これはクリーニングプログラム「cleaner.py」内で決定されますので、「固有名詞、一般」とかにも変更可能です。

(py36) C:\VisualStudio2017\Python3.5_GPU\DeZero\steps>python CASE01_step03_MeCab_TXT_04.py
【      【      【      記号-括弧開
鬼滅の刃                名詞-一般
】      】      】      記号-括弧閉
も      モ      も      助詞-係助詞
いい    イイ    いい    形容詞-非自立   形容詞・イイ    基本形
けれど  ケレド  けれど  助詞-接続助詞
、      、      、      記号-読点
櫻坂46                  名詞-一般
の      ノ      の      助詞-連体化
【      【      【      記号-括弧開
そこ    ソコ    そこ    名詞-代名詞-一般
曲がっ  マガッ  曲がる  動詞-自立       五段・ラ行      連用タ接続
た      タ      た      助動詞  特殊・タ        基本形
櫻坂                    名詞-一般
】      】      】      記号-括弧閉
も      モ      も      助詞-係助詞
観      ミ      観る    動詞-自立       一段    連用形
たい    タイ    たい    助動詞  特殊・タイ      基本形
な      ナ      な      助詞-終助詞
EOS

★ ユーザ辞書の問題点と対策

次にユーザ辞書を登録したことによるメリット・デメリットを見ていきます。

まずメリットは「鬼滅の刃」「AKB48」「乃木坂46」等新語が固有名詞として登録されるようになったことが一番に挙げられます。同様にユーザー辞書を変更すれば医学用語や専門用語など自由に変更が可能です。

【CASE01_step03_MeCab_TXT_01.py】
#coding: utf-8
# ////////////////////////////////////////////////////////////////////////////
# ///【MeCab形態素解析】
# //////////////////////////////////////////////////////////////
import MeCab


# 形態素解析を試みる
sentence = "鬼滅の刃もいいけれど、AKB48の乃木坂46に越されましたも観たいな"
mecab = MeCab.Tagger("-Ochasen")
words = mecab.parse(sentence)
print(words)

# 分かち書き ブランク & CRLF & EOS
wakati = MeCab.Tagger("-Owakati")
words = wakati.parse(sentence)
print(words)

# 分かち書き LIST
words = wakati.parse(sentence).split()
print(words)

words = wakati.parse(sentence).split()
print(words)

# [result]
# (py36) d:\VisualStudio2017\Python3.5_GPU\DeZero\sample\形態素解析_MeCab>python CASE01_step03_MeCab_TXT_01.py
# 鬼滅の刃 オニホロノハ 鬼滅の刃 名詞-固有名詞-一般
# も モ も 助詞-係助詞
# いい イイ いい 形容詞-非自立 形容詞・イイ 基本形
# けれど ケレド けれど 助詞-接続助詞
# 、 、 、 記号-読点
# AKB48 AKB48 AKB48 名詞-固有名詞-一般
# の ノ の 助詞-連体化
# 乃木坂46 ノギザカ46 乃木坂46 名詞-固有名詞-一般
# に ニ に 助詞-格助詞-一般
# 越さ コサ 越す 動詞-自立 五段・サ行 未然形
# れ レ れる 動詞-接尾 一段 連用形
# まし マシ ます 助動詞 特殊・マス 連用形
# た タ た 助動詞 特殊・タ 基本形
# も モ も 助詞-係助詞
# 観 ミ 観る 動詞-自立 一段 連用形
# たい タイ たい 助動詞 特殊・タイ 基本形
# な ナ な 助詞-終助詞
# EOS
#
# 鬼滅の刃 も いい けれど 、 AKB48 の 乃木坂46 に 越さ れ まし た も 観 たい な
#
# ['鬼滅の刃', 'も', 'いい', 'けれど', '、', 'AKB48', 'の', '乃木坂46', 'に', '越さ', 'れ', 'まし', 'た', 'も', '観', 'た い', 'な']
# ['鬼滅の刃', 'も', 'いい', 'けれど', '、', 'AKB48', 'の', '乃木坂46', 'に', '越さ', 'れ', 'まし', 'た', 'も', '観', 'た い', 'な']

次にデメリットですが、体験するため下記プログラムを実行してみましょう。

【CASE01_step03_MeCab_TXT_03.py】
import MeCab


# 形態素解析を試みる
sentence = "吾輩は猫である"
mecab = MeCab.Tagger("-Ochasen")
words = mecab.parse(sentence)
print(words)

# 分かち書き ブランク & CRLF & EOS
wakati = MeCab.Tagger("-Owakati")
words = wakati.parse(sentence)
print(words)

# 分かち書き LIST
words = wakati.parse(sentence).split()
print(words)

words = wakati.parse(sentence).split()
print(words)

# [result]
# (py36) d:\VisualStudio2017\Python3.5_GPU\DeZero\sample\形態素解析_MeCab>python CASE01_step03_MeCab_TXT_03.py
# 吾輩は猫である ワガハイハネコデアル 吾輩は猫である 名詞-固有名詞-一般
# EOS
#
# 吾輩は猫である
#
# ['吾輩は猫である']
# ['吾輩は猫である']


ユーザー辞書登録前の結果は下記のように正常でした.

# 吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
# は      助詞,係助詞,*,*,*,*,は,ハ,ワ
# 猫      名詞,一般,*,*,*,*,猫,ネコ,ネコ
# で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
# ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
# ['吾輩', 'は', '猫', 'で', 'ある']

ユーザー辞書を追加すると全く形態素解析を行わなくなります。それどころか、今まで普通に出来ていた解析の一部がユーザー辞書を入れることで出来なくなるという現象がデメリットです。

GGEも長い間この謎を解くことが出来ませんでいましたが、チャットボット作成時に謎の正体が判明しました。

この理由は簡単、実はウィキペディアに「吾輩は猫である」というページが存在するからです。
「吾輩は猫である」
https://ja.wikipedia.org/wiki/%E5%90%BE%E8%BC%A9%E3%81%AF%E7%8C%AB%E3%81%A7%E3%81%82%E3%82%8B

同様の現象で「あなたが好きです」もテレビ番組名として存在するためにです。
「あなたが好きです」
https://ja.wikipedia.org/wiki/%E3%81%82%E3%81%AA%E3%81%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%A7%E3%81%99

このように数・年号・題名(本、TV、ラジオ)がウィキペディアに登録されていることにより、ユーザ辞書が優先となり全てが名詞化または固有名詞化され形態素解析をしなくなってしまったということなのです。

これに対し GGEが現在実施している対策は、
数字・年号等はユーザー辞書作成前CSV辞書ファイル「custom.csv」時にテキストエディタを使用して手動で不必要部分を削除するという方法です。しかし全数数十万個あるため、テキストエディタのマクロ機能を利用していますが、かなりの時間と手間がかかるため、簡単に更新するということはできません。

少なくともディープラーニングで自然言語処理するためには、ユーザ辞書なしの方が正確に出来るほど可能性があります。


≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫
Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system