形態素解析とは、文を意味を持つ最小の単位である「形態素」に区切り、それぞれに品詞・活用形・原形・読みを付ける処理です。日本語は単語の間に空白を入れないため、単語の単位で検索の索引を作る、アンケートの自由回答で語を数えるといった処理では、最初にこの分割を行います。この記事では、形態素解析の定義と、辞書とコスト計算で区切りを決める仕組みを、実際の解析器に文を通した結果とあわせて説明します。「外国人参政権」が「外国/人参/政権」に割れる有名な誤分割が、なぜ起きるのかも数字で示します。
まとめ:形態素解析の要点
- 形態素解析は、文を形態素に区切って品詞・原形・読みを付ける処理です。日本語の自然言語処理の入口にあたります。
- 区切り方は辞書で決まります。解析器は辞書から区切りの候補を網目状に並べ、語の出やすさとつながりやすさのコストの合計が最も小さい経路を選びます。
- 同じ文でも辞書が違えば結果が変わります。IPAdicとunidic-liteは「外国人参政権」を「外国/人参/政権」と誤って分け、Sudachiは3段階の粒度で正しく分けました(2026年10月の実測)。
- 形態素解析が決めるのは区切りと、各語の品詞・原形・読みまでです。語と語の係り受けは構文解析、意味の判定は意味解析という次の段階が担います。
- LLMのトークナイザーは形態素に沿って区切りません。品詞も原形も返さないので、語を数える・検索する用途では今も形態素解析を使います。
形態素解析の定義と「食べました」の分解例
形態素は、それ以上分けると意味を持たなくなる言葉の単位です。「食べました」は、動詞「食べ」、丁寧の助動詞「まし」、過去の助動詞「た」の3つの形態素でできています。形態素解析は、この区切りを見つけるだけでなく、各形態素に品詞と活用、辞書に載っている形(原形)、読みを付けます。
MeCabとIPAdic辞書で「食べました」を解析すると、次の出力になります。1行が1形態素で、タブの後ろにカンマ区切りで品詞から発音までが並びます。
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS
タブの後ろの素性を左から数えて7番目の「食べる」「ます」が原形です。集計や検索では、「食べた」「食べます」「食べない」をこの原形にそろえて1語として数えます。形態素解析の結果がそのまま使われるのは、分割よりもこの原形と品詞の情報であることが多いです。
「形態素分析」「形態要素解析」との表記の違い
正式な用語は「形態素解析」で、英語では morphological analysis です。「形態素分析」は同じ処理を指す言い換えです。この記事では、MeCabやSudachiの説明書と同じ「形態素解析」に表記をそろえています。「形態要素解析」という表記も検索されますが、形態素解析の言い間違いで、別の技術を指す用語ではありません。
日本語で形態素解析が必要な理由と英語との違い
英語は「I ate an apple」のように単語の間に空白があり、空白が語の境界の手がかりになります。日本語には空白が無く、ひらがなが続くと区切りの候補がいくつも出ます。「きょうはいしゃにいった」は「今日は医者に行った」とも「今日歯医者に行った」とも「今日は医者に言った」とも読めます。
この文を解析器に通すと、MeCab+IPAdicもSudachiも「きょう/は/いしゃ/に/いっ/た」と分け、「いっ」の原形を「いく」としました。Sudachiは正規化形として「今日」「医者」「行く」も返します。MeCabやSudachiは、この入力では候補の中から1つを選んで返し、「歯医者」や「言った」の読みがあり得たことは出力に残りません。JUMAN++のように言語モデルで語の並びの自然さを評価する解析器もありますが、短い1文だけでは前後の文脈が無く、どの読みが正しいかは決めきれません。
英語でも形態素解析という言葉は使われますが、中心になる作業が違います。英語の処理は空白で区切ったあと、「don’t」を「do」と「n’t」に分ける、文末のピリオドを切り離すといった調整を加えて語を確定します(spaCyのドキュメントのトークン化の説明)。そのうえで「running」を「run」に戻す原形化(lemmatization)、品詞の付与、数・時制などの語形の特徴の判定を行います。日本語の形態素解析は、空白という手がかり無しに区切りを決め、原形化と品詞付与まで1回の処理で行います。
形態素解析の仕組み:辞書・ラティス・コスト最小経路
現在よく使われるMeCabやSudachiは、辞書とコストを使う方式で区切りを決めます。処理は次の3段階です。
辞書引きによる区切り候補(ラティス)の作成
解析器はまず、文の各位置から始まる語を辞書で全て引きます。「外国人参政権」なら「外国」「外」「国」「人参」「人」「参政」「政権」「権」などが候補になり、それらを文頭から文末までつないだ網目ができます。この網目をラティス(lattice)と呼びます。辞書に載っていない語は、文字の種類(漢字・カタカナなど)から候補を作ります。これが未知語処理です。
生起コストと連接コストの合計による最小経路の選択
辞書の各語には「その語の出にくさ」を表す生起コストがあり、品詞の組み合わせごとに「その順に並びにくさ」を表す連接コストがあります。解析器はラティスの中で、両方のコストを足した合計が最も小さい経路をビタビ(Viterbi)アルゴリズムで探し、それを答えにします。MeCabはこのコストを人手ではなく、正解付きのコーパスから条件付き確率場(CRF)で学習しています(MeCab公式サイトの比較表では、JUMANはコストを人手で設定し、KAKASIはコストの概念がない最長一致と整理されています)。
MeCab 0.996とIPAdicで、「外国人参政権」の各経路のコストを出力させた結果が次の表です。
| 経路 | 各語の生起コスト | 生起コスト計 | 連接コスト計 | 合計 | 順位 |
|---|---|---|---|---|---|
| 外国/人参/政権 | 2306・5671・3719 | 11,696 | −732 | 10,964 | 1位(採用) |
| 外国/人/参政/権 | 2306・8979・3343・8697 | 23,325 | −10,923 | 12,402 | 2位 |
連接コスト計は文頭・文末とのつながりを含む値です。正しい区切りの「外国/人/参政/権」は、「人」(8979)と「権」(8697)の生起コストが大きく、生起コスト計が23,325になります。名詞に接尾辞が続く並びは連接コストが大きくマイナスになり差は10,923縮まりますが、合計12,402で1位の10,964に届きませんでした。語の数そのものではなく、2種類のコストの合計で順位が決まります。IPAdicには「外国人」「参政権」が1語として載っていないため、2位の経路も正解の「外国人/参政権」にはなりません。2位まで見たいときは -N2 を付けて実行します。
echo 外国人参政権 | mecab -N2 -F'%m ' -E' EOS\n'
外国 人参 政権 EOS
外国 人 参政 権 EOS
選んだ経路の品詞・原形・読みの出力
経路が決まると、選ばれた語の辞書項目に書かれた品詞・活用・原形・読みがそのまま出力されます。品詞の体系も辞書が決めるので、IPAdicとUniDicでは列の数も品詞名も違います。辞書を差し替えると、分割だけでなく後段の集計コードが読む列まで変わる点に注意が必要です。MeCabの辞書ごとの出力の違いはMeCab(めかぶ)とは?インストールと使い方、辞書の選び方をPythonの実行結果で解説で実行結果つきで扱っています。
形態素解析の具体例:辞書と解析器による分割結果の違い
形態素解析の例として定番の「すもももももももものうち」は、試した解析器が全て「すもも/も/もも/も/もも/の/うち」と同じ答えを返しました。定番の例文では差が出ないので、ツールの違いはわかりません。差が出るのは、複合語と固有名詞です。2026年10月28日に、同じ文を次の解析器に通した結果を並べます。
| 解析器(辞書) | 外国人参政権 | 関西国際空港に行きました | 東京都庁で形態素解析を試した |
|---|---|---|---|
| MeCab(IPAdic) | 外国/人参/政権 | 関西国際空港/に/行き/まし/た | 東京/都庁/で/形態素/解析/を/試し/た |
| MeCab(unidic-lite) | 外国/人参/政権 | 関西/国際/空港/に/行き/まし/た | 東京/都庁/で/形態/素/解析/を/試し/た |
| Janome | 外国/人参/政権 | 関西国際空港/に/行き/まし/た | 東京/都庁/で/形態素/解析/を/試し/た |
| Sudachi Aモード | 外国/人/参政/権 | 関西/国際/空港/に/行き/まし/た | 東京/都庁/で/形態/素/解析/を/試し/た |
| Sudachi Bモード | 外国人/参政権 | 関西/国際/空港/に/行き/まし/た | 東京/都庁/で/形態素/解析/を/試し/た |
| Sudachi Cモード | 外国人参政権 | 関西国際空港/に/行き/まし/た | 東京都庁/で/形態素/解析/を/試し/た |
使った版は mecab-python3 1.0.12、ipadic 1.0.0(IPAdic 2.7.0)、unidic-lite 1.0.8、Janome 0.5.0、SudachiPy 0.7.0とsudachidict-core 20261015です。表から読み取れることは3つあります。
「外国人参政権」の誤分割と辞書の収録語・コストの関係
IPAdic・unidic-lite・Janome(IPAdic相当の辞書を内蔵)の3つは、そろって「外国/人参/政権」と分けました。辞書に「外国人」「参政権」が1語として載っていないので、正しい区切りは1文字の「人」「権」を含む4語の経路でしか作れず、前章のコスト計算で「人参」を含む経路に負けるためです。この誤分割のまま単語を数えると、政治の記事の頻出語に「人参」が入ります。固有名詞や新語の多いテキストでは、ユーザー辞書への追加か、収録語の多い辞書への切り替えが必要になります。
用途で選ぶ区切りの粒度(短単位・長単位)
Sudachiの3モードは、どれも誤りではありません。SudachiのREADMEは、Aモードを「UniDic 短単位相当」、Cモードを「固有表現相当」、Bを両者の中間の単位と説明しています。unidic-liteが「形態素」を「形態/素」、「関西国際空港」を3語に分けたのも、UniDicが国立国語研究所の定める短単位で区切る辞書だからです(UniDicの配布サイトは「国語研短単位自動解析用辞書」と名乗り、2025年12月31日にver.2025.12を公開しています)。
粒度は用途で選びます。検索の索引なら短い単位のほうが部分一致で拾いやすく、「空港」で「関西国際空港」も見つかります。固有名詞を1語として数えたい集計なら長い単位が向きます。「どの解析器が正確か」より先に、「どの長さで区切りたいか」を決めると選択を誤りません。
同じ結果を手元で再現するコード
表の「外国人参政権」の行は、次のコードで再現できます。macOS・Linux・Windows(64bit)向けのwheelにMeCabのライブラリが含まれるので、MeCab本体を別にインストールする必要はありません。Windowsだけは、mecab-python3のREADMEのとおりMicrosoft Visual C++ 再頒布可能パッケージが要ります。SudachiPyの0.7系は配布元が「パッチ版の間でも互換性が壊れうるので版を固定せよ」と注意しているため、上の例では実測に使った版を固定しています。
python -m pip install mecab-python3==1.0.12 ipadic==1.0.0 unidic-lite==1.0.8 sudachipy==0.7.0 sudachidict_core==20261015
import MeCab, ipadic, unidic_lite
from sudachipy import Dictionary, SplitMode
text = "外国人参政権"
ip = MeCab.Tagger(ipadic.MECAB_ARGS + " -Owakati")
ud = MeCab.Tagger("-d " + unidic_lite.DICDIR + " -Owakati")
print("IPAdic :", ip.parse(text).split())
print("UniDic :", ud.parse(text).split())
tz = Dictionary(dict="core").tokenizer()
for name, mode in [("A", SplitMode.A), ("B", SplitMode.B), ("C", SplitMode.C)]:
print("Sudachi" + name + ":", [m.surface() for m in tz.tokenize(text, mode)])
IPAdic : ['外国', '人参', '政権']
UniDic : ['外国', '人参', '政権']
SudachiA: ['外国', '人', '参政', '権']
SudachiB: ['外国人', '参政権']
SudachiC: ['外国人参政権']
SudachiPy 0.7.0では Dictionary.create() が非推奨になり、tokenizer() を使います。古い解説記事のコードをそのまま動かすと警告が出ます。
形態素解析の用途:検索・テキストマイニング・文章の点検
形態素解析の結果は、単語を数える・照合する・重みを付ける処理の材料になります。主な使われ方は次のとおりです。
- 検索エンジンの索引:文書を形態素に分けて索引を作り、検索語も同じ規則で分けて照合します。Elasticsearchのkuromojiも形態素解析器です。辞書に無い語の取りこぼしを防ぐため、文字単位のn-gramと併用する構成もとられます(Elasticsearchの日本語全文検索|kuromojiのanalyzer構成と辞書追加、N-gram併用の判断)。
- テキストマイニング:アンケートの自由回答や問い合わせを原形で数え、頻出語や共起を出します。分析の全体の流れはテキストマイニングとは?手法・やり方・無料ツールから企業の導入判断まで解説にまとめています。
- 文書の特徴づけ:語ごとの出現数からTF-IDFなどの重みを計算し、似た文書の検索や分類に使います。
- 文章の点検:SEOのキーワード出現率のように語の割合を測る場合も、どこで区切るかで数値が変わります。区切り方で結果がぶれる例はキーワード出現率とは?計算方法と目安の根拠をGoogle公式の記述から整理で扱っています。
かな漢字変換や読み上げ(音声合成)の読み付けにも、同じ辞書と区切りの技術が使われています。
形態素解析・構文解析・意味解析・文脈解析の違い
自然言語処理では、文の解析を段階に分けて考えます。形態素解析はその最初の段階で、後ろの段階は形態素解析の結果を入力にします。
| 段階 | 決めること | 「黒い髪の女の子」での例 |
|---|---|---|
| 形態素解析 | 区切りと品詞 | 黒い/髪/の/女の子 |
| 構文解析 | 語のかかり方 | 「黒い」が「髪」と「女の子」のどちらにかかるか |
| 意味解析 | 語と文の意味 | 髪が黒いのか、女の子が黒い服を着ているのか |
| 文脈解析 | 文をまたぐ関係 | 次の文の「彼女」がこの女の子を指すか |
形態素解析だけでは、「黒い」がどこにかかるかは決まりません。係り受けまで必要なら、CaboChaやKNP、GiNZA(spaCyの日本語モデル)など構文解析まで行うツールを使います。一方で、単語の頻度を数える・検索するだけなら、形態素解析の段階で十分です。
生成AI(LLM)のトークナイザーと形態素解析の違い
ChatGPTなどのLLMも入力文を「トークン」に区切りますが、その区切りは形態素とは別物です。OpenAIのトークナイザーライブラリ tiktoken 0.14.0 で、GPT-4oやGPT-5に割り当てられている o200k_base(gpt-oss向けは別の o200k_harmony)を使い、表と同じ文を区切った結果が次のとおりです。
| 文 | o200k_baseの区切り | トークン数 |
|---|---|---|
| 外国人参政権 | 外国/人/参/政/(「権」の前半バイト)/(後半バイト) | 6 |
| 東京都庁で形態素解析を試した | 東京都/(「庁」の前半)/(後半)/で/形/態/素/解析/を/試/した | 11 |
| 食べました | 食/べ/ました | 3 |
「権」「庁」は1文字が2つのトークンに割れ、単独では文字として読めない断片になりました。「東京都」は1トークンで「庁」だけが離れ、「ました」は助動詞2つが1つにまとまっています。トークナイザーは学習データ中の出現頻度で区切りを決めるため、語の境界にも品詞にも沿いません。品詞や原形も返しません。
このため、LLMに文章を渡すだけなら形態素解析は要りません。一方で、原形にそろえて「どの語が何回出たか」を数える、品詞で名詞だけを取り出す、単語の単位で検索の索引を作るといった処理には、形態素解析の出力が必要です。辞書と解析器の版を固定すれば同じ区切りと品詞が再現できるので、集計結果を後から検証できます。BPEなどトークナイザーの方式の違いはトークナイザーとは?BPE・WordPiece・Unigramの違いと日本語での実装判断を解説【2026年版】で詳しく扱っています。
形態素解析ツールの選び方
ツールは「区切りの粒度」「辞書の更新状況」「導入の手間」の3点で選びます。ここでは選び分けの軸だけを示し、インストール手順と速度の比較は形態素解析ツール比較|MeCabとSudachiの違い、JUMAN++・GiNZA・Janome・Webツールの選び方に譲ります。
| ツール | 向いている用途 | 注意点 |
|---|---|---|
| MeCab | 大量テキストを速く処理する | 本体は0.996(2013年)から更新なし |
| Sudachi | 粒度を用途で切り替える | SudachiPy 0.7で辞書形式が変更 |
| Janome | pipだけで手早く試す | 純Python実装でMeCabより低速 |
| JUMAN++ | 文脈を見た高精度な解析 | 配布モデルが大きい |
| Web茶まめ | インストールせずに試す | 入力サイズに上限あり |
迷ったときの初手はSudachiのBモードです。固有名詞をある程度まとめつつ、短すぎない単位で区切るので、集計にも検索にも使えます。速度が問題になってからMeCabを検討しても遅くありません。
よくある質問
形態素解析とは簡単に言うと何ですか?
文を意味のある最小の単位に区切り、それぞれに品詞・原形・読みを付ける処理です。「食べました」を「食べ(動詞)/まし(助動詞)/た(助動詞)」に分けるのが一例です。
「形態素分析」や「形態要素解析」は形態素解析と違うものですか?
どちらも同じ処理を指します。正式な用語は「形態素解析」で、「形態素分析」は言い換え、「形態要素解析」は言い間違いです。
無料で使える形態素解析ツールはありますか?
MeCab・Sudachi・Janome・JUMAN++はいずれも無料のオープンソースです。インストールせずに試すなら、国立国語研究所のWeb茶まめがブラウザで使えます。
Pythonで形態素解析を試す一番手軽な方法は?
pip install sudachipy sudachidict_core か pip install mecab-python3 unidic-lite の1行で入ります。wheelが配布されている環境(macOS・Linux・64bit Windows)なら、ほかのソフトウェアは要りません。Windowsでmecab-python3を使う場合だけ、Microsoft Visual C++ 再頒布可能パッケージを入れます。
生成AIがあれば形態素解析は不要ですか?
LLMに文章を渡すだけなら不要です。原形で単語の出現回数を数える、品詞で語を絞る、単語の単位で検索の索引を作るといった用途では、今も形態素解析を使います。LLMのトークンは語の境界に沿わず、品詞も原形も返さないためです。