書籍「15Stepで踏破 自然言語処理アプリケーション開発入門」をやってみる - 2章Step03メモ「形態素解析とわかち書き」


内容

15stepで踏破 自然言語処理アプリケーション入門 を読み進めていくにあたっての自分用のメモです。
今回は2章Step03で、自分なりのポイントをメモります。

準備

  • 個人用MacPC:MacOS Mojave バージョン10.14.6
  • docker version:Client, Server共にバージョン19.03.2

章の概要

MeCabの動作を理解し、チューニングしてみる。
また、MeCab以外の形態素解析器についても確認する。

03.1 MeCab

辞書

MeCabによるわかち書きは、辞書に基づいて行われる。
辞書にはMeCabを使った形態素解析から得られる情報は、辞書にどのような情報が登録されているかに依存し、辞書によって登録されている情報が異なる。

辞書名 内容
IPAdic ・MeCabが公式に推奨している辞書
・IPAコーパスというデータに基づく
UniDic ・UniDicというデータに基づく
・分割される単位が小さく、厳密な「形態素解析」に近い
jumandic ・MeCabとは別のJUMANという形態素解析器で使われている辞書のMeCab移植
・京都コーパスというデータに基づく
・代表表記などのメタ情報が付与されている
ipadic-NEologd ・IPA辞書を元に、単語の数を大幅に拡張
・インターネットから単語をクローリングして語彙を頻繁に拡張しており、新語への対応力がとても高い
正規化を前処理として行うことが推奨されている
unidic-NEologd ・ipadic-NEologd同様、UniDicを元に単語拡張を施した辞書

ipadic-NEologdのインストールと実行

IPAdicとipadic-NEologdの違いとしては、例えば「Deep Learning」(割と新しい単語)という単語の解析が異なる。

  • IPAdic:「Deep」と「Learning」で分割される
  • ipadic-NEologd:「Deep Learning」の1単語で扱われる

MeCabの形態素解析の動作

辞書が保持しているのは実行結果のような形態素に関する情報だけでなく、下記の様々な情報を保持している。

  • 各単語の生起コスト
  • 各単語の左文脈ID
  • 各単語の右文脈ID
  • 文脈IDの各組み合わせの連接コスト

与えられた文章に対して、生起コストと連接コストの組み合わせが最小になる組み合わせを解析結果とする。(下記の例では「東大阪 大好き」と分割した際のコストが(最)小さいので、これが解析結果となる)

例)「東大阪大好き」
# 「東大阪 大好き」と分割する場合
文頭と「東大阪」の連接コスト
「東大阪」の生起コスト
「東大阪」と「大好き」の連接コスト
「大好き」の生起コスト
「大好き」と文末の連接コスト

# 「東大 阪大 好き」と分割する場合
文頭と「東大阪」の連接コスト
「東大」の生起コスト
「東大」と「阪大」の連接コスト
「阪大」の生起コスト
「阪大」と「好き」の連接コスト
「好き」の生起コスト
「大好き」と文末の連接コスト

03.2 MeCab辞書の改造

既存の辞書だけで期待した結果が得られない場合は、自分で辞書をチューニングする。

  • 新語の追加
  • 形態素解析の調整

MeCab辞書のビルド

# ソースファイルのエンコードをUTF-8に変換
$ nkf --overwrite -Ew ./mecab-ipadic-2.7.0-20070801/*

# 辞書をビルド
$ mkdir build
$ $(mecab-config --libexecdir)/mecab-dict-index -d ./mecab-ipadic-2.7.0-20070801 -o build -f utf8 -t utf8
$ cp mecab-ipadic-2.7.0-20070801/dicrc ./build/. # dicrcをコピー

nkfは「Network Kanji Filter」の略。

新語の追加

ソースファイルのディレクトリにcsvファイルを作成する
# 表層形、左文脈ID、右文脈ID、生起コスト、品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用型、活用形、原型、読み、発音

# 自然言語処理を追加したい場合
自然言語処理,1288,1288,0,名詞,固有名詞,一般,*,*,*,しぜんげんごしょり,シゼンゲンゴショリ,シゼンゲンゴショリ

形態素解析の調整

  1. 連接コストを調整する
    1. .csvから対象単語の文脈IDを探す
    2. matrix.defで対象文脈IDの連接コストを修正する
  2. 生起コストを調整する
    1. .csvの対象単語の生起コストを修正する

ただし上記コストを修正する場合は、意図した部分以外の結果にも影響を与えかねないので注意する。

コストを自動調整する手法も用意されているようだが、修正したい部分のコストをピンポイントで手動で調整する方が、影響範囲を小さく抑えられる傾向がありそう。

03.3 様々な形態素解析器

MeCab以外の形態素解析器について概要を把握しておく。

形態素解析器 内容
MeCab ・辞書に基づく
・辞書には、単語と生起コスト、連接コストの情報が含まれる
・実行速度が速い
・辞書が外部ファイル化されているので、必要に応じてカスタマイズできる
JUMAN++ ・ニューラルネットワークを利用した比較的新しい形態素解析器
・文法的な正しさだけでなく、単語の意味を考慮
・ある語の前にある全ての語の情報を考慮
・表記ゆれに対応
・MeCabより優れている点が多いが、実行速度は劣る
KyTea(キューティー) ・ある文字と次の文字の間が単語の区切りであるかどうかを、その前後数文字を元にSVMで予測する
・Pythonラッパーがサードパーティから提供されている
Janome ・Pythonのみで書かれている
・IPA辞書が組み込まれていたり、Pythonから扱えるAPIが提供されている
・実行速度が遅い
・辞書の選択肢が限定される
SudachiPy ・Java用形態素解析SudachiのPythonバインディング
・2019年5月時点では正式リリースはま(もう正式リリースされた?)
Esanpy(Kuromoji) ・KuromojiはJavaで実装された形態素解析器
・Pythonから使う場合、Esanpyを通す
・EsanpyはElasticsearch(全文検索エンジン)を内部で利用するテキスト解析ライブラリ