フリーキーズ | 独学プログラミング

PythonでMeCabを使って形態素解析入門

最終更新日
【画像】PythonでMeCabを使って形態素解析入門

自然言語処理(NLP)の一種である形態素解析は、言語をある種の単位(=形態素)ごとに細かく分けて判別することを指します。これができるようになると、文字列の解析や単語の抽出が可能になるため、テキストデータの加工や分析に役立ちます。

形態素解析とは

今回はPythonで形態素解析を可能にするMeCabを利用する方法を紹介します。

MeCabとは

MeCabをインストール

以下のコマンドでmecab-python3unidic-liteをインストールしましょう。
unidicはMeCabで使える辞書です。もともと推奨されているのはipadicという辞書ですが、mecab-ipadic-neologdのリポジトリを見ると更新が止まっているようなのでunidicを使います。

pip install mecab-python3 unidic-lite

MeCabでsymbol not foundが出る場合

macOSを使っている場合、ここで確認を入れてください。

python -c 'import MeCab'

以下のようなエラーが出てきたら修正が必要です。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/xxx/.pyenv/versions/xxx/lib/python3.11/site-packages/MeCab/__init__.py", line 10, in <module>
    from . import _MeCab
ImportError: dlopen(/Users/xxx/.pyenv/versions/xxx/lib/python3.11/site-packages/MeCab/_MeCab.cpython-311-darwin.so, 0x0002): symbol not found in flat namespace '__ZN5MeCab11createModelEPKc'

これはかなり沼にハマりました。macOSでHomebrewを使っていることや動的ライブラリの持ち方が変わったおかげでこういったエラーが発生するようです。
これについて調べると以下のQiitaの記事がヒットします。

しかし、当方の環境ではこれで解決しませんでした。公式リポジトリを調べていくと、以下のIssueで解決法が説明されていました。

まずは、homebrewmecabをソースからビルドするオプションをつけてインストール(または再インストール)します。
※インストールはinstall、再インストールはreinstall

brew install --build-from-source mecab

その後、フラグを付けつつバージョン指定した形でmecab-python3をインストールします。(先にpip uninstall mecab-python3しておきましょう)

ARCHFLAGS='-arch arm64' pip install --compile --use-pep517 --no-cache-dir --force mecab-python3==1.0.5

これで再度python -c 'import MeCab'するとエラーが表示されなくなります。

MeCabを使ってみる

今回は例として、長めのMarkdownドキュメントから一般名詞である単語を抽出してみましょう。

下準備

すでにmecab-python3unidic-liteはインストールされている前提で進めます。
Markdownドキュメントは手持ちのドキュメントか、ChatGPTなどを駆使して適度な長さの文章を用意しましょう。

mecab_sample.pyを作って、今回使うドキュメントの大きさを測ってみると以下のようになりました。

f = open('./sample.md', 'r', encoding='utf-8')
content = f.read()
f.close()
print(f'Content size: {len(content.encode("utf-8"))}')
$ python mecab_sample.py
Content size: 26249

なかなかのサイズです。

MeCabで単語抽出

先ほど作ったmecab_sample.pyに加筆していきましょう。

import MeCab


f = open('./sample.md', 'r', encoding='utf-8')
content = f.read()
f.close()
print(f'Content size: {len(content.encode("utf-8"))}')

words = []
mecab = MeCab.Tagger()
for s in mecab.parse(content).splitlines():
    if (
        "名詞" in s
        and "サ変可能" not in s
        and "形状詞可能" not in s
        and "副詞可能" not in s
        and "数詞" not in s
        and "代名詞" not in s
        and "接尾辞" not in s
    ):
        word = s.split()[0]
        if len(word) == 1:
            continue
        if word == "こと":
            continue
        if word == "もの":
            continue
        if word == "とき":
            continue
        if word == "ところ":
            continue
        if word == "ため":
            continue
        if word == "たち":
            continue
        if word == "なし":
            continue
        if word == "代わり":
            continue

        words.append(s.split()[0])

unique_words = list(set(words))
print(f'Prased content size: {len(unique_words)}')

こちらを実行すると以下のように20分の1程度までサイズが圧縮され、一般名詞の単語が重複排除された状態で抽出されました。

$ python mecab_sample.py
Content size: 26249
Parsed content size: 1279
実際に抽出した単語例

実際に抽出した単語例

MeCabでお手軽に形態素解析

macOSだとややインストールに手間がかかりましたが、MeCabなら比較的手軽に形態素解析を導入できます。
Pythonを使ってちょっとした分析をしたいときには導入しましょう。

形態素解析は特に音声認識技術やAIといった最新の技術でよく使われるので、スキルセットとして持っておいて損はありません。

関連するコンテンツ