実践型AIプログラミング特講#19

実践型AIプログラミング特講#19

今回の記事では文章を単語ベースに機械学習によって区切る手法をお伝えしたいと思います。まず、文字認識においてアルゴリズムは一文字あたりの認識に関して言えば人間と同等の精度を誇っていますが、文字の認識に関して言えば新生児並でどこが単語の区切りになっているのか判読することができません。なのでデータの前処理としてこの点もクリアしておくことでより汎用性かつ普遍的なアルゴリズムの構築が皆様でもできるようになるはずです。これを機にマスターしてみましょう。

前回の記事(言語判別の方法)はこちらです。

文章を単語に分割してみよう

自然言語処理を行う上で、欠かせない技術である形態素解析(文章を単語に分割する手法)について紹介します。形態素解析について形態素解析(morphological analysis)とは、対象言語の文法辞書や、単語辞書(品詞情報などが付与された単語一覧)に基づいて、意味を持つ最小単位(形態素)に文章を分割し、各形態素に品詞情報などを付与することです。形態素解析は、さまざまな分野で用いられており、自然言語処理を利用した機械学習を行う上でも、欠かせない技術となっています。英語における形態素解析は、それほど難しいものではありません。なぜなら、ほとんどの箇所で単語と単語の区切りが明確だからです。そのため、例外となる it’s や don’tなどの特定の単語を it is やdo not に変化させるという簡単なルールに従って変換すれば、容易に形態素に分解できます。しかし日本語は、単語と単語の区切りが明確ではないなど、複雑であるため、形態素解析を行うことが容易ではなく、さまざまな研究がなされてきました。そのおかげで、世のなかにはすでに多くの形態素解析のライブラリーが、オープンソースで公開されています。そこで本節では、代表的な日本語の形態素解析ライブラリーである「MeCab」と、MeCabと共に使う単語辞書で最近注目を集めている「mecab-ipadic-NEologd( メカブアイピーエーディックネオログディー)」を用いて形態素解析を行ってみましょう。

MeCab について

日本語の形態素解析を行うにあたり、多くの人が定番のツールとして思い浮かべるのが「MeCab」です。MeCab は Google 日本語入力の開発者の一人である工藤拓さんによって開発されました。MeCabという名前は、開発者の好物「和布燕(めかぶ)」から取られたそうです。MeCabはパラメーター推定にCRF(Conditional Random Fields)を用いており、解析精度が高く、実行速度も速いため、知名度が高く、さまざまな場面で利用されています。さらに、MeCab は、Javaなど、さまざまなプログラム言語からも利用でき、Python からも利用できます。

 MeCab の Web サイト

(URLThttps://taku910.github. i0/mecab/

それではさっそく、MeCab を利用して、簡単な形態素解析を行ってみましょう。まずは、Jupyter Notebook で新規ノートブックを作りましょう。画面右上の [New >Python 3] で新規ノートブックが作成できます。そして、以下のプログラムを記述しましょう。

import MeCab

# MeCab オブジェクトの生成(*1)

tagger = MeCab. Tagger()

# 形態素解析(*2)

result = tagger. parse(“メイが恋ダンスを踊っている。”)

print (result)

では、Jupyter Notebook からプログラムを実行してみましょう。1単語1行で表されており、各行のフォーマットは以下の通りです。

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3, 活用型,活用形,原形,読み,発音

それでは、プログラムを確認してみましょう。(※1)の部分では、MeCab.Tagger オブジェクトを生成しています。生成には、Tagger(0 コンストラクターを利用します。Tagger0 コンストラクターには、いくつかのオプションが用意されています。たとえば、「-Oオプション」を指定すると出カフォーマットを変更することもできます。具体的には、「Tagger(-Owakati’)」とすると、分かち書きされた結果を出力できます。(※2)の部分では、parse) メソッドを利用して、形態素解析をしています。parse) メソッドは、指定された文字列を形態素解析し、Tagger) コンストラクターで指定された出力フォーマットで結果を文字列で返します。このように、MeCab を利用すると、非常にシンプルな使い方で形態素解析ができます。MeCab は、形態素解析を行うにあたり、単語辞書を用いており、IPADIC(アイピーエーディック)やUniDic(ユニディック)という単語辞書がよく用いられます。しかし、IPADIC や UniDic は、現在ほぼ更新されていない状態のため、新しい単語が含まれていません。つまり、新しく若者の間で生まれた俗語や流行りのドラマなど当たり前のように使用される言語の齟齬が時々生じます。そこで、「mecab-ipadic-NEologd」という新しい単語に強い辞書を使ってみましょう。

mecab-ipadic-NEologd について

「mecab-ipadic-NEologd」は、新しい語や固有表現を追加することでIPADICを拡張した MeCab 用のシステム辞書で、以下のような特徴があります。

・辞書の更新を毎週 2回以上実施

・はてなキーワードのダンプデータやニュース記事など、Web 上の新しい言語資源から単語を抽出し、辞書を作成

そのため、mecab-ipadic-NEologd を使用することで、新しい単語に対応した解析を行うことができます。mecab-ipadic-NEologd を利用する方法については、オンラインマニュアルソースをご参照ください。ではさっそく「mecab-ipadic-NEologd」を利用して、形態素解析を行ってみましょう。先ほどのプログラムを以下のように変更しましょう。

import MeCab

# mecab-ipadic-NEologd 辞書を指定して、MeCab オブジェクトを生成 (*1)

tagger = MeCab.Tagger (“-d /var/lib/mecab/dic/mecab-ipadic-neologd”)

# 形態素解析

result =tagger. parse(“メイが恋ダンスを踊っている。”)

print (result)

では、Jupyter Notebook からプログラムを実行してみましょう。実行ボタンを押すと、結果が表示されます。表層形に「恋ダンス」が登場していますね。「恋ダンス」を1つの単語として解析することができました。それでは、プログラムを確認してみましょう。変更点は(※1)の部分のみです。(※1)の部分で「mecab-ipadic-NEologd」辞書を指定して MeCab オブジェクトを生成しています。MeCab で利用するシステム辞書を変更するには「-d オプション」を指定し、辞書ファイルが保存されているパスを指定します。詳細は割愛しますが、MeCab では、大きく分けて「システム辞書」と「ユーザー辞書」という2つの辞書が利用できます。システム辞書を変更したいときは「-dオプション」、ユーザー辞書を利用したいときは「-uオプション」を指定します。「mecab-ipadic-NEologd」はIDADIC を拡張した MeCab 用のシステム辞書なので、ここでは「-dオプション」を指定しています。

ストップワードを除去しよう

ストップワード(stop word)とは、あまりにも利用頻度が高い言葉であるために、処理対象外とする単語のことです。たとえば、助詞や助動詞など(「が」「の」「です」「ます」など)がそれに該当します。どのような場面で、ストップワードを除去する処理を利用できるのでしょうか。たとえば、形態素解析した結果を機械学習させて文章の意図を判定する場合、利用頻度が高いにも関わらず、意図の判定に利用できない単語は除外しておくほうが判定精度を向上できるでしょう。ストップワードの除去には、さまざまな方式がありますが、ここでは形態素解析結果の品詞情報を利用して除去してみましょう。先ほどのプログラムを以下のように変更しましょう。

import MeCab

tagger = MeCab. Tagger (“-d /var/lib/mecab/dic/mecab-ipadic-neologd”)

tagger.parse (“”)

# 形態素解析結果をリストで取得(* 1)

node =tagger. parseToNode(“メイが恋ダンスを踊っている。”)

result =[]

while node is not None:

# 品詞情報取得(*2)

hinshi = node.feature.split(“,”)[0]

hinshi in [“名詞”]:

# 表層形の取得(*3)

result.append (node.surface)

elif hinshi in [“動詞”,”形容詞”]:

# 形態素情報から原形情報を取得(*4)

result.append(node.feature.split(“,”) [6])

node = node.next

print (result)

 

 

では、Jupyter Notebook からプログラムを実行してみましょう。Run ボタンを押すと、以下のような結果が表示されます。

[メイ’,’恋ダンス’,’踊る’,’いる’]

「が」や「を」などのストップワードを除去できました。それでは、プログラムを確認してみましょう。(※1)の部分では、parseToNode()メソッドを利用して、形態素解析結果を取得しています。parse)メソッドは、結果が文字列で返されたのに対し、parseToNode) メソッドは、MeCab.Node クラスオプジェクトを返します。(※2)の部分では、feature() メソッドを利用して品詞情報を取得しています。feature() メソッドでは、単語の表層形以外の情報を文字列で取得できます。(※3)の部分では、品詞が名詞の場合に、surface) メソッドを利用して表層形を取得しています。(※4)の部分では、品詞が動詞や形容詞の場合に、feature) メソッドを利用して原形情報を取得しています。品詞が動詞のや形容詞の場合、送り仮名などに違いが出るため、ストップワードの除去とは関係していませんが、原形を取得することで正規化をしています。このように、名詞、動詞、形容詞の場合のみ出力することで、ストップワードを除去できました。

改良のヒント

単語辞書として「mecab-ipadic-NEologd」を利用しましたが、業務で使う場合「mecab-ipadic-NEologd」にすら存在しない、会社特有の単語などを扱いたい場合もあるでしょう。そのような場合は、MeCab のシステム辞書やユーザー辞書に自分で単語を追加することで対応できます。また、動詞や形容詞の場合に、原形を取得する単語の正規化をしています。加えて、形態素解析を行う前に、利用する辞書に応じた単語の正規化処理(全角/半角や大文字小文字などの文字種の統一、英語表記とカタカナ表記の統一など)を行い、つづりや表記ゆれを吸収することにより、形態素解析の精度と機械学習の判定精度を向上することが可能になるでしょう。

この節のまとめ

・日本語の文章解析をするには「形態素解析」を行う必要がある

・「MeCab」を利用すると、Python で日本語の形態素解析を手軽に行うことができる

・「mecab-ipadic-NEologd」を利用することで、新しい単語に対応した解析を行える

・ストップワードを除去することで判定精度を向上できる

・文字列の正規化処理をすることでも判定精度を向上できる

 

 

 

プログラミングカテゴリの最新記事