1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python×形態素解析入門】fugashiで名詞頻出ランキングを可視化する!MeCab不要でサクッと試す

Posted at

ChatGPT Image 2025年8月25日 01_14_52.png

はじめに

「日本語のテキストを分析したいけど、どこから始めればいいの?」
そんな方におすすめなのが 形態素解析 です。

自然言語処理(NLP)を学び始めると、まずぶつかる壁が「日本語は単語の区切りがない問題」。
英語ならスペースで単語を分けられますが、日本語は単語を分割する仕組みが必要です。

そこで登場するのが 形態素解析
この記事では、Pythonのライブラリ fugashi を使って日本語テキストを解析し、
「名詞の出現回数ランキングTOP20」を棒グラフで可視化する方法を紹介します。


今回のゴール

  • Pythonで形態素解析を体験する
  • テキストから名詞だけを抽出して出現回数をカウント
  • matplotlibで名詞頻出ランキングを可視化

実行環境

項目 バージョン
OS macOS Sonoma
Python 3.11
エディタ VSCode
ライブラリ fugashi 1.3.0 / unidic-lite 1.0.8 / matplotlib 3.9.0 / japanize-matplotlib 1.1.3

形態素解析とは?

形態素解析とは、文章を形態素(意味を持つ最小単位)に分割し、それぞれの品詞や原形を特定する処理です。

例:「昨日渋谷でPythonの本を買いました。」
形態素解析すると、以下のように分割されます:

単語 品詞 原形
昨日 名詞 昨日
渋谷 名詞 渋谷
助詞
Python 名詞 Python
名詞
買い 動詞 買う

このように、テキストを単語ごとに分割し、品詞を識別することで文章の特徴を捉えやすくなります。


MeCabとは?

MeCab は日本語形態素解析の代表的なライブラリです。
しかし、MeCab本体をインストールするには辞書の準備などが必要で、環境によってはセットアップが面倒です。

そこで今回は、MeCab互換のPythonラッパーである fugashi を使います。
fugashi[unidic-lite] を使えば、pipでインストールするだけで形態素解析ができます。


ライブラリのインストール

pip install "fugashi[unidic-lite]" matplotlib japanize-matplotlib

注意 (zshユーザー向け)
[] を含むため、必ずダブルクオート " " で囲んでください。


サンプルプログラム:名詞頻出ランキングTOP20を可視化

from collections import Counter
from fugashi import Tagger
import unicodedata
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語対応

# ---- 解析するテキスト ----
text = """
今日はPythonの勉強会でPythonの基礎を復習。勉強会ではPythonの書き方よりも
データの集め方とデータの前処理、データの可視化を重点的に扱った。記事の企画も進め、
記事の構成と記事の見出しを検討。機械学習のモデルについても議論し、モデルの評価と
モデルの改善案を洗い出した。

翌日はプロジェクトの打合せ。プロジェクトの課題、プロジェクトのリスク、プロジェクトの
スケジュールを整理。設計レビューでは設計の観点を共有し、テスト計画とテストデータの準備を決定。
ユーザーの行動データを使った分析も開始。分析の結果を勉強会で共有し、勉強会のスライドを更新。

週末は渋谷のカフェで記事の下書き。記事に使うデータの検証をもう一度行い、データの欠損と
データの外れ値を処理。バグの再現手順をまとめ、バグの原因を切り分け。仕様の変更点を整理し、
仕様に沿った設計の見直しを実施。ユーザーからの問い合わせも確認し、ユーザーの要望を
機能の仕組みに反映。

最後に東京で開催された勉強会に参加。勉強会ではPythonの最新事例、機械学習の最新事例、
分析の最新事例をキャッチアップ。モデルのチューニング方法、設計のアンチパターン、
テストの自動化についても学習。記事の最終版を公開し、記事への反応を計測。
"""

# ---- 前処理 ----
text = unicodedata.normalize("NFKC", text)
tagger = Tagger()

STOP_NOUNS = {
    "こと","もの","ところ","ため","よう","感じ","","場合",
    "これ","それ","あれ","ここ","そこ","どこ","","","自分",
    "さん","","今日","昨日","明日"
}

def safe_lemma(tok):
    lemma = getattr(tok.feature, "lemma", None)
    if not lemma or lemma == "*":
        lemma = tok.surface
    return str(lemma)

def usable_noun(tok):
    if tok.feature.pos1 != "名詞":
        return False
    if getattr(tok.feature, "pos2", "") in {"数詞"}:
        return False
    lemma = safe_lemma(tok)
    if lemma in STOP_NOUNS:
        return False
    return True

# ---- 名詞をカウント ----
counter = Counter(
    safe_lemma(tok)
    for tok in tagger(text)
    if usable_noun(tok)
)

# ---- TOP20抽出 ----
top20 = counter.most_common(20)
words = [w for w, _ in top20]
counts = [c for _, c in top20]

# ---- グラフ描画 ----
plt.figure(figsize=(10, 6))
plt.barh(words, counts, color="skyblue")
plt.xlabel("出現回数")
plt.ylabel("名詞")
plt.title("名詞頻出ランキング TOP20")
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()

プログラム解説

1. fugashiで形態素解析

tagger = Tagger()
for token in tagger("Pythonで形態素解析を試してみたいです。"):
    print(token.surface, token.feature.pos1)
  • Tagger()で形態素解析器を作成
  • token.surface:実際に文章中に出てくる単語
  • token.feature.pos1:品詞(名詞・動詞・形容詞など)

2. 名詞だけ抽出してカウント

counter = Counter(
    safe_lemma(tok)
    for tok in tagger(text)
    if usable_noun(tok)
)
  • 名詞だけを抽出して Counter で回数をカウント
  • safe_lemma() で単語の原形を取得。原形がない場合はそのまま表層形を使用

3. TOP20の単語をグラフ化

plt.barh(words, counts, color="skyblue")
  • 横棒グラフにすることでランキングを見やすく
  • 日本語表示のために japanize_matplotlib を利用
  • invert_yaxis() で順位を上から並べ替え

実行結果例

スクリーンショット 2025-08-25 1.12.15.png

上位には 「Python」「記事」「勉強会」「データ」「モデル」「分析」 などがランクインします。


まとめ

  • 形態素解析で日本語テキストを単語単位に分解できる
  • fugashi[unidic-lite] を使えば、MeCab本体不要で簡単に解析可能
  • 名詞の出現回数を可視化すると、文章の特徴が見えやすい
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?