自然言語処理の核である形態素解析
自然言語処理の核である形態素解析
前回の投稿では検索エンジンの仕組みに関して、実世界の図書館を例にしながら説明を行いました。検索エンジンは(主に)以下の3つのパートから構成され、それらは図書館の機能とは以下のように結びつくことを説明しました。
- インデックス:図書館の本棚に相当
- 検索クエリ:図書館の利用者が欲しい本を探す作業に相当
- 検索ランキング:図書館の利用者が読みたい本を絞り込む作業に相当
この一連の作業の中で、自然言語処理(自然言語理解)が使用されている事については解説を行い、その中で、ユーザが入力する検索キーワードより、ユーザが望むドキュメントを返却する部分で全文検索技術が使用されている事を説明しました。今回は全文検索の仕組みをより掘り下げて解説を行い、その中で形態素解析が果たす役割について解説を行います。
形態素解析(分かち書き)
いきなり形態素解析という聞き慣れない言葉が登場しました。これが全文検索の要だと紹介されても、何の事やら訳が分からないかと思います。以下が日本語Wikipediaの「形態素」に関する解説になります。
形態素(けいたいそ、英: morpheme)とは、言語学の用語で、意味をもつ表現要素の最小単位。ある言語においてそれ以上分解したら意味をなさなくなるところまで分割して抽出された、音素のまとまりの1つ1つを指す。
※日本語Wikipediaより引用
これを読んでもイメージがしにくいですね。。。「意味を持つ表現要素の最小単位」とは一体何を指しているのでしょうか?こういった場合、具体例を解説していくとわかりやすいので、以下に具体例を解説していきます。以下の文章を読んで下さい
- 私はプログラマーです
上記の文章は通常の日本語話者であれば問題なく理解できるかと思います。これを上述のWikipediaの引用の例に当てはめて、形態素について考えてみたいと思います。形態素について考えるという事は、「意味を持つ表現要素の最小単位」について考える事と同義です。改めて上記の「私はプログラマーです」という文章を見ていくと、以下の言葉はそれ単体で意味が伝わるかと思います。
- 私
- プログラマー
上記の「私」「プログラマー」は文章ではなく、名詞の単語です。このように、自然言語処理における形態素とは、文章の最小単位である単語を指し、文章を形態素に分割する処理を形態素解析(分かち書き)と呼びます。最終的に上記の「私はプログラマーです」という文章を形態素解析すると以下のように分割されます。
- 私(名詞)|は(助詞)|プログラマー(名詞)|です(助動詞)
上記が形態素解析の結果となりますが、見て頂くとわかるかと思いますが、文章が品詞単位の単語に分割されていきます。つまり、別の言い方で形態素解析を説明すると、文章を品詞単位の単語に分割する作業となります。これでようやく形態素解析とは何かが把握できたのでは無いでしょうか?
この形態素解析という技術は、全文検索の要の技術としてでなく、自然言語処理(自然言語理解)全般の最も重要なファンデーションにあたる技術です。形態素解析なくして、自然言語処理は語る事はできないので、しっかりご認識下さい。
全文検索における形態素解析の役割
それでは次に全文検索において形態素解析がどのような役割を果たしているかについて解説をします。その前に一度、全文検索の動作の仕組みについて復習をしてみましょう。「人工知能」というキーワードをユーザが入力した際に、ドキュメントのタイトル、及び本文のテキストに対して、どの位「人工知能」という言葉が含まれているか検索を行い、そのヒット数等でドキュメントの関連性を判断します。
「人工知能」の例では、形態素解析の有用性については理解が出来ないかと思いますが、例えば、「検索」に関するドキュメントを期待して、「全文検索」という検索キーワードを入力したとします。この際に、「全文検索」に完全一致する文字列を、ドキュメントのタイトル、及び本文のテキストに対して検索をすると、その言葉に完全一致するドキュメントしか拾うことができないため、「検索エンジン」「検索」「情報検索」等の言葉を含んだドキュメントは引っかからなくなります。
ユーザが「全文検索」という言葉でドキュメントを検索した場合でも、「検索エンジン」「検索」「情報検索」等の言葉を含んだドキュメントは関連性が強い可能性があるため、それらが引っ掛けられない事は大きな損失に繋がる可能性があります。そこで、検索のヒット率をあげるために形態素解析は使用されます。「全文検索」という文字列を形態素解析すると以下のように、「全文」と「検索」に別れます。
- 全文検索 → 全文|検索
ここまでお話をすると、もうお気づきかと思いますが、形態素解析を使用する事により、「全文検索」の代わりに「全文」と「検索」をそれぞれ検索キーワードとして使用します。そうなると、上述の例ではヒットしなかった、「検索エンジン」「検索」「情報検索」の単語が入っているドキュメントにも「検索」という言葉が部分一致するようになり、これらのドキュメントも検索結果に含まれる事になります。
このように、形態素解析は全文検索のヒット率をあげ、より多くのユーザの関心が強いドキュメントを返すのに役に立ちます。ただし、これは形態素解析の用途についてのほんの一例に過ぎず、冒頭でもお話をさせて頂いた通り、自然言語処理のあらゆるタスクの共通処理として、形態素解析は用いられるので、今後も要所要所で解説をしていきます。
形態素解析の仕組み
それでは形態素解析はどのような仕組みで動いているのでしょうか?この仕組の詳細を説明すると、非常に話が複雑になってしまうので、ここでは概略をわかりやすく解説したいと思います。
n-gram
もっともオーソドックスな方法として、n-gram法と呼ばれる方法があります。これはどのようなものかというと、文章の形態素解析を行う際に、決まった文字数で分割を行います。n-gramのnは文字数を表しており、n=2の時を「バイグラム」、n=3の時を「トリグラム」とも呼びます。以下は「私はプログラマーです」という文章を、n=2のバイグラムで分割した例です
- 私はプログラマーです → 私は|はプ|ログ|グラ|ラマ|マー|ーで|です
単純に文字列を与えられた文字数に従って分割しているだけなので、得られた形態素は殆どが意味をなしていないかと思います。これでは形態素解析の本来の目的である、意味の最小単位という目的からは外れていそうですね・・・
辞書ベース
それでは、意味のある形態素を抽出するための方法としてより有効な手法は何かというと、元の形態素(単語)を辞書として持っておき、その辞書に基づいて分割を行う方式で、これは、現在の日本語の形態素解析において主流の方法となっています。上記の文章を辞書ベースで形態素解析すると以下のようになります。この方法だと、「私」「プログラマー」のように意味のある形態素(単語)が抽出されます。
- 私はプログラマーです → 私|は|プログラマー|です
ただし、辞書の内容によっては、「デスク」「デスクトップ」のように、単語の一部がオーバーラップしたりする事もよくあるので、この場合は前後の文脈を判断して形態素解析を行います。以下の場合は後ろにある「コンピュータ」という言葉を手がかりに、「デスク」ではなく「デスクトップ」を形態素として分割しています。
- デスクトップのコンピュータ → デスクトップ|の|コンピュータ
このように、辞書ベースは文章の前後の文脈までを加味し、高いレベルで形態素解析を達成できるのですが、前後の文脈もなく、また平仮名、もしくはカタカナだけで構成されるような文章に対しては上手く動作しない場合があります。以下は形態素解析を悩ませる有名な例です。
- ここではきものをぬげ
上記の文章を形態素解析すると以下の二通りの解釈が可能なのでは無いでしょうか?
- ここで|はきもの|を|ぬげ
- ここでは|きもの|を|ぬげ
正直どちらも正解な気がします。この文章が漢字で書いてあれば形態素解析は容易なのですが、そうでない場合、判断にすべき材料が無いため、形態素解析があまり動く動作しない場合もあります。上記の文章は人間が見ても判断に迷う内容かと思います。
まとめ
形態素解析を行う方法として、n-gramと辞書ベースの例を説明しました。大抵の場合は辞書ベースを採用すればよいと思いますが、辞書ベースの場合、元の辞書に依存しすぎてしまう事があるため、まれに形態素を取りこぼす時もあるので、全ての形態素を残さず抽出したいという時はn-gramを使うことも有効に働く事もありますが、n-gramは非常に実行速度が大きいため、あまり乱用する事はおすすめできません。
代表的な形態素解析器の例
自然言語処理のあらゆるタスクで使用される形態素解析技術ですが、形態素解析を行うためのツールを形態素解析器といい、世の中には多くの形態素解析器が存在し、またその多くのものが無料で使用できます。以下に代表的な日本語の形態素解析器を紹介します。
MeCab
作成者の工藤先生が、めかぶが大の好物であったというところから命名されたようですが、もはや日本語の形態素解析器のデファクト・スタンダードとなっています。とにかく高速でさくさく動作し、十分に高い精度で形態素解析を行えます。日本語の形態素解析器と言えばMeCabと言われる位、有名な形態素解析器なので名前を覚えておくと良いでしょう
Sudachi
Elasticsearchという、オープンソースの検索エンジンのフレームワークで採用されている評判の良い形態素解析器です。形態素解析に使用される辞書が新しいという点と、形態素解析の挙動をモードとして選択する事ができ、より全文検索を行うのに相応しい形態素解析器という事ができます。
Janome
Janome=蛇の目という事で、勘の良い方であればピンときたかもしれませんが(そもそもノンプログラマーにはわからないか・・・)、Pythonというプログラミング言語専用の形態素解析器です。Python上で形態素解析器を実行する場合にはとても便利です。
まとめ
自然言語処理の全てのタスクの出発点である形態素解析について解説を行い、特に全文検索でどのように形態素解析が活用できるかの例についてお話をし、また形態素解析の仕組みとして、n-gramと辞書ベースがあることについて説明を行いました。
また、MeCab、Sudachi、Janomeといった代表的な形態素解析器について紹介をさせて頂きましたので、機会がありましたら是非触ってみて下さい。次回は、引き続き全文検索を例に、同義語拡張や、原型化等、より踏み込んだ自然言語処理の基礎の内容の解説を行いたいと思います。