自然言語処理(NLP)の一種である形態素解析は、言語をある種の単位(=形態素)ごとに細かく分けて判別することを指します。これができるようになると、文字列の解析や単語の抽出が可能になるため、テキストデータの加工や分析に役立ちます。
形態素解析とは今回はPythonで形態素解析を可能にするMeCabを利用する方法を紹介します。
MeCabとは
MeCabをインストール
以下のコマンドでmecab-python3とunidic-liteをインストールしましょう。
unidicはMeCabで使える辞書です。もともと推奨されているのはipadicという辞書ですが、mecab-ipadic-neologdのリポジトリを見ると更新が止まっているようなのでunidicを使います。
pip install mecab-python3 unidic-liteMeCabで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で解決法が説明されていました。
まずは、homebrewでmecabをソースからビルドするオプションをつけてインストール(または再インストール)します。
※インストールは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-python3とunidic-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といった最新の技術でよく使われるので、スキルセットとして持っておいて損はありません。





