いつも論文をメモってるけど今回は書籍を丸々メモる。自然言語処理(NLP)の技術ってソフトウェア工学研究でもよく目にするが、体系的に勉強したことないなぁと思って有名な入門書を読んでみた。ちなみに技術書を読むときは面白そうなところだけ読むので、読んでないところもたくさんある。この本に限らないが、技術書の1章とかにありがちな歴史の話とは読まなくてよい。あれ読むと眠くなる。
今回の書籍
自然言語処理〔改訂版〕
黒橋 禎夫 (著)
第1章 自然言語処理の概要と歴史
まずは自然言語そのものの話から始まる。言語の根本的な働きは「ものごとに名前をつけ、その関係を示す」ことらしい。確かに言われてみればそんな気がする。ただしそのやり方には曖昧さがあり、コンピュータで処理するには難しいという。本を読む前から「自然言語処理って難しそうだな」となんとなく思っていたが、その具体的な原因が述べられている。
あとは自然言語処理の歴史とかも書いている。眠くなるので読んでない。
第2章 文字列・テキスト処理の基礎
ここでいきなり文字コードの解説が始まる。文字コードって自然言語処理のなかでも実装寄りの話のはずなので、いきなり文字コードの解説から始まるのは意外だった。内容そのものは自然言語処理固有の要素はなく、よくある基礎的な説明だった。UTF-8 ってよくできてるよなぁ。
単語の集合を効率的に格納するデータ構造としてトライ木(Trie Tree)が紹介されている。どっかで聞いたことあるような木構造だが、どこで聞いたのかは思い出せない。単語の補完とかでもこのデータ構造が使えるはず。覚えとこう。
第3章 系列の解析(1)
形態素解析は、文を単語に区切って品詞や活用形を求める処理である。もちろん単語の区切り方には曖昧性があるので、最もよさそうなものを計算によって求める必要がある。
形態素解析の方法として「ビタビアルゴリズム」が紹介されている。要するに、形態素への分解方法をグラフ上の経路として表現したうえで、コストが最初になるような経路を選ぶというもの。これが Dynamic Programming の一種として紹介されているが、ダイクストラ法でグラフ上の最短経路を求めているだけだろう。「ラティス」という言葉が出てくるが、一般的には「有向非巡回グラフ(DAG)」と呼ばれるものなのかと思った。
第4章 コーパスに基づく自然言語処理
コーパスは自然言語の文書を大量に収集したものであり、その文の意味が人工的に付与されたものもある。自然言語処理技術の発達にかなり貢献してきたらしい。
コーパスの中でもたぶん注釈付与コーパス(annotated corpus)が重要であり、教師あり学習でいう教師データのようなものに相当する。たとえば品詞の情報が語ごとに付与される。ちなみに、何も情報が付与されていないただの文書は生コーパス(raw corpus)と呼ばれる。
言語モデル(language model)は、文や表現の出現頻度を計算するものであり、これまた非常に重要である。確かに、文が自然かどうかを判断するって自然言語処理において重要そう。そんな重要な言語モデルだが、付加情報のない生コーパスから抽出できるらしい。よく出現するパターンほど自然な語の組み合わせってことだろう。
うちの子どもがスープを飲んで「熱くておいしい」と言うが、それが不自然だと分かるのは自分の脳内の言語モデルが教えてくれているに違いない。言われてみれば人間は言語モデルを生コーパスから獲得している。「温かくておいしい」「冷たくておいしい」はおかしくない。なぜなら聞いたことあるから。しかし「熱くておいしい」は聞いたことないのでおかしい。
ここからマルコフモデルや n-gram、ナイーブベイズの話が続く。このあたりはコンピュータサイエンスをやっていればよく目にする話題なので目新しことはない。コンピュータで系列データを扱おうとするといつだってマルコフモデルが出てくるんだ。そうしないと状態が爆発して意味のある抽象化ができなくなるんだと思う。
第5章 系列の解析(2)
この章では文中の単語の品詞を推定する問題を考える。
この問題を解くのに隠れマルコフモデルが登場する。隠れマルコフモデルってこれまでも何度か目にしたことがあるが個人的にあまり好きな言葉ではない。"隠れ" ているものって、一般に「パラメータ」と呼ばれているものなのよね。じゃあ「パラメータ」って呼べばいいじゃない、って思う。
実際のところ普通にベイズ推定をしている。パラメータとして品詞の状態が確率的に定まり、それをもとに語が確率的に決定される生成モデルになっている。このモデルに対して観測された語から品詞の事後分布を求めるベイズ推定を行う。ベイジアンネットワークを図示したらかなり見通しがよさそう。
しかし上記のやリ方では語そのものがもつ品詞に関する情報がヒントとして活用できない。こんなときは機械学習による系列ラベリングの問題として捉え直すとよいらしい。品詞に影響しそうな特徴量を作成してやればよいって話。
第6章 意味の解析(1)
自然言語は "概念" を表現するものであるため、その概念を体系的に整理することは重要である。
私はプログラマなので、この章の話はオブジェクト指向っぽく聞こえる。語によって指し示されるのはクラスであり、クラスにはもちろんスーパークラスやサブクラスが存在する、って感じ。そしてシソーラス(thesaurus)はクラス図。クラス図が手に入ると概念の構造が明らかになり、関連語だったり語と語の関係を推測するのに役立つ。
複数の単語が同じ意味をもつ「同義性」や、1つの単語が複数の意味をもつ「多義性」についての扱いもここで述べられている。共起性の尺度として自己相互情報量が出てきたりする。自己相互情報量って情報理論ではあまり見ない指標な気がする。知らんけど。
第7章 構文の解析(1)
コンピュータサイエンスでよくある形式言語の「構文解析」といえばプログラムの構文木を求める処理だが、自然言語処理ではこれは「句構造表現」と呼ばれているらしい。もちろん自然言語文から構文木を構築するのは曖昧性がある。文脈自由文法とかはプログラミング言語の話と同じ。
CKY 法(Code-Kasami-Younger algorithm)は、文から文脈自由文法の構文木を求める方法である。文を構成する語をボトムアップに集約してゆき、最終的に文全体が文法の開始記号に対応した場合は構文木の構築に成功したことになる。あまり複雑な処理ではない。ちなみに、CKY 法を考案したのは嵩忠雄先生であり私の母校の先輩かつ教員だった方。学生時代に何度か名前を聞いた偉大な方。
句構造表現とは別に、自然言語特有の構文表現として「依存構造表現」というのがあるらしい。これは修飾(係り受け)の関係をもとに語をつないだものである。
個人的な印象としては「句構造表現」と「依存構造表現」はまったく異なる表現であり、同じ "構文解析" としてカテゴライズするのもおかしい気がした。プログラミング言語の処理でいう抽象構文木とプログラム依存グラフぐらいの違いがあるのでは。
第8章 構文の解析(2)
ちゃんと読んでないが、意味的に妥当な語と語のつながりを求めることが正しい構文解析につながるらしい。プログラミング言語では構文解析に意味情報を使うなんて話はありえないので、なんだか不思議な感じ。
第9章 意味の解析(2)
ちゃんと読んでないが、述語(動詞)を中心として、その他の語がどんな役割をもつかを解析することが重要らしい。
第10章 文脈の解析
自然言語文には、指示語など前の文とのつながりが存在するため、解析するときにそれを考慮する必要がある。人間が読んでも曖昧にしか意味を取れない文があるくらいなんだから、そりゃコンピュータで処理するの大変だよなぁ。
第11章 情報抽出と知識獲得
情報抽出は、文書から固有名に関連する属性を抽出するようなタスクである。たとえば文書から会社とその所在地を抽出する。属性を抽出するためのパターンを獲得することが重要であるが容易ではない。
ブートストラップ(bootstrap)という戦略では、人間が与えた属性の例からパターンを抽出し、そのパターンから新たな属性を見つける。そして、見つかった属性をもとにさらにパターンを拡大してゆく。面白そうなのでもっと深掘って調べてもいいかもしれない。
知識獲得では、自然言語文から物事の関係を得ることが目標である。プログラマ的には、設計書から自動的に UML を作り出すみたいな課題感だと思った。
第12章 情報検索
検索エンジンなど大量の文書から、クエリを用いて関連するものを検索する話。TF-IDF やページランクの話など。このあたりは有名なのでだいたい知っていた。
これまでの検索技術において文書の意味はあまり考慮されてこなかった、という記述があって確かになぁと思った。ソースコード検索とかで semantic code search みたいな研究を見たことがあるけど、自然言語をクエリとして自然言語以外のものを検索するようなシーンこそ、クエリの意味を解釈することが重要になってくるのかもしれない。
第13章 対話システム
人間と対話する Siri みたいなシステムの話。対話はハイコンテクストなので難しいとのこと。そりゃそうだ。こういう研究をよくやるなぁと思う。どう考えても本質的に難しい。助けて Siri。
第14章 機械翻訳
言わずもがな近年の技術発展が著しいところ。ニューラルネットワークの基本的な解説から始まり、リカレントニューラルネットワーク、attention と話が続く。
attention 機構では、翻訳後の単語を出力するときに、入力単語列のどの部分に注目すべきかを重みとして考慮する。アイデアはシンプルだが上手く機能するようになるまでに相当な努力があったんだろうなぁと想像する。
BLEU は文の自然さを評価するための尺度である。仕組みは簡単っぽい。名前は聞いたことあったけど何のことが分かっていなかったので今回覚えた。
所感
全体的に内容がやさしいのもあるが、分かりやすい表現で書かれたよい本だと思った。自然言語処理の全体像を理解できた。学部生のときに読んでも普通に理解できたと思う。
内容に関して言うと、自然言語処理では単語が意味する概念をなるべく正確に特定し、それを考慮して目的を達成するのが重要なのだと理解した。そしてそれが難しい。プログラミング研究でも、構文解析の技術は十分に確立されている一方で、やはり意味解析が難しい。似た意味をもつソースコードを検索する技術とか提案されてるが、実用的なものはほとんどないはず。そういう意味で、どちらの言語処理も課題感は似ていると感じた。