形態素解析とは?
仕組み・使いどころを実例で解説
形態素解析とは、文章を「意味を持つ最小の単位」に分割し、それぞれの品詞や原形を判定する処理のことです。日本語は英語と違って単語が空白で区切られていないため、コンピュータが日本語を扱うときの最初の関門になります。
この記事の要点:①形態素解析は「分割」「品詞判定」「原形化」の3つをまとめて行う処理 ②結果は使う辞書で変わるため、エンジン選びより辞書選びのほうが重要なことが多い ③生成AIが主流になった今も、検索エンジンやテキスト集計の現場では現役
形態素解析とは何か
形態素とは、それ以上分割すると意味を失ってしまう、言語の最小単位です。形態素解析は、文章をこの単位に切り分けたうえで、各要素が何であるかを判定します。
有名な例文で見てみましょう。「すもももももももものうち」という、ひらがなだけの文です。人間でも一瞬迷いますが、形態素解析にかけると次のように分解されます。
| 表層形 | 品詞 | 原形 |
|---|---|---|
| すもも | 名詞 | すもも |
| も | 助詞 | も |
| もも | 名詞 | もも |
| も | 助詞 | も |
| もも | 名詞 | もも |
| の | 助詞 | の |
| うち | 名詞 | うち |
このように、形態素解析は次の3つを同時に行っています。
- 分かち書き:どこで区切るかを決める。「すもも/も/もも/も/もも/の/うち」
- 品詞タグ付け:各要素が名詞なのか助詞なのかを判定する
- 原形化(見出し語化):「走っ」→「走る」のように活用を元の形に戻す
なぜ日本語には形態素解析が必要なのか
英語は I have a pen のように、単語が空白で区切られています。そのため空白で切るだけで単語の列が得られます。
一方で日本語は「私はペンを持っています」のように切れ目がありません。この状態では、コンピュータは「私」という語が何回出てきたかを数えることすらできません。だからこそ、日本語処理では形態素解析が長らく必須の前処理でした。
さらに厄介なのが切り方が一意に決まらないことです。「東京都」は「東京都」という1語なのか「東京」+「都」なのか。「くるまでまつ」は「車で待つ」なのか「来るまで待つ」なのか。形態素解析エンジンは、辞書と統計モデルを使って、最も自然な区切り方を選んでいます。
形態素解析エンジンの比較
日本語でよく使われる主要なエンジンを整理します。
| エンジン | 特徴 | 向いているケース |
|---|---|---|
| MeCab | 最も広く使われている定番。動作が非常に高速で、資料や事例が豊富 | 迷ったらこれ。大量テキストの処理 |
| Sudachi | 分割の粒度をA・B・Cの3段階から選べる。表記ゆれの正規化に強い | 「東京都」を1語にも2語にも切り分けたい、検索用途 |
| Janome | Pure Python製で辞書を内蔵。pip install だけで動く |
環境構築でつまずきたくない、学習・試作用 |
| JUMAN++ | 言語モデルを使い、文脈を考慮した精度の高い解析 | 精度を最優先したい研究用途 |
選び方の目安:まずJanomeで試して、速度が足りなくなったらMeCab、表記ゆれや検索用途で困ったらSudachi、という順序が実務では現実的です。いきなり環境構築の重いものから始める必要はありません。
結果を左右するのはエンジンより「辞書」
意外に見落とされがちですが、同じエンジンでも辞書が違えば結果は変わります。
| 辞書 | 性格 |
|---|---|
| IPAdic | MeCabの標準辞書。バランスが良いが、収録語彙がやや古い |
| UniDic | 国立国語研究所による辞書。単位が細かく統一されており、言語研究や集計に向く |
| NEologd | 新語・固有名詞に強い。人名や商品名、ネット用語を1語として認識できる |
たとえば標準辞書では「機械学習」が「機械」+「学習」に割れてしまうことがありますが、新語辞書を使えば1語として扱えます。集計結果が想定と違うときは、まず辞書を疑ってください。
Pythonで動かしてみる
実際に手を動かすのが一番早いので、環境構築が最も簡単なJanomeで試してみます。
pip install janome
from janome.tokenizer import Tokenizer
t = Tokenizer()
for token in t.tokenize("すもももももももものうち"):
print(token)
# すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも 名詞,一般,*,*,*,*,もも,モモ,モモ
# ...
分かち書きだけが必要なら、次のように書けます。
print(list(t.tokenize("私はペンを持っています", wakati=True)))
# ['私', 'は', 'ペン', 'を', '持っ', 'て', 'い', 'ます']
名詞だけを抜き出して頻度を数える、というのがテキストマイニングの定番処理です。
from collections import Counter
text = "AIの活用が進む。AI導入の相談が増えている。"
nouns = [tk.surface for tk in t.tokenize(text)
if tk.part_of_speech.startswith("名詞")]
print(Counter(nouns))
# Counter({'AI': 2, '活用': 1, '導入': 1, '相談': 1})
生成AI時代に、形態素解析はまだ必要か
ここが最も多い疑問だと思います。ChatGPTのような大規模言語モデルは、実は形態素解析を使っていません。代わりに「サブワード分割」という別の方式で文字列を切っています。
| 形態素解析 | サブワード分割 | |
|---|---|---|
| 切る単位 | 意味を持つ最小単位 | 統計的に出現しやすい文字の並び |
| 辞書 | 人が整備した辞書が必要 | データから自動で学習 |
| 未知語 | 辞書にないと苦手 | 細かく分割して必ず処理できる |
| 結果の解釈 | 品詞が付くので人が読める | 意味の区切りとは限らない |
では形態素解析はもう不要かというと、そんなことはありません。現場では今も次の場面で使われています。
- 全文検索エンジンのインデックス作成:日本語検索の精度を出すには、今も形態素解析ベースの分割が標準です。
- テキストマイニング・集計:「どの単語が何回出たか」を数えるには、意味の単位で切れている必要があります。サブワードでは集計になりません。
- 軽量・高速・説明可能:LLMを呼べばコストも時間もかかります。品詞で絞り込むだけの処理なら、形態素解析のほうが桁違いに速く、結果の理由も説明できます。
実務での使い分け:意味を理解させたいならLLM、数えたり絞り込んだりしたいなら形態素解析。この2つは競合ではなく、役割が違う道具です。RAGの前処理でも、検索対象を絞る段階で形態素解析を併用することがあります。
よくある質問
Q. 形態素解析と構文解析はどう違いますか?
A. 形態素解析は「単語に切って品詞を付ける」ところまでです。構文解析はその先で、「どの語がどの語にかかっているか」という文の構造を判定します。順序としては形態素解析が先に来ます。
Q. 精度が出ないときは何を疑えばいいですか?
A. まず辞書です。専門用語や固有名詞が割れているなら、新語辞書に変えるか、ユーザー辞書に登録すれば大きく改善します。エンジンを乗り換えるのは、その後で構いません。
Q. 英語には形態素解析は不要ですか?
A. 分かち書きは不要ですが、活用を原形に戻す処理(見出し語化)は英語でも行います。running を run にまとめる、といった処理です。
Q. どの言語処理技術から学ぶべきですか?
A. 形態素解析は、日本語処理の土台であり、結果が目に見えるので学習効率が良い題材です。ここからベクトル表現へ進むと、技術の流れがつかみやすくなります。詳しくは形態素解析からベクトル解析へ:この20年で起きた言語処理技術の大革命でも解説しています。
POSIIは、自然言語処理を活用した業務効率化システムやRAGによる社内文書検索AIの受託開発を行っています。「自社のテキストデータをどう活かせるか」の相談から承ります。サービス詳細/お問い合わせ