• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

mecab設定

date: 2017-04-02 excerpt: mecabの設定について

tag: nlpmecabpython


mecabの設定について

インストール

ubuntu

$ sudo apt install mecab libmecab-dev mecab-ipadic
$ sudo apt install mecab-ipadic-utf8
$ sudo apt install python-mecab

macOS

$ brew install mecab; brew install mecab-ipadic

macOS(ソースコードからインストール)

  • apple siliconでの場合に必要
$ brew reinstall mecab --build-from-source

Google Colab

!apt-get install mecab mecab-ipadic-utf8 libmecab-dev swig 2>&1 > /dev/null
!pip install mecab-python3 2>&1 > /dev/null
!echo "dicdir = /var/lib/mecab/dic/debian" > /usr/local/etc/mecabrc

python3 binding

$ python3 -m pip install mecab-python3

ビルドしてインストール

  • apple siliconでの場合に必要
$ ARCHFLAGS='-arch arm64' python3 -m pip install --compile --use-pep517 --no-cache-dir --force mecab-python3==1.0.5

mecabrcの設定(最近はpythonインスタンスの中で初期化するほうがメジャー)

# vim /etc/mecabrc
dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/ # 17.04
  • 最近では設定ファイルのパスが/usr/local/etc/mecabrcに変更された

NEologd

概要

  • 2020/06から更新が止まっているが、ユーザ定義辞書としては圧倒的な大きさなので、ここから更に自身で単語を追加して使うなどがよい

NEologdインストール

$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git; cd mecab-ipadic-neologd; ./bin/install-mecab-ipadic-neologd -n

任意の場所にインストール

  • 任意のpathに辞書をインストールできる
$ ./bin/install-mecab-ipadic-neologd -n\
  --prefix $HOME/.lib/mecab-ipadic-neologd

新規に単語を追加する

  • 指定のフォーマットに従ったCSVファイルを用意
    • ヘッダーはなし
    • 表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
  • mecab-dict-indexでCSVを辞書にコンパイル
    • OSXのパス
      • /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index
    • Linuxのパス
      • /usr/lib/mecab/mecab-dict-index

ユーザ定義のCSVの例

おもちちゃん,,,10,名詞,一般,*,*,*,*,ユーザ設定,ユーザセッテイ,ユーザセッテイ,追加エントリ
...

osxでのコンパイルの例

$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d $HOME/.lib/mecab-ipadic-neologd -u user-defined.dic -f utf-8 -t utf-8 user-define-words.csv
  • -d
    • メインで使用する辞書
    • macOSのデフォルトのパス
      • /usr/local/lib/mecab/dic/mecab-ipadic-neologd
  • -u
    • ユーザ辞書の出力名
    • 相対パスでOK

ユーザ辞書を設定しての分かち書き

$ mecab -d $HOME/.lib/mecab-ipadic-neologd -u user-defined.dic
おもちちゃん
おもち  名詞,固有名詞,一般,*,*,*,餅,オモチ,オモチ
ちゃん  名詞,接尾,人名,*,*,*,ちゃん,チャン,チャン
EOS
$ mecab -d $HOME/.lib/mecab-ipadic-neologd -u $HOME/.tmp/user-dic/user-defined.dic
おもちちゃん
おもちちゃん    名詞,一般,*,*,*,*,ユーザ設定,ユーザセッテイ,ユーザセッテイ,追加エントリ
  • 参考
    • 単語の追加方法/taku910.github.io
    • Add words to MeCab’s user dictionary on Ubuntu for use in Python

Python3での仕様の具体例

分かち書き

# ubuntu linux + ipadic
parser = MeCab.Tagger("-Owakati -d /var/lib/mecab/dic/ipadic-utf8")

# ubuntu linux + neologd
parser = MeCab.Tagger("-Owakati -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/") # /etc/mecabrcに設定されているに関わらず、明示的にpython3の内部で辞書ファイルのpath指定をする必要がある

# macOS(intel)
parser = MeCab.Tagger("-Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/") 
# macOS(apple) + ipdaic
parser = MeCab.Tagger("-Owakati -d /opt/homebrew/lib/mecab/dic/ipadic/")
# macOS(apple) + neologd
parser = MeCab.Tagger("-Owakati -d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd/") 


assert parser.parse("COVID19").strip().split() == ["COVID19"], "辞書ファイルが古いです" # 辞書が反映されていないと落ちるはず

品詞解析

意味のある名詞のみを取り出す

  • ifでネストしすぎるとミスを埋め込みやすいので注意する
import MeCab
import mojimoji
from tqdm import tqdm
import collections
import regex

# 適切な辞書を設定する
parser = MeCab.Tagger("-Ochasen -d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd/")

def parse_terms(texts: "List[str] | pd.Series") -> pd.DataFrame:
    tf = collections.defaultdict(int)
    for text in tqdm(texts):
            text = mojimoji.han_to_zen(text, kana=True, digit=False, ascii=False)
            text = text.lower()
            for line in set(parser.parse(text).strip().split("\n")):
                entities = line.split("\t")
                if len(entities) <= 4:
                    continue
                word = entities[0] # もとの単語
                yomi = entities[1] # 読み
                orig = entities[2] # 未活用の原型
                type = entities[3] # 品詞
                # 短すぎる単語をskip
                if regex.match("^\p{Hiragana}{1,2}$", orig) or regex.match("^\p{Katakana}{1,2}$", orig):
                    continue
                # 名詞はもとの読みを使用
                if "名詞" in type:
                    tf[(word, type)] += 1
                # 形容詞と動詞は未活用の原型を使用
                if "形容" in type or "動詞" in type:
                    tf[(orig, type)] += 1
    tf = pd.DataFrame(tf.items())
    tf.columns = ["tup", "freq"]
    tf["term"] = tf["tup"].apply(lambda x:x[0])
    tf["type"] = tf["tup"].apply(lambda x:x[1])
    tf.drop(columns=["tup"], inplace=True)
    tf.query('type not in ["動詞-非自立", "名詞-接尾-人名", "名詞-数"]', inplace=True)
    return tf

基本的なサニタイズ(ノイズワード除去等)

if "名詞" in type:
    if type in {"名詞-数", "名詞-代名詞", "名詞-非自立", "名詞-副詞可能", "接頭詞-名詞接続"}:
        continue
    if regex.match("^\p{Hiragana}{1,}$", orig):  # 1,2文字のひらがなは集計しない
        continue
    #if regex.match("^[a-zA-Z]{1,5}", word): # 1 ~ 5の英語はスキップ
    #    continue
    if regex.match("^\d{1,}[a-zA-Z]{1,}", word):
        continue
    if regex.match("^\d{1,}[^\d]{1,}", word):
        continue
    if regex.match("^[^\d]{1,}\d{1,}", word) and len(word) <= 2:
        continue
    if regex.match("^[a-zA-Z]{1,5}$", word):
        continue
    if regex.match("^[a-zA-Z]", word) and len(word) <= 2:
        continue
    if regex.match("^-", word):
        continue 
    if len(word) <= 1 and  not(eomoji_pattern.match(word) or  emoji_extra.match(word)):  # 1文字の表現はほとんどノイズなので集計しない
        continue

MeCabとNEologdを含んだDockerコンテナのDockerfile

  • ポータビリティと再現性があるのでオススメ
FROM python:3.9
COPY . /app

# install base softwares
RUN apt update
RUN apt install build-essential mecab libmecab-dev mecab-ipadic -y
RUN pip install mecab-python3
RUN apt install git make sudo -y
RUN echo "dicdir = /usr/lib/mecab-ipadic-neologd" > /usr/local/etc/mecabrc # mecabrcが無いとインスタンスを作成できない
RUN cd tmp; git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git; 
RUN cd /tmp/mecab-ipadic-neologd; ./bin/install-mecab-ipadic-neologd -n -y
# RUN cd /tmp/mecab-ipadic-neologd; ./bin/install-mecab-ipadic-neologd -n -y --prefix /var/lib/mecab-ipadic-neologd; # 指定した場所にインストールする場合

# python関連
RUN pip install -r ./app/requirements.txt
CMD ["sh", "/app/ENTRYPOINT.sh"]


nlpmecabpython Share Tweet