# Stay Homeな夏休みは形態素解析の勉強 その1
私はAlgoliaという会社でソリューションエンジニアという、Algoliaの導入の意思決定をしていただく際の技術的な支援やご提案をするような仕事をしています。
今まではJavaをベースにしたオープンソースの検索エンジンを使ってシステム構築をしたり、クラウド上でサービス化されたプロダクトの導入支援などをしてきましたが、Algoliaの検索エンジンはC++で構築されています。
そんな中で、達人出版会で購入したものの積ん読状態だった『形態素解析の理論と実装』という書籍を読もう読もうと思っていたわけなのですが、コロナな状況で外出が制限されるような事態となってしまったので、この時間を活用して読み進めていきたいと思います。
# 形態素解析の実装言語としてのC++
まえがきに👇が書かれていて、形態素解析と同時にC++も習得しなければいけないなと軽くプレッシャーを感じつつ読み進めていきます。笑
なお,本書では,形態素解析の実装言語として C++11 を採用しています. 形態素解析は,解析速度や効率的なメモリ使用の制限,利用可能なライブラ リの制約から,C あるいは C++で開発されることが多く,本書でもその慣習 に従います.
# 第1章 形態素解析の概要
語(単語,word)とは何か?
- 統語的な語 (syntactic word)(統語的な役割による定義)
- 音韻的な語 (phonological word)(アクセントやイントネーションのまとまりとしての定義)
- 正書法的な語 (orthographic word)(語の間に空白を挿入するといった,言語の正 書法で決まる定義)
→ 定義の明確さ,処理の簡易さから,英語等のヨーロッパ言語を対象とした自然言語処理では,正書法としての定義が一般的に用いられる
語は、自立語(内容語)と付属語(機能語)からなる
→ 自立語は独立した意味を持ち,名詞/動詞/形容詞/副詞など。付属語はそれ単体では意味を持たず、自立語と一緒に使われる文法的な機能を付加するもの。助詞/助動詞など。
音韻的に他の語の影響下にある語を接語と言う。日本語では、助詞/助動詞等が接語。例えば、『わたしは』の"は"。
形態素(morpheme)は語より小さく、意味を担う最小の単位。例えばはbooksだったら"book"と"s"。bookは単独で出現可能な自由形態素(free morpheme)だけど、sは単独では現れない拘束形態素(bound morpheme)。
語彙的な意味を持つ形態素を語根(root)と言い、逆にそれ単体では意味を持たない形態素を接辞(affix)と言う。
「高さ」の"高"は単独では現れないけれど、意味を持つ形態素なので、拘束形態素であり語根。「山」とか「川」とかの名詞のほとんどは、単独で出現できて意味を持つので自由形態素の語根。
接辞は、屈折接辞(infectional affix)と派生接辞(derivational affix)に分類される。複数形のsや現在進行系のingなどは屈折接辞で、日本語では「書く」の"く"などのように活用語尾。派生接辞は品詞の意味を変える。例えばはerとかlyとか。
語から屈折接辞を取り除いたものを語幹(stem)と言う。語は「横切る」のように"横"と"切"という複数の語根からなるものもあるので、"語幹"と"語根"は違う。
そして接辞は前に出てくる場合は接頭辞(prefix)で、後ろに出てくる場合は接尾辞(suffix)。unlikelyはun(接頭辞)+like(語幹)+ly(接尾辞)に分割することができる。日本語だと、「お昼」の"お"は接頭辞で、「食べる」の"る"は接尾辞。
形態素解析は"語"が分かっている前提で行われるものの、ラテンアルファベットな言語のように正書法で語を認定することが日本語では難しいこともあって以下の一連の処理をまとめて形態素解析。
- 単語(もしくは形態素)への分割(分かち書き)
- 品詞の推定
- 語形変化の処理(原形を求める)