YoJlのポケット

勉強したことや学んだことを記録しています。

構文解析とは?

構文解析とは?

自然言語処理の根っことなる技術として構文解析というものがあります。

1. 構文解析の定義

文章を自然言語であれば、形態素(意味を持つ最小単位、平たく言うと「単語」)ごとに切り分け、
さらに、形態素の間の関連(修飾-被修飾など)を図式化などすることによって、
文章を明確にする(解析する)手続きのことです。

2. 形態素解析と字句解析(Tokenize)

構文解析を細かく分けると、形態素解析字句解析(Tokenize)に分けられます。
ちなみに、字句解析は一般的にTokenize(トークン化)と呼ばれています。
形態素解析字句解析(Tokenize)の違いは、簡単に言うと、対象言語解析方法です。
以下で、理論的な違いと代表的な手法を挙げて説明します。
一方で、実際では、形態素解析と字句解析は同じように扱われている傾向も見られます。

3. 形態素解析

形態素解析とは、自然言語を、辞書やコーパス(corpus)などを用いて、形態素の間の関係や活用などを学習して、文章を解析します。

また、形態素解析をしてくれる代表的なものとして、 MeCabChasen、JUMAN、KAKASHIがあります。
ちなみに、最も高速で精度が良いのは「MeCab」なので、
インターネット上には「MeCab」の実装方法がたくさんあります。

MeCab形態素解析の方法については、
日本語形態素解析の裏側を覗く!MeCabはどのように形態素解析しているのか
というものがとても分かりやすいです。
簡単に言うと、MeCabは、 辞書を用いて考えられるすべての方法で文章を分割します。
そして、コーパスを用いて、どの分割の方法が最も妥当なのかを計算し、解析結果を出力する、というものです。
また、未知語に対しては、カタカナかアルファベットかなどで区切っているそうです。

4. 字句解析(Tokenizer)

字句解析(Tokenize)とは、厳密にはプログラミング言語などの形式言語を、形態素解析よりも機械的に解析します。
「厳密には」と言った理由は、自然言語処理でもTokenizeという言葉が用いられているためです。
日本語の字句解析と英語のTokenizeの意味の差なのでしょうか、、、
無理に定義するとするなら以下のようになります。
字句解析(Tokenize)とは、形態素解析のような複雑なことはせず機械的に解析する手法のこと。ただし、文脈によって対象言語は異なる。

また、代表的な手法にSentencepieceというものがあります。 Sentencepieceとは、 単語の辞書を基に、コーパスを単語に分割し、各単語の頻度を求めます。
次に、高頻度で出現する単語は1語として扱い、低頻度で出現する単語は、より短い単語に分割します。
そして、語の数が事前に指定した数になるまで分割します。 これにより、未知語をなくすことを可能にしています。
しかし、品詞等は無視しているため、 「足利義満」が「足利義 満」となってしまうこともあります。

実はこの未知語自然言語処理では厄介だったりします、、、なので、それを補ったSentencepieceは素晴らしいと言えば、素晴らしい、、、

以上が構文解析(形態素解析と字句解析)とMeCabとSentencepieceでした!

p.s. デュラム小麦で作ったチャバタという未知語が2つもある謎のパンを食べました。 香ばしくて永遠に食べていられる...


参考文献
構文解析 (wiki)
日本語形態素解析の裏側を覗く!MeCab はどのように形態素解析しているか
SentencePieceについて書いてみる。