はじめに
「日本語のテキストを分析したいけど、どこから始めればいいの?」
そんな方におすすめなのが 形態素解析 です。
自然言語処理(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()
で順位を上から並べ替え
実行結果例
上位には 「Python」「記事」「勉強会」「データ」「モデル」「分析」 などがランクインします。
まとめ
- 形態素解析で日本語テキストを単語単位に分解できる
-
fugashi[unidic-lite]
を使えば、MeCab本体不要で簡単に解析可能 - 名詞の出現回数を可視化すると、文章の特徴が見えやすい