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
- OSXのパス
ユーザ定義の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
おもちちゃん
おもちちゃん 名詞,一般,*,*,*,*,ユーザ設定,ユーザセッテイ,ユーザセッテイ,追加エントリ
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"]