mei_13のPython講座 ロゴ

【解説】Pythonで日本語を解き明かす:形態素解析ライブラリ「MeCab」入門




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

Pythonで日本語を解き明かす:形態素解析ライブラリ「MeCab」入門


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はPythonを使って「自然言語処理」の第一歩を踏み出してみましょうか。 自然言語処理というのは、わたしたち人間が普段話したり書いたりしている言葉を、コンピュータに理解させる技術のことです。 その中でも、日本語を扱う上で欠かせない「形態素解析」と、それを実現するツール「MeCab(メカブ)」についてお話ししたいと思います。


Hirokiのアイコン
【Hiroki】 Yukiさん、よろしくお願いします!自然言語処理、なんだか難しそうですね……。 「形態素解析」っていう言葉も初めて聞きました。美味しそうな名前の「MeCab」が、どうやって言葉を理解するのか気になります。


Yukiのアイコン
【Yuki】 ふふ、確かに名前はおいしそうですよね。でも、とっても強力なツールなんですよ。 まず、日本語は英語と違って、単語と単語の間にスペースがありませんよね。 例えば「すもももももももものうち」という文章を、コンピュータはどこで区切ればいいか自分では判断できないんです。 そこで、文章を「意味を持つ最小単位(形態素)」に分割して、それぞれの品詞を判別する作業が必要になります。これが「形態素解析」です。


Hirokiのアイコン
【Hiroki】 なるほど。言葉をバラバラに分解して、それが名詞なのか動詞なのかを調べる作業のことなんですね。 それができないと、コンピュータは文章の意味を解析できないっていうことか……。


Yukiのアイコン
【Yuki】 その通りです。そして、その作業を高速かつ高精度に行ってくれるのがMeCabなんです。 MeCabは京都大学と日本電信電話株式会社(NTT)の共同研究によって開発されたオープンソースの形態素解析エンジンで、その処理速度の速さから、多くの開発者に愛用されているんですよ。

MeCabを動かすための準備


Yukiのアイコン
【Yuki】 では、実際にPythonでMeCabを動かしてみましょう。 まずはライブラリのインストールからですね。PythonでMeCabを使うには、mecab-python3というライブラリを使うのが一般的です。 それと、MeCab単体では「言葉の辞書」を持っていないので、解析のための辞書データも一緒にインストールする必要があります。 今回は、設定が簡単なunidic-liteという辞書を使ってみましょうか。


Hirokiのアイコン
【Hiroki】 ライブラリだけじゃなくて「辞書」も必要なんですね。 やっぱりコンピュータも、辞書を引かないと言葉の意味がわからないってことなんだ……。


Yukiのアイコン
【Yuki】 ええ、そうなんです。人間と同じですね。 ターミナルやコマンドプロンプトで、以下のコマンドを入力してみてください。

pip install mecab-python3
pip install unidic-lite


Hirokiのアイコン
【Hiroki】 インストールできました!これで準備完了ですか?


Yukiのアイコン
【Yuki】 はい。準備は整いました。では、早速簡単なプログラムを書いて動かしてみましょう。 まずは「今日はいい天気ですね」という文章を解析してみます。

MeCabの基本的な使い方


Yukiのアイコン
【Yuki】 Pythonのコードはこんな感じになります。

import MeCab

# MeCabのオブジェクトを作成します
# Taggerの引数に何も指定しない場合、デフォルトの辞書が使われます
tagger = MeCab.Tagger()

# 解析したい文章
text = "今日はいい天気ですね。"

# 文章を解析して結果を表示します
result = tagger.parse(text)
print(result)


Hirokiのアイコン
【Hiroki】 わあ、すごく短いコードですね!これで解析できるんですか? 実行してみますね。……あ、何かたくさん出てきました。

今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
いい    形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気    名詞,一般,*,*,*,*,天気,テンキ,テンキ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね      助詞,終助詞,*,*,*,*,ね,ネ,ネ
。      記号,句点,*,*,*,*,。,。,。
EOS


Yukiのアイコン
【Yuki】 無事に動きましたね。出力された結果を見てみてください。 左側に元の単語があって、その右側にカンマ区切りで品詞読み方が表示されていますよね。 一番下の「EOS」というのは「End of Sentence(文の終わり)」の略です。


Hirokiのアイコン
【Hiroki】 本当だ!「今日」は「名詞」、「は」は「助詞」って、ちゃんと分類されています。 でも、このカンマ区切りのデータをプログラムで扱うのは、少し大変そうですね……。


Yukiのアイコン
【Yuki】 そうですね。文字列として受け取るだけではなく、構造的にデータを扱いたいときはparseToNodeというメソッドを使うのが便利ですよ。 一歩進んだコードを書いてみましょうか。

特定の品詞だけを取り出してみる


Yukiのアイコン
【Yuki】 例えば、文章の中から「名詞」だけを抜き出したいというケースはよくあります。 その場合は、次のように書くとスマートだと思います。

import MeCab

tagger = MeCab.Tagger()
text = "Pythonを使って、楽しくプログラミングを学びましょう。"

# parseToNodeを使うと、形態素ごとにループで処理できます
node = tagger.parseToNode(text)

while node:
    # surfaceは表層形(元の単語)
    # featureは品詞情報などが含まれる文字列です
    surface = node.surface
    feature = node.feature.split(',')

    # feature[0]が品詞の第一分類です
    # 形態素が空でないこと(文頭・文末以外)を確認します
    if surface:
        print(f"単語: {surface} / 品詞: {feature[0]}")

    node = node.next


Hirokiのアイコン
【Hiroki】 parseToNodeを使うと、一個ずつの単語を順番に見ていけるんですね。 node.surfaceが実際の単語で、node.featureが詳しい情報……なるほど。 これを実行すると……。

単語: Python / 品詞: 名詞
単語: を / 品詞: 助詞
単語: 使っ / 品詞: 動詞
単語: て / 品詞: 助詞
単語: 、 / 品詞: 記号
単語: 楽しく / 品詞: 形容詞
単語: プログラミング / 品詞: 名詞
単語: を / 品詞: 助詞
単語: 学び / 品詞: 動詞
単語: ましょ / 品詞: 助動詞
単語: う / 品詞: 助動詞
単語: 。 / 品詞: 記号


Hirokiのアイコン
【Hiroki】 おもしろい!これを使えば、長い小説の中からよく出てくる言葉を集めたりできそうですね。


Yukiのアイコン
【Yuki】 ええ、その通りです。特定の単語の出現回数を数えるのは、テキストマイニングの基本なんですよ。 Hirokiくん、飲み込みが早くて助かります……。

辞書の選択:NEologdの紹介


Yukiのアイコン
【Yuki】 ところで、MeCabを使っていると一つ困ったことが起きるかもしれません。 それは、「新しい言葉や専門用語に弱い」ということです。 例えば「鬼滅の刃」とか「タピる」といった言葉は、古い辞書だと「鬼」「滅」「の」「刃」とバラバラに分解されてしまうんです。


Hirokiのアイコン
【Hiroki】 あ、確かに。辞書が古いと最近の言葉は載っていないですもんね。 そういう時はどうすればいいんですか?


Yukiのアイコン
【Yuki】 そんな時に便利なのが、「mecab-ipadic-neologd」というカスタム辞書です。 これはWeb上の膨大なテキストデータから新しい単語を自動で抽出して更新されている辞書で、新語や固有名詞にとても強いんです。 これを使うと、例えば「インスタ映え」という言葉も一つの名詞として正しく認識してくれるようになります。


Hirokiのアイコン
【Hiroki】 それは便利そうですね!でも、設定が難しそう……。


Yukiのアイコン
【Yuki】 インストールには少し手間がかかるのですが、本格的に自然言語処理をやるなら避けては通れない道かもしれません。 もし、今はもっと手軽にやりたいということであれば、Pythonライブラリのsudachipyなど、他の選択肢もありますが、MeCabのカスタマイズ性を知っておくのも損はないと思います。 まずは標準的な辞書で慣れて、物足りなくなったらNEologdを試してみる……というステップがおすすめですよ。

形態素解析の結果を整理する


Yukiのアイコン
【Yuki】 少し応用的な内容になりますが、解析結果をリストや辞書形式にまとめておくと、後の処理が楽になります。 実戦で使えるような、関数化したコードを書いてみますね。

import MeCab

def extract_nouns(text):
    tagger = MeCab.Tagger()
    node = tagger.parseToNode(text)

    nouns = []
    while node:
        # 品詞情報を取得
        feature = node.feature.split(',')
        # 名詞(かつ特定のサブカテゴリを除外するなど)を判定
        if feature[0] == "名詞":
            nouns.append(node.surface)
        node = node.next
    return nouns

text = "昨日は友達と新宿のカフェでパフェを食べました。"
result = extract_nouns(text)
print(f"見つかった名詞: {result}")


Hirokiのアイコン
【Hiroki】 あ、この書き方なら再利用しやすそうです! 実行すると……「昨日」「友達」「新宿」「カフェ」「パフェ」が取れました。 ……あれ?「パフェ」もちゃんと名詞として認識されるんですね。


Yukiのアイコン
【Yuki】 はい、一般的なお菓子の名前などは標準的な辞書でもカバーされています。 ……パフェ、いいですよね。あんなに層が重なっていて、見た目も綺麗で。 きっと、一階層ごとに違う味がして、最後まで飽きさせない工夫が詰まっているんだと思います……。 あ、すみません、話が逸れました。


Hirokiのアイコン
【Hiroki】 Yukiさん、パフェのことになるとちょっと熱くなりますね(笑) でも、こうして単語を抜き出すことで、何についての文章なのかをコンピュータに教えられるようになるんですね。

MeCabを使う際の注意点


Yukiのアイコン
【Yuki】 MeCabを使う上で、いくつか気をつけておいたほうがいいこともあります。 一つは、「エンコーディング」の問題です。 最近のPython環境(UTF-8)であればあまり心配ありませんが、Windows環境などで古いバージョンのMeCabを使うと、文字化けに悩まされることがよくあります。 もし文字化けしてしまったら、辞書の文字コードがUTF-8になっているか確認してみてくださいね。


Hirokiのアイコン
【Hiroki】 文字化け、プログラミング初心者の天敵ですよね……。 今のところ僕の環境では大丈夫そうですけど、覚えておきます。


Yukiのアイコン
【Yuki】 それから、MeCabは非常に高速ですが、あくまで「ルールや統計に基づいた分割」を行っているだけなので、100%完璧ではありません。 文章の文脈によっては、人間から見るとおかしなところで区切られてしまうこともあります。 「ここではきものをぬいでください」という文が、「ここで」「はきものを」なのか「ここでは」「きものを」なのか、コンピュータには判断が難しいんです。


Hirokiのアイコン
【Hiroki】 「ぎなた読み」ってやつですね! そういう曖昧な日本語をどう扱うかが、自然言語処理の面白いところでもあり、難しいところでもありそうですね。

さらなるステップへ


Yukiのアイコン
【Yuki】 形態素解析ができるようになると、次はその単語の出現頻度をグラフにしたり、単語同士のつながりを分析したりする「共起ネットワーク」を作ったりすることもできるようになります。 また、最近流行りのAI(ディープラーニング)に文章を学習させる前処理としても、MeCabは非常によく使われています。


Hirokiのアイコン
【Hiroki】 一気に世界が広がりそうです! まずは自分の好きな漫画の感想文とかを解析して、どんな言葉をよく使っているか調べてみようかな。


Yukiのアイコン
【Yuki】 それは素敵なアイデアですね。 自分の書いた文章を客観的に見るのは、少し恥ずかしい気もしますけれど……。 でも、そうやって「自分が興味のあるデータ」を分析するのが、プログラミングの上達への一番の近道だと思います。

もしわからないことがあったら、またいつでも聞いてくださいね。 わたしも、Hirokiくんが面白いツールを作れるように精一杯サポートします。 ……あ、でも、あまり夜更かしして作業しすぎないように気をつけてください。 夜は静かで集中できますけど、朝起きるのが辛くなってしまいますから。


Hirokiのアイコン
【Hiroki】 はい、ありがとうございます、Yukiさん! まずは今日のコードを自分なりに改造して遊んでみます。


Yukiのアイコン
【Yuki】 ええ、頑張ってください。 参考までに、MeCabの公式ドキュメントや関連リンクをいくつか置いておきますね。 困った時の助けになるはずです。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer mecab-python3 (PyPI) Google ColaboratoryでMeCabを使う方法


Hirokiのアイコン
【Hiroki】 助かります!少しずつ、日本語の解析をマスターしていきたいと思います。


Yukiのアイコン
【Yuki】 その意気ですよ、Hirokiくん。 一歩ずつ、丁寧に積み重ねていきましょう……。 それでは、今日の講義はここまでです。お疲れ様でした。



< polars
コラム一覧に戻る
乱数 >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki