見出し画像

自然言語処理の基本的なテクニック

はじめに

本投稿では、検索エンジンのヒット率をあげるという観点から、自然言語処理の基礎テクニックを紹介していきます。

ステミング(原型化)

ステム(stem)とは英語で幹の事を指します。自然言語処理の世界では、ステミングは動詞など複数の言い回しが存在する品詞の原型を取り出す事を意味します。

例えば『本を読みます』は、
『本を読んだ』『本を読む』『本を読みました』
色んな言い方がありますね。しかしいずれも共通しているのは『読む』ということです。

前回の記事でお話した形態素解析は、文章を分割してキーワードを細かくすることでヒット率を向上させますが、分割するだけでは

『読んだ』と書くと『読む』が検索結果に表示されなくなってしまうのです。

そこでステミングをかけて
『読んだ』『読み』『読む』は同意味だ!
と機械が認識出来るようにすることで、より関連項目が検索結果に表示されやすくなります。

では、形態素解析を用いて文章を形態素解析した例、ステミングを行った例をそれぞれ表示します。

元の文章: 本を読みます
形態素解析済:   本|を|読み|ます (品詞分け)
ステミング済:   本|を|読む|ます (動詞変換)

※形態素解析は、単語(品詞)ごとに言葉を分ける作業のこと

上記のようにドキュメント側も「本 読む」という変換がなされるので、検索キーワードでヒットするようになります。

ステミングとは、動詞や形容詞等の活用形の違いの差を吸収して、より多くのドキュメントをヒットさせるテクニックとして有益です。

また、ステミングはMeCabを始めとする、形態素解析器をデフォルトでサポートしています。

読みの取得

ステミングの機能と同様に、MeCabを始めとする、だいたいの形態素解析器はデフォルトで形態素の読みを返してくれます。

ようは「はな」「ハナ」「花」という形態素を同じ意味として認識するために必要なもので

「平仮名」「カタカナ」「漢字」と3つの記述法がある日本語独特の問題点に対して使えるテクニックです。

特に検索において、「平仮名」「カタカナ」「漢字」の表現の差は厄介で、先程の「花」という形態素も、場合に応じて「ハナ」とも「はな」とも表記される可能性があります。こういった日本語独特の特性が、日本語の自然言語処理の難易度を、多言語と比較しても非常に大きくしています。

上記のようなケースでは、読みの取得のテクニックを駆使すると、「平仮名」「カタカナ」「漢字」の間の表記の違いを吸収でき、検索のヒット率の向上に繋げられます。

また、他にも日本語特有の問題として、

「情勢」「状勢」

のような、(主に漢字二文字の)同音異義語の存在があります。また、同音異義語はスペルミスの主たる原因でもあるため、検索結果に『これも関連かも?』と出るのは、上記機能の特徴でもあり

この場合、ユーザが「情勢」についてのドキュメントを得たくて、「状勢」と検索キーワードを入力した場合、これらの読みを取得しておけば、対象のドキュメントをヒットさせる事が可能です。

類義語(同義語)拡張

類義語 (るいぎご) とは、同一言語において、語形は異なるが意味は互いによく似ており、場合によっては代替が可能となる二つ以上の語。類語ともいう[1]。同義語に等しい[2]。

上記が類義語(同義語)のWikipediaの説明ですが、簡単に言うと以下のように、ある単語を別の言い方で置き換えられる単語の事を指します。

「父」「父親」「パパ」
「母」「母親」「ママ」

こういった類義語は日本語では特に種類が多く、全文検索のヒット率を上げるためには、類義語(同義語)拡張はなくてはならない必須テクニックと言えます。では、検索を例にあげて説明します。以下の二文をご覧ください。

人工知能
AI

どちらもニュアンス的には全く同じ検索キーワードになりますが、仮に、全ての検索対象ドキュメントに「人工知能」という言葉は入っていても、「AI」という言葉が含まれていなかれば、全くヒットしない結果になってしまいます。

そこで、類義語(同義語)拡張という手法を用いて、「人工知能」という言葉が検索されたら、以下のように「AI」という言葉も検索対象にする等の工夫をします。これを行うと、どちらのキーワードも検索対象になるため、検索のヒット率を上げる事ができます。

人工知能 → 人工知能 + AI

通常、類義語(同義語)拡張は、それようの辞書を用意し、合致するキーワードが入力された時、その類義語にあたるもの全てを検索対象に拡張するように動作させます。

固有表現抽出

固有表現抽出(こゆうひょうげんちゅうしゅつ、英: named entity recognition、named entity identification、named entity chunking、named entity extraction)とは、計算機を用いた自然言語処理技術の一つであり、情報抽出の一分野である。文中から固有表現 (Named Entity) を抽出し、それを固有名詞(人名、組織名、地名など)や日付、時間表現、数量、金額、パーセンテージなどのあらかじめ定義された固有表現分類へと分類する。

※Wikipediaから引用

ようは入力された文章から固有表現なるものを抽出して、それを予め定義された分類に分類する事ですが、これだけではよくわからないと思うので、実例を示して行く事にします。それでは以下の文章を見て下さい。

株式会社MDIUの鈴木さんと柏の葉キャンパスに行く

※MDIUは筆者が代表を務める会社名
※柏の葉キャンパスは千葉の地名。何故この地名を選んだかは、後ほど分かります👌

では、上記例文から固有表現抽出を実行してみます。すると以下のようになります。

MDIU:組織名(会社名)
鈴木:人名
横浜:地名

上記のように、固有表現抽出では「組織名」「人名」「地名」等に該当する形態素(単語)を抽出して、それぞれを適切に分類します。

ではなぜ、このような事が必要なのでしょうか?上記の例を検索に照らし合わして考えると、それぞれ、メリットが見えてきます。

・「MDIU」は会社名だという事がわかるので、MDIU社に関するドキュメントを返そう
・「鈴木」は人名なので、鈴木さんに関係するドキュメントを返そう
・「横浜」は地名なので、横浜に関連するドキュメントを返そう

このように、検索が固有表現まで把握ができると、全文検索でより精度が高く、関連性の高い検索結果を表示することができます。また、固有表現抽出の特徴として

普通に形態素解析を行うと、「柏|の|葉|キャンパス」と地名の一部がそれぞれ分割されてしまうのですが、

固有表現抽出によってまとめて一つの地名として抽出をできるため、より関連性の高いドキュメントを検索可能になります。

自然言語処理の各種テクニックの限界

今まで、ステミング、読みの取得、類義語(同義語)拡張、固有表現抽出等、主に全文検索の精度を高めるために用いられる、代表的な自然言語処理のテクニックについて解説をしてきましたが、これらのアプローチ駆使しても、やはり機械の理解には限界があります。

具体的にどういった事かというと、

むやみにステミングや、読みの取得、類義語拡張等を多用してしまうと、本来意図しなかったドキュメントまで検索対象になる事があります。

この場合検索のヒット数は増加しても、検索の精度自体は低下してしまうという自体に陥ってしまう可能性があるのです。

実際に検索のヒット数が増加すると、検索の精度が減少する傾向にあり、逆もまた真なり。このような検索のヒット率と精度のバランス関係は、再現率(recall)と適合率(precision)という関係であらわされるのですが、こちらは別記事で詳細を紹介したいと思います。

まとめ

自然言語処理の基本的なテクニックとして、ステミング、読みの取得、類義語(同義語)拡張、固有表現抽出等の解説と

上記機能の使用によって生じる検索のヒット率と精度のバランス関係について説明をしました。

次回は、検索のヒット率と精度のバランス関係、どこを基準にするのがベストなのか?解説を行いたいと思います。

この記事が気に入ったらサポートをしてみませんか?