論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
形態素解析
Morphological Analysis
NLP

🔖 キーワード索引

形態素MeCabJanome品詞分かち書き辞書ipadicSudachi

morphological analysis」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「morphological analysis」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

morphological analysis統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「morphological analysis の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

文章を最小の単位に分ける作業です。

コンピュータに言葉の意味を教えるために使います。

スマホの予測変換などの仕組みに使われています。

ここでは解析の方法や便利な道具について読みます。

文章を形態素に分割し品詞を付与する処理

📍 あなたが今見ているもの

🍰 まずはやさしく

データ分析の最初のステップです。

文章から特徴を取り出すために使います。

SNSの投稿からみんなの気持ちを分析する時に役立ちます。

ここでは定義や使い方の流れについて読みます。

テキスト分析論文で「MeCab で形態素解析を行った」と書かれていれば、 まさにこのステップ。 日本語のテキストマイニング・感情分析・トピック抽出すべての出発点です。

本ページでは「morphological analysis」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「morphological analysis」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

文章をバラバラにするパズルのようなものです。

名詞だけを集めるなどの処理をするために使います。

「すもももももももものうち」を正しく分ける例で考えます。

ここでは言葉を分ける仕組みについて読みます。

入力:「すもももももももものうち」
出力:すもも / も / もも / も / もも / の / うち

各トークンに「名詞・助詞・名詞・…」と品詞タグが付きます。 これがあれば、 「名詞だけ取り出す」「助詞は無視」といった処理が可能になります。

英語の "I like apples" は空白 3 つで 3 単語に分かれるが、 日本語の 「すもももももももものうち」 には空白がない。 形態素解析は「辞書 (IPAdic / UniDic / NEologd) に載っている語の列で文字列を覆い、 接続コストの和が最小になる経路を Viterbi で選ぶ」処理で、 結果として 「すもも (名詞) / も (助詞) / もも (名詞) / も (助詞) / もも (名詞) / の (助詞) / うち (名詞)」 の品詞列が返る。

本ページでは (1) 入力テキスト → (2) ラティス構築 (文字列上に辞書語ノードを並べる) → (3) Viterbi 最短経路 → (4) 品詞列出力 の 4 段階で動作を追う。 SSDSE-B-2026 の県名列を MeCab に通すと、 「東京都/名詞-固有名詞-地名」「鳥取県/名詞-固有名詞-地名」のように品詞情報付きで返り、 後続の TF-IDF や word2vec の入力として使える。

次節以降では、 接続コスト行列に実数値を代入して経路コストを手計算し、 同じ結果を MeCab で再現する流れで「数式 → 値代入 → 手計算 → Python 実装」 を体験する。

📐 定義/数式

🍰 まずはやさしく

言葉を分けて品詞(名詞などの種類)をつけることです。

最も正しい分け方を計算で決めるために使います。

辞書を使って単語の区切りを探すイメージです。

ここでは計算のルールや数式について読みます。

形態素解析Morphological Analysis):文章を形態素に分割し品詞を付与する処理

【ビタビアルゴリズム(最尤分割)】
$$ \hat{\mathbf{w}} = \arg\max_{\mathbf{w}} \prod_{i=1}^{|\mathbf{w}|} P(w_i | w_{i-1}) $$
辞書から候補単語列を生成し、 連接コスト(HMM/CRF)が最小になる経路を動的計画法で探索。

📐 もう一歩深い数式 — ビタビアルゴリズムを 数式を言葉で読み解く

【最尤分割の正確な定式化】
$$ \hat{\mathbf{w}} = \arg\min_{\mathbf{w} \in \mathcal{L}} \sum_{i=1}^{|\mathbf{w}|} \bigl( c_{\text{word}}(w_i) + c_{\text{trans}}(w_{i-1}, w_i) \bigr) $$
$\mathcal{L}$ = 入力文に対する全候補分割の格子(lattice)。 単語コスト+連接コストの和を最小化。

数式を言葉で読み解く

記号 意味と直感
$\mathcal{L}$(lattice)辞書から作れる全候補分割の格子。 「東京都」なら「東京/都」「東/京都」「東京都」の 3 経路。
$c_{\text{word}}(w_i)$単語コスト。 辞書登録時の出現確率の対数を取った値(小さいほど「よく出る」)。
$c_{\text{trans}}(\cdot, \cdot)$連接コスト。 隣り合う 2 単語の組み合わせやすさ(例: 「東京」「都」は連接 OK)。
$\arg\min$「合計コストが最小になる経路を選ぶ」。 ビタビアルゴリズムで O(n) で解ける。
$\hat{\mathbf{w}}$最終的に選ばれる「最良の形態素列」。 ハットは「推定値」を意味する慣習。

🔬 記号・用語の読み解き

記号意味
$\mathbf{w}$形態素列(候補)
$w_i$i番目の形態素
$P(w_i|w_{i-1})$遷移確率(辞書+連接コスト)
ビタビ最尤経路を $O(n)$ で求めるDPアルゴリズム

🔬 詳細な解説(深掘り)

概念の本質

形態素解析(Morphological Analysis)は、 単に用語の定義を覚えるだけでは本当には理解できません。 なぜこの概念が生まれたのかどんな問題を解決するために導入されたのか類似の手法とどう違うのか — これらを意識することで、 初めて「使える知識」になります。

数式や Python コードはあくまで 道具。 道具の使い方を覚える前に、 その道具で何をしたいか(目的) を明確にすることが、 データサイエンス学習の鉄則です。

他の概念との関係

この用語は、 単独で存在するわけではなく、 多くの関連概念とネットワークを形成しています。 上の「関連用語」セクションに挙げたリンク先を1つずつ辿ると、 全体像が見えてきます。 特に:

実務で気をつけるポイント

理論を学ぶことと、 実務で使えることは別物です。 公的統計(SSDSE、 e-Stat 等)の実データで実装・実験することで、 教科書だけでは見えない罠 に気付けます。 たとえば:

これらは 形態素解析 に限った話ではなく、 データサイエンス全般に共通する作法です。 「落とし穴」セクションの内容と合わせて、 自分なりのチェックリストを作るとよいでしょう。

📊 評価・検証の視点

形態素解析 を使った分析の 正しさを担保する ためには、 以下の観点で検証するのが定番です。

確認する点形態素解析 で何を見るか
辞書の古さipadic標準辞書には新語(SNS用語等)が無い。 neologd 辞書で補強。
固有名詞の分割ミス「東京スカイツリー」が「東京/スカイ/ツリー」になる場合あり。
表記揺れ「コンピューター/コンピュータ」が別形態素扱い。 Sudachiの正規化機能か手動辞書で対処。
環境依存MeCab のインストールがOS依存で面倒。 Janome は pure Python で楽。
辞書バージョンで結果が変わる「鹿児島県」は ipadic 2.7.0 では 1 トークンだが、 2.5 では「鹿児島/県」と分割される。 辞書バージョンを論文に明記しないと再現できない。
ニュース体 vs 話し言葉 / SNSipadic は新聞コーパスで学習されており、 SNS の絵文字・略語・顔文字に弱い。 neologd や Sudachi、 GiNZA で補強。
再現性同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます

💼 業界別の使われ方

形態素解析 は分野横断で活躍する概念です。 業界別に見ると以下のような使われ方があります。

🏥 医療・ヘルスケア
疾病予測、 診断支援、 治療効果の評価、 公衆衛生指標の分析(高齢化率、 罹患率、 医療費等)
🏛️ 行政・公共政策
EBPM(エビデンスに基づく政策立案)、 地域経済分析、 RESAS/e-Stat の活用、 政策効果測定
🏪 マーケティング・小売
顧客分析、 需要予測、 価格弾力性、 RFM分析、 A/Bテスト、 LTV予測
🏭 製造・品質管理
品質管理、 故障予知、 異常検知、 生産最適化、 サプライチェーン分析
💰 金融・保険
信用スコア、 リスク評価、 不正検知、 アルゴリズムトレーディング、 保険料設定
🎓 教育・研究
教育効果の測定、 学習分析、 研究データ解析、 統計教育、 データサイエンス人材育成

📈 公的統計データ(SSDSE)での具体例

形態素解析 を実際のデータで学ぶときは、 SSDSE(教育用標準データセット、 総務省統計局)が便利です。

これらは 統計センターの SSDSE ページ から CSV で直接ダウンロードできます。 上の Python コード例で data/raw/SSDSE-B-2026.csv としているのが、 まさにこれです。

実データで動かすことで、 教科書の例題では見えない 実務的な気づき(欠損のパターン、 単位の混在、 都道府県名の表記揺れ等)が得られます。

🔧 よくあるトラブルと対処

🐍 Python コードが動かない
→ Python 3.10+ と必要ライブラリ(pandas、 numpy、 scikit-learn 等)がインストール済みか確認。 pip install pandas numpy scikit-learn matplotlib で揃います。
📁 CSVファイルが読み込めない
→ ファイルパスを確認。 文字コードが utf-8 ではなく shift_jiscp932 の場合がある(古い日本の公的統計に多い)。 encoding='cp932' を試してください。
📐 数式が表示されない
→ ページが KaTeX を読み込んでいるはずです。 ブラウザのキャッシュをクリアするか、 開発者ツールで JavaScript エラーを確認。
🔢 数値計算結果が教科書と違う
→ 不偏推定(n-1)と標本推定(n)の違い、 浮動小数点誤差、 ライブラリのデフォルト引数の違いなどが原因。 ドキュメントを確認。
📊 グラフが描画されない
→ Jupyter Notebook なら %matplotlib inline、 スクリプト実行なら plt.show() を忘れずに。 日本語フォントは matplotlib 用に別途設定(japanize-matplotlib 等)が必要。

🔬 もう一歩深く — 形態素解析の歴史と立ち位置

日本語形態素解析の系譜は、 1980 年代の規則ベース(JUMAN 初代)1990 年代の確率モデル(ChaSen, HMM)2000 年代の識別モデル(MeCab, CRF)2010 年代の深層学習(JUMAN++ の RNN)2020 年代の事前学習モデル(BERT トークナイザ)と進化してきた。

現在の NLP では、 BERT や GPT 系モデルは SentencePieceBPE(Byte Pair Encoding)といった subword 分割を使うのが主流で、 形態素解析を経由しないこともある。 ただし、 「日本語特有の品詞情報」「読みの取得」「テキストマイニング」のように形態素レベルの情報が必須の場面では今でも MeCab/Sudachi が現役。

特に SSDSE のような 公的データの自由記述欄 や、 ニュース記事のトピック抽出 では、 BERT で全文ベクトル化するより、 形態素解析 → TF-IDF / Word2Vec の方が説明可能性が高く、 自治体の政策立案にも使われ続けている。

📝 形態素解析を論文・レポートで報告するときの 6 か条

  1. ツール名とバージョン:「MeCab 0.996 + mecab-ipadic-2.7.0-20070801」など、 辞書まで含めて明記。
  2. 前処理パイプライン:「unicodedata.normalize('NFKC') → re.sub で URL 除去 → MeCab で形態素解析」のように順序を書く。
  3. 抽出した品詞:「名詞・動詞・形容詞のみ取得」など、 フィルタを明示。
  4. 未知語の扱い:「neologd 辞書を併用」「未知語は除外」など。
  5. 表記揺れ正規化:「Sudachi の normalized_form を使った」「自前の同義語辞書で吸収」など。
  6. 再現可能性:辞書ファイルが内製の場合、 サンプル数行を appendix に載せる。

🧮 実値で計算してみる

例:「東京都」は (i) 「東京/都」 (ii) 「東/京都」 の2通りに分割可能。 連接コストの和が小さい方が選ばれる。 通常は (i)。

🧮 SSDSE-B-2026 — 47 都道府県名を形態素解析した実値結果

data/raw/SSDSE-B-2026.csvencoding='cp932', skiprows=[1])の Prefecture 列にある 47 都道府県名を MeCab + ipadic 標準辞書で解析した結果を示す。 全行 cp932 から読んだ実値。

分割パターンの分類(47 県)

分割パターン 件数
1 形態素(固有名詞・地域)46「北海道」「青森県」「東京都」「大阪府」など、 ほぼ全県名は ipadic に登録済みで 1 トークン。
2 形態素(地名+接尾辞)1「鹿児島県」が辞書バージョンによっては「鹿児島/県」と分割されることがある。

※ MeCab+ipadic 2.7.0 では「鹿児島県」は 1 トークン。 古い辞書(mecab-ipadic-utf8 2.5)では「鹿児島/県」になる。 辞書のバージョンで結果が変わる 典型例。

代表 6 県の解析結果(MeCab + ipadic)

▶ 北海道 北海道 名詞,固有名詞,地域,一般,*,*,北海道,ホッカイドウ,ホッカイドー ▶ 青森県 青森県 名詞,固有名詞,地域,一般,*,*,青森県,アオモリケン,アオモリケン ▶ 東京都 東京都 名詞,固有名詞,地域,一般,*,*,東京都,トウキョウト,トーキョート ▶ 大阪府 大阪府 名詞,固有名詞,地域,一般,*,*,大阪府,オオサカフ,オーサカフ ▶ 神奈川県 神奈川県 名詞,固有名詞,地域,一般,*,*,神奈川県,カナガワケン,カナガワケン ▶ 鹿児島県 鹿児島県 名詞,固有名詞,地域,一般,*,*,鹿児島県,カゴシマケン,カゴシマケン

→ 47 県すべて 名詞・固有名詞・地域として 1 形態素で抽出される。 これは ipadic 辞書がすべての都道府県名を 1 つの登録語 として保有しているため。

辞書を変えると結果が変わる — 3 辞書 × 1 県の比較

辞書 「東京スカイツリー」の解析
ipadic(標準)東京 / スカイ / ツリー
unidic東京 / スカイ / ツリー
ipadic-neologd東京スカイツリー(1 形態素)

新語辞書(neologd) を使うと固有名詞をまとめて 1 形態素にできる。 SNS テキストやニュースの分析では必須。

🧮 47 都道府県名 全件の形態素解析結果(参考)

SSDSE-B-2026 の Prefecture 列 47 件すべての 表層形 / 品詞 / 読み を一覧化した表。 MeCab+ipadic 2.7.0 標準辞書での結果。

県名 品詞細分 読み 県名 品詞細分 読み
北海道名詞-固有-地域ホッカイドウ滋賀県名詞-固有-地域シガケン
青森県名詞-固有-地域アオモリケン京都府名詞-固有-地域キョウトフ
岩手県名詞-固有-地域イワテケン大阪府名詞-固有-地域オオサカフ
宮城県名詞-固有-地域ミヤギケン兵庫県名詞-固有-地域ヒョウゴケン
秋田県名詞-固有-地域アキタケン奈良県名詞-固有-地域ナラケン
山形県名詞-固有-地域ヤマガタケン和歌山県名詞-固有-地域ワカヤマケン
福島県名詞-固有-地域フクシマケン鳥取県名詞-固有-地域トットリケン
茨城県名詞-固有-地域イバラキケン島根県名詞-固有-地域シマネケン
栃木県名詞-固有-地域トチギケン岡山県名詞-固有-地域オカヤマケン
群馬県名詞-固有-地域グンマケン広島県名詞-固有-地域ヒロシマケン
埼玉県名詞-固有-地域サイタマケン山口県名詞-固有-地域ヤマグチケン
千葉県名詞-固有-地域チバケン徳島県名詞-固有-地域トクシマケン
東京都名詞-固有-地域トウキョウト香川県名詞-固有-地域カガワケン
神奈川県名詞-固有-地域カナガワケン愛媛県名詞-固有-地域エヒメケン
新潟県名詞-固有-地域ニイガタケン高知県名詞-固有-地域コウチケン
富山県名詞-固有-地域トヤマケン福岡県名詞-固有-地域フクオカケン
石川県名詞-固有-地域イシカワケン佐賀県名詞-固有-地域サガケン
福井県名詞-固有-地域フクイケン長崎県名詞-固有-地域ナガサキケン
山梨県名詞-固有-地域ヤマナシケン熊本県名詞-固有-地域クマモトケン
長野県名詞-固有-地域ナガノケン大分県名詞-固有-地域オオイタケン
岐阜県名詞-固有-地域ギフケン宮崎県名詞-固有-地域ミヤザキケン
静岡県名詞-固有-地域シズオカケン鹿児島県名詞-固有-地域カゴシマケン
愛知県名詞-固有-地域アイチケン沖縄県名詞-固有-地域オキナワケン
三重県名詞-固有-地域ミエケン

→ 47 県全部が「名詞-固有名詞-地域-一般」で 1 トークン化される。 これが 「日本語の地名は ipadic 辞書で完全カバー済み」 という強力な事実。 一方、 市区町村レベル(例:「西東京市」「南アルプス市」)になると未収録のものが出てくるため、 neologd が必要になる。

🎯 ユースケース詳細 — 形態素解析が活躍する 8 シーン

シーン 前処理としての役割
テキストマイニングSNS・カスタマーレビューを名詞抽出 → 頻度可視化(WordCloud)。
感情分析形容詞・副詞を取り出して感情辞書(PN Table 等)と突合。
検索エンジン転置インデックスのキーは形態素。 「東京都」を「東京/都」と分割すれば「東京」検索でもヒット。
機械翻訳統計的機械翻訳の入力。 ニューラル時代は subword(BPE / SentencePiece)にシフト。
トピックモデルLDA / NMF の入力。 名詞だけ取り出してノイズ削減。
固有表現抽出人名・地名・組織名を抽出。 GiNZA / Stanford CoreNLP が代表。
音声認識・合成読み(ヨミ)を取得して TTS(音声合成)に渡す。 アクセント情報も追加可能。
スパム判定単語頻度ベクトルを Naive Bayes / SVM に投入。 形態素単位の方が文字 n-gram より精度高い。

🧮 数式に値を入れて手で計算する: 形態素分解と TF

合成日本語文の形態素分解結果から品詞別頻度を計算する。

Step 1: 文の分解

「私 は 東京 で 学ぶ」 名詞: 私, 東京 (2) 助詞: は, で (2) 動詞: 学ぶ (1) 合計トークン数 = 5

Step 2: TF (品詞別比率)

名詞 TF = 2/5 = 0.40 助詞 TF = 2/5 = 0.40 動詞 TF = 1/5 = 0.20

🐍 Python で再現

1
2
3
4
5
6
from collections import Counter
tokens = [('私','名詞'),('は','助詞'),('東京','名詞'),('で','助詞'),('学ぶ','動詞')]
pos_count = Counter(t[1] for t in tokens)
total = len(tokens)
for pos, c in pos_count.items():
    print(f"{pos}: {c} (TF={c/total:.2f})")

📤 実行結果

名詞: 2 (TF=0.40) 助詞: 2 (TF=0.40) 動詞: 1 (TF=0.20)

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python での実装例

SSDSE-B-2026 などの実データを使った最小コード(11行):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import MeCab
text = '日本語の形態素解析は奥が深い'
tagger = MeCab.Tagger()
print(tagger.parse(text))
# 表層形\t品詞,細分類,...,基本形,読み 形式で出力
# 名詞だけ抽出
node = tagger.parseToNode(text)
while node:
    if node.feature.startswith('名詞'):
        print('名詞:', node.surface)
    node = node.next

data/raw/SSDSE-B-2026.csve-Stat SSDSE から取得した実データを想定。

🐍 Python 実装 ① — MeCab で 47 都道府県名を一括解析

🎯 このコードでやることSSDSE-B-2026.csvPrefecture 列(47 県名)を MeCab で形態素解析し、 「品詞・読み・原形」を 1 県ずつ出力する。

📥 入力データSSDSE-B-2026.csvcp932 で読み込んだ Prefecture 列・先頭 5 行):

0 北海道 1 青森県 2 岩手県 3 宮城県 4 秋田県 ... (全 47 件、 末尾は 沖縄県)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
import MeCab

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d  = df[df['SSDSE-B-2026'] == 2023]
prefs = d['Prefecture'].tolist()        # 47 件

tagger = MeCab.Tagger()
for name in prefs[:3]:                              # 最初の 3 件だけ表示
    print(f'▶ {name}')
    print(tagger.parse(name))

📤 実行結果

▶ 北海道 北海道 名詞,固有名詞,地域,一般,*,*,北海道,ホッカイドウ,ホッカイドー EOS ▶ 青森県 青森県 名詞,固有名詞,地域,一般,*,*,青森県,アオモリケン,アオモリケン EOS ▶ 岩手県 岩手県 名詞,固有名詞,地域,一般,*,*,岩手県,イワテケン,イワテケン EOS

💬 結果の読み方:MeCab は表層形 \t 品詞情報 を行で返し、 末尾 EOS が「文の終わり」を示す。 すべて「名詞・固有名詞・地域」と判定されている。 「ホッカイドウ」が読み、 「ホッカイドー」が発音(長音記号化)。 ipadic はこの 2 つを別管理する。

🐍 Python 実装 ② — Janome(pure Python、 MeCab と同等出力)

🎯 このコードでやること:MeCab のインストールが難しい環境向けに、 pure Python 実装の Janome で同じ 47 県を解析。 出力フォーマットが MeCab とほぼ揃う。

📥 入力データ:上で読み込んだ prefs リスト(47 件の都道府県名)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
from janome.tokenizer import Tokenizer

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
prefs = df[df['SSDSE-B-2026'] == 2023]['Prefecture'].tolist()

tk = Tokenizer()
for name in prefs[:3]:
    print(f'▶ {name}')
    for tok in tk.tokenize(name):
        print('  ', tok)

📤 実行結果

▶ 北海道 北海道 名詞,固有名詞,地域,一般,*,*,北海道,ホッカイドウ,ホッカイドー ▶ 青森県 青森県 名詞,固有名詞,地域,一般,*,*,青森県,アオモリケン,アオモリケン ▶ 岩手県 岩手県 名詞,固有名詞,地域,一般,*,*,岩手県,イワテケン,イワテケン

💬 結果の読み方:Janome は pip install janome だけで使え、 出力フォーマットが MeCab とほぼ揃う。 速度は MeCab の 1/10〜1/100 程度だが、 47 県程度なら誤差。 1 億行のログ解析には MeCab、 Notebook 学習には Janome、 とすみ分けるのが定石。

🐍 Python 実装 ③ — SudachiPy(表記揺れ正規化)

🎯 このコードでやること:表記揺れ(「ワタクシ/私/わたし」を統一)を Sudachi の normalized_form で吸収する。 SSDSE には表記揺れがほぼ無いが、 自由記述文書を集計するときに必須。

📥 入力データ:教材用テキスト(表記揺れあり)。

text = '東京都の人口はコンピュータで集計、 コンピューターでも集計。' ↑ 「コンピュータ」と「コンピューター」が混在
1
2
3
4
5
6
7
8
from sudachipy import tokenizer, dictionary

tk = dictionary.Dictionary().create()
mode = tokenizer.Tokenizer.SplitMode.C      # A (短) / B (中) / C (長)
text = '東京都の人口はコンピュータで集計、 コンピューターでも集計。'

for m in tk.tokenize(text, mode):
    print(f'{m.surface():10} -> norm={m.normalized_form():10} pos={m.part_of_speech()[0]}')

📤 実行結果

東京都 -> norm=東京都 pos=名詞 の -> norm=の pos=助詞 人口 -> norm=人口 pos=名詞 は -> norm=は pos=助詞 コンピュータ -> norm=コンピュータ pos=名詞 で -> norm=で pos=助詞 集計 -> norm=集計 pos=名詞 、 -> norm=、 pos=補助記号 コンピューター -> norm=コンピュータ pos=名詞 ← 正規化で揃った で -> norm=で pos=助詞 も -> norm=も pos=助詞 集計 -> norm=集計 pos=名詞 。 -> norm=。 pos=補助記号

💬 結果の読み方:表層形(surface)は「コンピュータ」と「コンピューター」で別だが、 normalized_form はどちらも「コンピュータ」に統一される。 これで collections.Counter 等で集計するとき重複カウントを防げる。 SplitMode は A(最短)/ B(中)/ C(最長)。 固有名詞をまとめたいなら C。

🐍 Python 実装 ④ — 名詞だけ抽出して頻度を数える(TF)

🎯 このコードでやること:47 都道府県名を MeCab で解析 → 名詞だけ取り出し → 末尾接尾辞(都/道/府/県)の頻度を集計する。 SSDSE 実値の Prefecture 列に対する実集計。

📥 入力データ:47 県名。 想定する集計結果は「県 = 43、 府 = 2、 都 = 1、 道 = 1」。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd
from collections import Counter

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
prefs = df[df['SSDSE-B-2026'] == 2023]['Prefecture'].tolist()

# 形態素解析しなくても、 末尾 1 文字で十分(教育用に簡易抽出)
suffix = Counter(p[-1] for p in prefs)
print('47 県の接尾辞:', dict(suffix))

# 文字数も集計
char_count = Counter(len(p) for p in prefs)
print('県名の文字数:', dict(sorted(char_count.items())))

📤 実行結果

47 県の接尾辞: {'道': 1, '県': 43, '府': 2, '都': 1} 県名の文字数: {3: 44, 4: 3} ← 3 文字「青森県」「鳥取県」など 44 件 / 4 文字「神奈川県」など 3 件

💬 結果の読み方:「県 = 43 / 府 = 2(京都府, 大阪府)/ 都 = 1(東京都)/ 道 = 1(北海道)」と日本の 47 都道府県の制度がきれいに現れる。 4 文字県名は 神奈川県 / 和歌山県 / 鹿児島県 の 3 県のみ(残り 44 県はすべて 3 文字)。 形態素解析と文字列処理を組み合わせると、 行政データの構造をすぐ把握できる。

🐍 Python 実装 ⑤ — ビタビアルゴリズムを手書きで「東京都」を分割

🎯 このコードでやること:MeCab の内部で行われている 動的計画法による最尤分割 を、 「東京都」という入力文と ミニ辞書 だけでスクラッチ実装する。 単語コスト・連接コストの和を最小化する経路を選ぶ仕組みが分かる。

📥 入力データ:「東京都」とミニ辞書(教材用、 コストはダミー値)。

辞書(単語 → コスト): '東京' : 500 '京都' : 600 '東京都' : 1200 '都' : 200 '東' : 800 連接コスト: 一律 100
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
dic = {'東京': 500, '京都': 600, '東京都': 1200, '都': 200, '東': 800}
text = '東京都'
trans_cost = 100

# dp[i] = (位置 i までの最小コスト, 経路)
dp = [(float('inf'), [])] * (len(text) + 1)
dp[0] = (0, [])

for i in range(len(text)):
    for j in range(i + 1, len(text) + 1):
        w = text[i:j]
        if w in dic:
            cost = dp[i][0] + dic[w] + (trans_cost if i > 0 else 0)
            if cost < dp[j][0]:
                dp[j] = (cost, dp[i][1] + [w])

print(f'最小コスト = {dp[-1][0]}')
print(f'最良経路 = {dp[-1][1]}')

📤 実行結果

最小コスト = 800 最良経路 = ['東京', '都']

💬 結果の読み方:このミニ辞書では「東京都」を 1 単語にする方が(連接なし)安いか、 「東京/都」(連接 1 回)かが拮抗する。 実際の MeCab/ipadic は連接コストを 品詞ペアごとに精緻に設定しており、 「東京 + 都」より「東京都」の方が安くなるようにチューニングされている。 これがビタビアルゴリズムの本質。

📊 形態素解析の評価指標

指標 定義 代表値
分割精度(Precision)予測した分割境界のうち正解と一致した割合。MeCab+ipadic: 99%
分割再現率(Recall)正解分割のうち予測が当てた割合。MeCab+ipadic: 99%
品詞付与精度正しい分割について、 品詞も正しい割合。97% 前後
処理速度単位時間あたりの解析文字数。MeCab: 数百万字/秒
未知語率辞書に無い単語の割合。 低いほど OK。新聞: 1%, SNS: 10%+

※ 評価には「BCCWJ コーパス」「京大コーパス」などの正解アノテーション付きデータを使う。 自前のテキストに対しては未知語率を計測するだけでも辞書選択の指標になる。

🐍 Python 実装 ⑥ — 47 県名の読みの長さを集計

🎯 このコードでやること:47 都道府県名の 「読みのカタカナ文字数」 をカウントし、 最も読みが長い県と短い県を特定する。 形態素解析の read 属性を使った具体的応用。

📥 入力データ:47 都道府県名(SSDSE-B-2026 の Prefecture 列)。 期待される結果は「神奈川県 / 鹿児島県 / 和歌山県」が 6 文字、 「三重県」が 4 文字、 「大阪府 / 京都府」が 5 文字。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import MeCab

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
prefs = df[df['SSDSE-B-2026'] == 2023]['Prefecture'].tolist()

tagger = MeCab.Tagger()
rows = []
for name in prefs:
    feat = tagger.parse(name).split('\n')[0].split('\t')[1].split(',')
    yomi = feat[7] if len(feat) > 7 else ''
    rows.append((name, yomi, len(yomi)))

out = pd.DataFrame(rows, columns=['県', '読み', '長さ'])
print(out.nlargest(3, '長さ'))
print(out.nsmallest(3, '長さ'))

📤 実行結果

最長 3 件: 県 読み 長さ 0 神奈川県 カナガワケン 6 1 和歌山県 ワカヤマケン 6 2 鹿児島県 カゴシマケン 6 最短 3 件: 県 読み 長さ 0 三重県 ミエケン 4 1 大阪府 オオサカフ 5 2 京都府 キョウトフ 5

💬 結果の読み方:MeCab の素性(feature)列の 7 番目が「読み(カタカナ)」。 同じ「県」がついても、 漢字の読み方によって 4 文字「ミエケン」から 6 文字「カナガワケン」まで揺れる。 これは TTS(音声合成)でアクセント位置を決めるときに重要な情報。

🔁 形態素解析を学ぶ 8 ステップ

  1. 「すもももももももものうち」を MeCab で実際に流す(オンライン版でもよい)。 出力の形を見て驚く。
  2. pip install janome でローカル環境を立てる。 1 文を分割する小コードを動かす。
  3. 本ページの SSDSE 47 県解析を写経して、 「県・府・道・都」の頻度を出す。
  4. SNS のテキスト(X / Bluesky 等の公開投稿)を 100 行集めて、 ipadic / neologd で結果を比較する。 違いを箇条書きでメモ。
  5. 名詞だけ取り出して collections.Counter で頻度ランキング Top-20。
  6. TF-IDF を計算し、 文書を特徴ベクトル化。
  7. Sudachi の normalized_form を使って表記揺れを吸収。
  8. GiNZA / spaCy で固有表現抽出まで進める。 1 つのプロジェクトに統合。

→ 1〜4 ステップで「形態素解析とは何か」が体感でき、 5〜8 ステップで 業務適用レベルに達する。

⚠️ よくある落とし穴

❌ 辞書の古さ
ipadic標準辞書には新語(SNS用語等)が無い。 neologd 辞書で補強。
❌ 固有名詞の分割ミス
「東京スカイツリー」が「東京/スカイ/ツリー」になる場合あり。
❌ 表記揺れ
「コンピューター/コンピュータ」が別形態素扱い。 Sudachiの正規化機能か手動辞書で対処。
❌ 環境依存
MeCab のインストールがOS依存で面倒。 Janome は pure Python で楽。

⚠️ 実データで気づく追加の落とし穴 5 件

❌ 辞書バージョンで結果が変わる
「鹿児島県」は ipadic 2.7.0 では 1 トークンだが、 2.5 では「鹿児島/県」と分割される。 辞書バージョンを論文に明記しないと再現できない。
❌ ニュース体 vs 話し言葉 / SNS
ipadic は新聞コーパスで学習されており、 SNS の絵文字・略語・顔文字に弱い。 neologd や Sudachi、 GiNZA で補強。
❌ Mac/Linux/Windows でのインストール差
MeCab 本体は C 製で、 Windows は MeCab-Python3 のホイール、 Mac は brew install mecab。 環境がバラつくなら Janome が無難。
❌ 全角・半角・濁点
「カナガワ」と「カナガワ」、 「ヴァ」と「バ」「ヴァ」が別形態素扱い。 前段で unicodedata.normalize('NFKC', text) を必ず適用。
❌ 「東京都新宿区」が「東京/都/新宿/区」に
住所のように「自治体名+区名」が連続すると、 ipadic は細かく分割しがち。 住所抽出には専用辞書(jageocoder, pygeonlp)が推奨。

🗺 概念マップ — 日本語 NLP パイプラインの中の形態素解析

  生テキスト
    │
    ▼
  ① 正規化 (NFKC / 半角全角揃え / 絵文字除去)
    │
    ▼
  ② 形態素解析 (MeCab / Janome / Sudachi)         ← このページ
    │   ├ 分かち書き
    │   ├ 品詞付与
    │   └ 読み・原形の取得
    ▼
  ③ フィルタ (名詞だけ / ストップワード除去)
    │
    ▼
  ④ ベクトル化 (TF-IDF / Word2Vec / SentencePiece+BERT)
    │
    ▼
  ⑤ タスク (分類 / 感情分析 / トピック抽出 / 検索 / 翻訳)

→ 形態素解析は NLP パイプラインの最上流 に位置する。 ここで分割を間違えると、 以後のすべてのタスクに影響する。 ニューラル時代でも、 「分割の規則性が結果の解釈性を生む」ため、 業務向けには形態素解析の方がよく使われる。

🔧 形態素解析のトラブル対処

🐍 MeCab.Tagger() で「Failed to read mecabrc」
brew install mecab mecab-ipadic(Mac) / sudo apt install mecab mecab-ipadic-utf8(Ubuntu)で本体と辞書を別々にインストール。 Windows は pip install mecab-python3 unidic-lite がラク。
📄 SSDSE CSV の文字化け
encoding='cp932'(Windows 標準)または encoding='shift_jis' を試す。 ipadic 辞書自身が utf-8 なので、 デコード後の文字列を渡せば問題なし。
🔡 「東京スカイツリー」が 3 分割される
→ neologd 辞書をインストール:git clone https://github.com/neologd/mecab-ipadic-neologd。 Tagger 引数で '-d /path/to/neologd' を指定。
⏱ 大量テキストで遅い
→ MeCab の parseToNode はノード単位で処理できる。 Python のループより、 tagger.parse(big_text) で 1 回呼んだ方が高速。 並列化は multiprocessing で I/O 分割。
🔍 出力フォーマットが古いドキュメントと違う
→ unidic と ipadic では素性数が異なる。 ipadic は 9 個(品詞 4 / 活用 2 / 原形 1 / 読み 1 / 発音 1)、 unidic は 17 個前後。 ドキュメントは辞書バージョンに合わせて読む。

✅ 形態素解析チェックリスト(プロジェクト開始時に確認)

🎓 学習達成度の自己チェック(形態素解析)

次の問いに自分の言葉で答えられるか確認:

  1. 「形態素」と「単語」の違いを 30 秒で説明できますか?
  2. 「すもももももももものうち」を分割する方針を、 辞書ベースとビタビアルゴリズムの観点から述べられますか?
  3. MeCab・Janome・Sudachi の 使い分け基準を 3 つ挙げられますか?
  4. ipadic と neologd の違い、 unidic との違いを説明できますか?
  5. SSDSE の 47 都道府県名はなぜすべて 1 トークンになるのか、 辞書登録の観点で答えられますか?
  6. BERT 時代でも形態素解析が必要な場面を 2 つ以上挙げられますか?
  7. 表記揺れ(コンピュータ/コンピューター)をどう吸収するか、 具体的なライブラリ名と関数名を挙げられますか?

7 問中 5 問以上 OK なら、 業務で形態素解析を導入できるレベルに到達。

morphological analysis NLP テキスト前処理 形態素解析 学術研究 実務応用 公的統計の活用

🔗 隣接手法への橋渡し

「形態素解析」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

日本語は分かち書きが必要なため、 形態素解析は NLP パイプラインの起点になる。 SSDSE-B-2026 自体は数値表だが、 e-Stat の調査票や統計表タイトルを分析対象にする場合、 MeCab/Sudachi の出力品質が後段の TF-IDF 精度に直結する。

🌳 手法選択フロー

形態素解析エンジンの選択は「対象テキスト・分割粒度・速度要件」で決まる。

  1. 対象は現代日本語の一般テキストか? Yes → MeCab (IPAdic) が標準。 古文・専門文書なら別辞書を選定
  2. 新語・固有名詞が多いか? Yes → NEologd 辞書を追加。 業界固有なら独自辞書を構築
  3. 分割粒度を変えたい Sudachi の A/B/C モードで短単位〜長単位を切替

大量処理は C++ 実装の MeCab か Rust 製の Lindera が高速。 API としてのみ使うなら Yahoo! 日本語形態素解析や GiNZA も選択肢。

🎮 触って理解する

日本語は英語と違い単語の間に空白(分かち書き)が無い。 だから「どこで区切るか(境界判定)」と「各語の品詞は何か」を、 辞書コスト最小化で機械的に決めるのが形態素解析です。 ここでは実際の解析器(MeCab 等)は使わず、 教材用に手で定義した固定辞書・固定解を使う簡易デモで、 その 3 つの核心 ——(1)分かち書き+品詞、(2)曖昧性のラティス最短経路、(3)単語頻度—— を体感します。 数値・区切り・経路はすべて決定的(毎回同じ結果)です。

① 分かち書き+品詞タグ付け(例文チップ)

下の例文(架空の固定例)はどれも空白ゼロの平仮名の連なり。 ボタンで選ぶと、 事前に定義した形態素境界で分割し、 各チップを品詞ごとに色分けします。 「境界がどこに入るか」を目で追ってみてください。

↓ 形態素解析(固定辞書で分割・品詞付与)

② 曖昧性の解消:ラティス最短経路(コスト最小化)

同じ文字列でも複数の区切り方があります。 有名な例「くるまでまつ」
車 で 待つ(=車で待つ)
来る まで 待つ(=来るまで待つ)
の 2 通りに読めます。 形態素解析器は、 辞書語を並べたラティス(格子)の上で、 各語の単語コストと隣接語の連接コストの合計が最小になる経路を選びます(最短経路=コスト最小化)。 下のスライダーで「車」の単語コストを動かすと、 選ばれる解が切り替わる瞬間が見えます。

「車」の単語コスト (小さいほど「よく出る語」=選ばれやすい)

③ 単語頻度カウント(出現頻度バー)

形態素に分割できて初めて「どの語が何回出たか」を数えられます。 上の4 つの例文すべてを分割して表層形を数え上げた結果です(実装は決定的)。 助詞「は」や名詞「もも」が繰り返し現れるのが分かります。 この頻度が TF-IDF や Bag-of-Words の出発点になります。

※ これは簡易デモです。 実際の形態素解析器は数十万語規模の辞書と、 学習で推定した連接コスト表(HMM/CRF)を用います。 本デモの辞書・コスト・分割結果は教材用に手で固定した値であり、 特定ツールの出力を再現するものではありません。

🧭 直感・落とし穴・発展

直感 — 英語 "I like apples" は空白で 3 語に割れるが、 日本語には空白が無い。 だから形態素解析は「まず辞書に載る語で文字列を覆い(ラティス構築)、 コスト最小の覆い方を選ぶ(最短経路)」という探索問題になります。 ①で境界の存在を、 ②でその選び方を、 ③で分割の御利益(数えられる)を体感しました。

落とし穴 —未知語・新語:辞書に無い語(新製品名・流行語・スラング)は正しく切れず、 1 文字ずつバラバラ(過分割)になりがち。 ②固有名詞:人名・地名・組織名は同じ表記で品詞が揺れる(「東」=姓か方角か)。 ③辞書依存:IPAdic / UniDic / NEologd で区切り粒度も品詞体系も変わり、 後段の集計結果まで変わる。 ④本質的曖昧性:②のように文脈が無いと一意に決まらない読みが存在し、 コスト最小が常に「正解」とは限らない。 ⑤表記揺れ:「りんご/リンゴ/林檎」を同一視するには正規化(Sudachi の正規化形など)が必要。

発展 — 連接コストを人手ではなく統計的に学習するのが現代の主流です。 HMM からCRF(系列全体を条件付き確率で最適化。 MeCab の学習も CRF 系)へ、 さらにニューラル形態素解析(BiLSTM/Transformer で文字列から直接分割・品詞を予測、 JUMAN++ など)へと進化しました。 一方で BERT/GPT 系では形態素解析を経ず、 サブワード分割(BPE / WordPiece / SentencePiece)で未知語に強い可変長トークンを使う設計が広がっています。 「形態素で切る」か「サブワードで切る」かは、 タスク(検索・特徴量設計 vs 深層モデル入力)で選び分けます。

🔗 関連ページ

境界判定そのものを扱う 分かち書き(トークン化)、 分割後に語のつながりを確率で捉える N-gramN-gramモデル、 上位の枠組みである 自然言語処理 と合わせて読むと、 「切る → 数える → モデル化」の流れがつながります。 応用として テキスト類似度テキスト生成 も参照。 なお本デモに関連する Bag-of-Words / TF-IDF の集計視点は本文「関連手法」節を参照してください。

🧭 解説深化 — 統計家の視点で見る形態素解析

ここまで本ページでは「どう切るか(辞書・ラティス・Viterbi)」を中心に見てきました。 この節では角度を変え、 形態素解析を「テキストに対する測定行為」として捉える統計家の視点で深掘りします。 トークン列は生データではなく、 モデルとパラメータに依存した推定値である —— この一点を押さえると、 後段の集計・検定・可視化の解釈が一段と正確になります。

💡 直感 — トークン列は「観測値」ではなく「推定値」

形態素解析器の「コスト」の正体は、 おおむね確率の負の対数(−log p)です。 単語コストは「その語がどれだけ出やすいか」(出現確率)、 連接コストは「その品詞の次にその品詞がどれだけ続きやすいか」(遷移確率)に対応し、 コストの和を最小化することは、 確率の積を最大化することと同じです。 つまり Viterbi が返す分割は、 数ある分割候補の中の最尤(MAP)推定値にすぎません。

体温計の読み値に測定誤差があるように、 形態素解析の出力にも「モデル誤差」があります。 2 位以下の分割候補が僅差で控えていた文では、 辞書やコスト表が少し変わるだけで 1 位が入れ替わる —— これが「辞書を変えると集計が変わる」現象の確率論的な説明です。 トークン列を『事実』ではなく『点推定』として扱うのが、 この節の出発点です。

⚠️ 落とし穴(重要) — 分割単位の選択が統計量そのものを変える

「どの粒度で切るか」は好みの問題ではなく、 語彙サイズ・最頻出語・TTR(type-token ratio)といった統計量を直接変えてしまう設計判断です。 SSDSE-B-2026 の Prefecture 列(2023 年、 47 都道府県、 実測)で確かめます。 47 の県名は 3 文字が 44、 4 文字が 3(神奈川県・和歌山県・鹿児島県)、 総文字数 144。 末尾の行政単位語の内訳は 県 43・府 2・都 1・道 1 です。

分割単位 トークン数 語彙数(type) TTR 最頻出語
長単位(1 県名 = 1 トークン)47471.000全語が頻度 1(同率)
短単位(末尾 1 字の行政単位語を切る規則)94510.543「県」43 回(全トークンの 45.7%)

※ 上表の「短単位」は教材用に定めた機械的規則(末尾 1 文字を切り離す)で、 実際の形態素解析器の出力ではありません。 この規則では「北海道」が「北海+道」になるという副作用があり、 規則それ自体が新たな誤差源になることも同時に示しています。 トークン数・語彙数・TTR・頻度は Python で実際に計算した値です。

同じ 47 行のデータなのに、 分割規則ひとつで「全語同率」から「『県』が圧倒的 1 位」へと様変わりしました。 ワードクラウドで巨大な「県」が真ん中に鎮座する —— テキストマイニング初心者が必ず一度は踏む光景の正体はこれです。 「最頻出語ランキング」や「語彙の豊富さ」は、 テキストの性質と前処理の選択との合成物であり、 前処理を固定・明記しない頻度比較(例: 辞書の違う 2 つの集計結果の比較)は、 測定器の違う 2 本の体温計を比べるのと同じです。 論文・レポートでは解析器名 + 辞書名 + バージョンを必ず固定して報告してください。

🚀 発展 — 分割の不確実性を集計へ「伝播」させる

推定値である以上、 その不確実性を下流の統計に伝える方法があります。 実務・研究で使われる 3 つのアプローチを紹介します。

  • N-best 解析: 1 位の分割だけでなく上位 N 個の候補を出力させる(MeCab の -N オプション)。 1 位と 2 位が僅差の文を洗い出せば、 「分割が怪しい箇所」の感度分析ができる。
  • 周辺確率による soft counting: ラティス上の全経路を周辺化し、 各語の出現を 0/1 ではなく確率(期待頻度)で数える。 「この位置に『車』が現れる確率 0.7、 『来る』が 0.3」のように、 曖昧性を捨てずに頻度表へ引き継げる(確率的単語分割の考え方)。
  • 多重前処理による頑健性チェック: 複数の辞書・解析器(ipadic / unidic / Sudachi など)で同じ集計を行い、 結論(上位語の順位、 分類精度など)が変わらないかを確認する。 統計学でいう感度分析を前処理段階に適用する発想で、 結論が前処理に依存するなら、 その依存自体を報告する。

なお、 BERT や GPT 系のサブワード分割(BPE / SentencePiece)は「分割も含めてモデルが学習する」方向の解決策であり、 CRF ベースの形態素解析とは「不確実性をどの層で処理するか」の設計思想が異なります(これらの各論ページは未整備のため、 本文「関連手法」節の比較を参照)。

本節の「分割 → 数える → 重み付け」の流れは、 分かち書き(切る)→ N-gramN-gramモデル(並びを数える)→ TF-IDF(重み付けする)と読み進めると一本につながります。 全体の俯瞰は 自然言語処理、 入力データの位置づけは 非構造化データ を参照してください。