自然言語処理の形態素解析について調べたまとめ

公開:2020/11/15
更新:2020/11/16
7 min読了の目安(約7100字TECH技術記事

形態素解析について調べたのでまとめました。

形態素解析とは

Wiki 形態素解析

  • 形態素(けいたいそ)とはおおまかにいえば、言語で意味を持つ最小単位。

  • 文法的な情報の注記の無い自然言語のテキストデータから、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素の列に分割し、それぞれの形態素の品詞等を判別する作業である。

  • 自然言語処理の分野における主要なテーマのひとつであり、機械翻訳やかな漢字変換など応用も多い。

使用イメージ1 文書分類、機械翻訳(リンク先スライド P12~21)

  • 文書中の文章を形態素解析で分解してタグ付けし、文書を分類

  • 文章を形態素解析で分解して翻訳

使用イメージ2 形態素解析、bowによるベクトル化

  • '私達はラーメンがとても大好きです。'

  • '私達は蕎麦がとても大好きです。'

  • 上記二つの文章を bag of the words によるベクトル化をすると以下のようになります。

[[1 1 1 0]
 [0 1 1 1]]
  • それぞれの順番は以下のとおり。
['ラーメン', '大好き', '私達', '蕎麦']

英語の形態素解析

  • 英語の文は日本語とは異なり、予め単語と単語の区切りがほとんどの箇所で明確に示されます。

  • このため、単語分割の処理は日本語の場合ほど複雑である必要はなく、簡単なルールに基づく場合が多いです。

「It's a gift for Mr. Smith.」を形態素解析

分解

it / 's / a / gift / for / mr. / smith / .

形態素解析

文字列 品詞の種類 原形
it PRP(人称代名詞) it
's VBZ(動詞/三単現) be
a DT(冠詞) a
gift NN(名詞/単数) gift
for IN(前置詞) for
mr. NNP(固有名詞/単数) mr.
smith NNP(固有名詞/単数) smith
  • スペースで分解するだけで英文は形態素解析がおおむね可能

  • "'s" や "." が分解できない

  • NLTKなどの形態素解析ライブラリを使えば "'s" や "." も分解可能

コード 英語の形態素解析

str.split()を使って空白で形態素解析

"It's a gift for Mr. Smith.".split(" ")

出力

["It's", 'a', 'gift', 'for', 'Mr.', 'Smith.']

英語の形態素解析ライブラリ NLTK

NLTKの使い方をいろいろ調べてみた

import nltk
s = "It's a gift for Mr. Smith."
morph = nltk.word_tokenize(s)
print(morph)

出力

['It', "'s", 'a', 'gift', 'for', 'Mr.', 'Smith', '.']

日本語の代表的な形態素解析

  • 英語の場合と異なり、文節を得るのが目的となることが多いです。

  • 大まかに言えば文から切り出した単語が属する品詞を辞書データを用いて調べていき、結果得られた並びから正しく文節が構成される並びであるものを正解であるとするといったような方法を取ります。

  • 日本語文法では、たとえば、「ドアを開けるを」といったように、動詞のあとに格助詞がくることはできません。

  • ほとんどの付属語について「このようなものの後には付く」「このようなものの後には付かない」という規則性があり、また動詞の活用はその後に来る品詞を制限することがあります。

  • たとえば連体形の後は名詞となります。

  • ※中等教科明治文典(1904)〈芳賀矢一〉二 『死ぬる』は『死ぬる人』『死ぬる時』の如く体言の上につづく形なれば連体形といふ

  • このような性質を利用することによって単語の境界の判別を行います。

例)MeCab: Yet Another Part-of-Speech and Morphological Analyzer より

すもももももももものうち

文字列 品詞の種類 原形
すもも 名詞,一般, ,,,,すもも,スモモ,スモモ
助詞,係助詞, ,,,,も,モ,モ
もも 名詞,一般 ,,,,もも,モモ,モモ
助詞,係助詞 ,,,,も,モ,モ
もも 名詞,一般 ,,,,もも,モモ,モモ
助詞,連体化 ,,,,の,ノ,ノ
うち 名詞,非自立,副詞可能 ,,*,うち,ウチ,ウチ

日本語形態素解析ツール

  • Mecab

    • MeCabは 京都大学情報学研究科−日本電信電話株式会社(NTT)コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソースの形態素解析エンジン
  • Janome

    • Janomeは,Pure Python で書かれた,辞書内包の形態素解析器です。
    • 依存ライブラリなしで簡単にインストールでき,アプリケーションに組み込みやすいシンプルな API を備える形態素解析ライブラリを目指しています。
  • GiNZA

    • 日本語NLPライブラリGiNZAのすゝめ
      • GiNZA は 日本語の 自然言語処理ライブラリです。
      • もともと spaCy という自然言語処理のフレームワークがあり、英語など主要な言語に対応していました。 GiNZA は言わば spaCy の日本語対応版です。
  • JUMAN

    • 京都大学で開発されている。
    • 本システムは,計算機による日本語の解析の研究を目指す多くの研究者に共通に使える形態素解析ツールを提供するために開発されました。
    • その際, 学校文法が計算機向きではないという問題を考慮し,使用者によって文法の定義,単語間の接続関係の定義などを容易に変更できるように配慮しました。
  • Sudachi

    • ワークスアプリケーションズ徳島人工知能NLP研究所が開発した形態素解析器。
    • Sudachi は日本語形態素解析器です。形態素解析はおもに以下の3つの処理を おこないます。
      • テキスト分割
      • 品詞付与
      • 正規化処理
    • Sudachi は従来の形態素解析器とくらべ、以下のような特長があります。
      • 複数の分割単位の併用
        • 必要に応じて切り替え
        • 形態素解析と固有表現抽出の融合
      • 多数の収録語彙
        • UniDic と NEologd をベースに調整
      • 機能のプラグイン化
        • 文字正規化や未知語処理に機能追加が可能
      • 同義語辞書との連携
        • 後日公開予定
  • (参考)SentencePiece

    • SentencePieceは、主にニューラルネットワークベースのテキスト生成システム用の教師なしテキストトークン化およびデトークン化を行います。
    • ニューラルモデルのトレーニングの前に語彙サイズが事前に決定されています。
    • 生の文からの直接トレーニングします。
    • SentencePieceを使用すると、言語固有の前処理/後処理に依存しない、純粋にエンドツーエンドのシステムを作成できます。

日本語形態素解析ツールの比較

【サンプルコード有り】形態素解析をササッと試すならMecabよりもJanomeが良い感じ

2019年末版 形態素解析器の比較

  • Mecab

    • 必要な外部パッケージのインストール、ユーザー辞書の準備がそこそこ面倒。
  • Janome

    • pipのみでササッとインストールできます。
    • 速度に関してはMecabには劣ります。
  • GiNZA

    • MeCab・CaboCha等と比較してDocker等での環境構築が圧倒的に楽。
    • spaCyの豊富な機能セットを利用できます。
  • Sudachi

    • 商用利用に耐えうる高品質な解析性能を持つそうです。
    • 企業のバックアップのもと、辞書の継続的なメンテナンスが保証されています。
    • また、分割の長さをA単位(Unidic相当)、B単位(IPAdic相当)、C単位(NEologd相当)から選べます。
    • Unidicを採用していること、表記を正規化する機能があること、Elasticsearchプラグインが開発されているなど、検索システムでの利用が強く意識されているようです。
    • 公式によると、MeCabと精度は同じくらいで、速度はMeCabに劣るが、省メモリの工夫をしているそうです。

(補足)UniDic、IPAdic、NEologd

形態素解析(リンク先スライド P11~13)

  • UniDic

    • 国立国語研究書短単位。
    • かなり身近目の単位、学校文法に近い品詞体系。
    • 誰がタグ付けしも再現できるような定義。
    • 固有名詞が不足。
  • UPAdic

    • IPA品詞体系にもとづきます。
    • 学校文法に近い。
    • メンテナンスが止まっています。
  • NEologd

    • 固有名詞、複合名詞を1語として追加。
    • Webからシステムにより自動、半自動で語彙を収集しています。
  • JUMAN

    • 形態素解析器としてはMeCabの方が多機能
    • 依存構造などを解析できるKNPが使える
  • (参考)SentencePiece

    • SentencePiece 入門
      • 以前は、「MeCab」の形態素解析を使ってテキストを「単語」に分割するのが一般的でした。
      • しかし「単語」を使うのは実用上の問題点があります。
      • 語彙数が膨大になり、高頻度語彙のみに限定したとしても、低頻度語彙が捨てられ未知語として扱われることになります。
      • 「SentencePiece」では「サブワード」を使ってこの問題を解決しています。はじめに、テキストを単語に分割し、各単語の頻度を求めます。
      • 次に、高頻度単語は1語彙として扱い、低頻度単語はより短い語彙に分割します。
      • そして、語彙数が事前に指定した数になるまで、分割を繰り返します。
      • これによって、語彙数を小さくしつつ、未知語をなくすことを可能にしています。

各日本語形態素解析ツールの処理速度の比較

2019年末版 形態素解析器の比較(一部)

解析器 時間
MeCab 0.226s
JUMAN 3.661s
JUMAN++(v2) 6.706s
Sudachi 4.119s
SudachiPy 74.872s

各日本語形態素解析ツール(一部)の使い分け

  • mecab
    • 速度最優先のとき、IPAdicやNEologdを使いたいとき、係り受け解析器Cabochaを使いたいとき
  • JUMAN
    • JUMAN辞書を使いたいとき、KNPで依存構造などを(ほどほどの速度と精度で)解析したいとき
  • JUMAN++
    • 精度を優先したいとき、精度を気にしてKNPを使いたいとき
  • Sudachi
    • 検索システムに使いたいとき、表記正規化機能を使いたいとき、Unidicを使いたいとき
  • SudachiPy
    • GiNZA(spaCy)を使ってUD(単語単位の依存構造)解析したいとき、これを使うしかないので比較に入れました