索引 / 001 JA
Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit(入門 自然言語処理) cover

言語学

言語学

Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit(入門 自然言語処理)

Steven Bird; Ewan Klein; Edward Loper

英語原題: Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit

オープンソースの Natural Language Toolkit を使った Python プログラミングを通じて、計算言語学と自然言語処理を実践的に学ぶ入門書。スティーブン・バード、ユアン・クライン、エドワード・ローパーは、大量のテキストを扱うプログラムの書き方、注釈つきコーパスや語彙資源の使い方、言語構造と意味を分析する主要なアルゴリズムの実装を教える。無料のオンライン版は Python 3 と NLTK 3 に合わせて更新されているが、2009年の印刷版は Python 2 を使っている。

前提知識: プログラミング経験は前提としないが、言語学の素養とコードを書く意欲が求められる。

難易度レベル
中級
学術レベル
学部
computational linguisticsnatural language processingpythoncorporanltk教科書

01 / 読書ガイド

読書ガイド

引用

Bird, S., Klein, E., & Loper, E. (2009). Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit. O'Reilly Media. Free official edition (online version updated for Python 3 and NLTK 3): https://www.nltk.org/book/

章の要約

第0章:序文

序文は自然言語処理を、単語の頻度を数えることから発話を「理解」することまでを含む広い意味で定義し、本書を、PythonとオープンソースのNatural Language Toolkit(NLTK)に基づく、入門から中級レベルの実践的なチュートリアルと位置づけます。プログラミング初心者、Python初心者、Python経験者のそれぞれに語りかけ、章の中で言語を軸にした説明とプログラミングを軸にした説明が交互に現れることを説明し、難易度別の演習(☼やさしい、◑中級、★難しい)を紹介し、人文系の学生向けと理工系の学生向けの二つの授業計画を示します。

第1章:言語処理とPython

最初の章では、読者はすぐにテキストを使った計算に取りかかります。NLTKのサンプルテキストを読み込み、コンコーダンスで検索し、語彙を数え、テキストをPythonのリストとして扱います。頻度分布、コロケーションとバイグラム、条件分岐とループを導入し、最後に、言語を「理解」するには何が必要か――語義の曖昧性解消、代名詞の照応解決、文生成、機械翻訳、対話システム、含意関係の認識――と自然言語処理の限界を、技術的でない形で概観します。

第2章:テキストコーパスと語彙資源へのアクセス

この章は、NLTKに付属するコーパス(グーテンベルク、ウェブとチャットのテキスト、ブラウン・コーパス、ロイター、大統領就任演説、注釈付きコーパス、多言語コーパス)を概観し、自分のコーパスを読み込む方法を示します。条件付き頻度分布を使ってジャンルを比較し、バイグラムからランダムなテキストを生成します。Pythonの面では、テキストエディタ、関数、モジュールを導入します。続いて語彙資源――単語リスト、CMU発音辞書、比較単語リスト、Toolboxの辞書――と、WordNetの同義語集合(synset)、階層、語彙関係、意味的類似度を扱います。

第3章:生テキストの処理

ここで読者は、ウェブやディスク上のテキストを扱う方法を学びます。文字列、Unicode、語のパターンを見つけるための正規表現、正規化(ステミングとレマタイゼーション)、正規表現によるトークン化、文と語の分割、出力の整形です。この章は、既製のコーパスから雑多な現実世界のテキストへの一歩となります。

第4章:構造化されたプログラムを書く

この章は第1〜3章に散らばっていたPythonの知識をまとめます。代入とオブジェクト参照、シーケンス、プログラミングのスタイル、関数(引数、スコープ、docstring)、プログラム開発とデバッグ、再帰と動的計画法を含むアルゴリズム設計、そしてPythonライブラリの紹介(グラフ描画、NetworkX、CSV、NumPy)です。

第5章:単語の分類とタグ付け

品詞タグ付けは、タグ付きコーパスと汎用品詞タグセットを通じて導入され、単語を性質に対応づけるデータ構造としてPythonの辞書が使われます。この章は自動タガー――デフォルトタガー、正規表現タガー、ルックアップタガー、ユニグラムタガー、バックオフで組み合わせたnグラムタガー――を作って評価し、データの希薄性の問題と性能の限界を論じ、変換に基づく(ブリル)タグ付けを紹介し、言語学者が形態的・統語的・意味的な手がかりから単語の品詞をどう決めるのかを問います。

第6章:テキスト分類の学習

この章は、名前からの性別判定、文書分類、品詞タグ付け、文分割、対話行為の種類、含意関係の認識といった例を通じて教師あり分類を導入し、素性の選択と系列分類に注意を払います。評価(テストセット、正解率、適合率と再現率、混同行列、交差検証)を扱い、決定木、ナイーブベイズ、最大エントロピー分類器を説明し、最後にこうしたモデルが言語について何を教えてくれるかを考えます。

第7章:テキストからの情報抽出

情報抽出は、文分割とタグ付けから実体の検出、関係抽出に至るパイプラインとして示されます。章の中心はチャンキングです。タグパターンと正規表現による名詞句チャンキング、チンキング、IOB表現とCoNLL-2000コーパス、分類器に基づくチャンカーの評価と訓練、入れ子の木構造を作るカスケード型チャンカーを扱います。最後に固有表現認識と関係抽出で締めくくられます。

第8章:文構造の分析

この章は、無限に可能な文と遍在する曖昧性から統語論の必要性を説き、文脈自由文法、自分で文法を書くこと、再帰を導入します。構文解析アルゴリズム(再帰下降、シフト還元、左隅、整形部分列表/チャート解析)を比較し、依存文法と結合価を示し、ツリーバンク、「厄介な」曖昧性、重み付き(確率)文法による文法開発を論じます。

第9章:素性に基づく文法の構築

素性構造は、範疇を増やすことなく一致などの細かな区別を扱うために導入されます。この章は属性値行列、再入、包摂と単一化を説明し、素性に基づく文法を下位範疇化、主要部、助動詞の倒置、非有界依存構文、そしてドイツ語の格と性へと拡張します。

第10章:文の意味の分析

英語によるデータベース照会から始まり、この章は命題論理と一階述語論理、定理証明、モデルにおける真理、変数割り当て、量化と量化子の作用域の曖昧性、モデル構築を導入します。続いて、素性に基づく文法とλ計算を用いて意味表示を合成的に組み立てる方法(量化名詞句、他動詞)を示し、談話表示理論と談話処理で締めくくります。

第11章:言語データの管理

最後の技術的な章は、コーパスを設計された対象として扱います。TIMITコーパスの事例研究、コーパスのライフサイクル(作成のシナリオ、品質管理、キュレーション)、ウェブ、ワープロ文書、表計算ソフト、データベースからのデータの取得と変換、注釈層と標準の選択、危機言語を扱う際の特別な配慮、XMLとElementTreeの利用、Toolbox辞書の処理、そしてOLACメタデータによる資源の記述です。

第12章:あとがき――言語という課題

あとがきはこの分野について考察します。言語処理と記号処理の対比、合理主義と経験主義、実在論と観念論の間にある現代の分岐、言語学的知識と統計的手法の役割、そしてNLTKの今後の開発のロードマップです。

主要概念

第0章:序文

  • NLTK:自然言語処理の教育と研究のためのソフトウェア、コーパス、文書をそなえたオープンソースのPythonライブラリ。
  • 難易度別の演習:各章末にある、やさしい・中級・難しい演習。

第1章:言語処理とPython

  • トークンとタイプ:単語の特定の出現と、異なる語形そのもの。
  • 頻度分布:各項目(各単語など)が何回現れるかの集計。
  • コロケーション:異常に高い頻度で共起する単語の連なり。

第2章:テキストコーパスと語彙資源へのアクセス

  • コーパス:大規模で構造化されたテキストの集まり。ジャンルや話題で分類されていることが多い。
  • 条件付き頻度分布:ジャンルなどの条件ごとに一つずつある頻度分布の集まり。
  • WordNetのsynset:一つの語義を表す同義語の集合で、意味的な階層に結びつけられている。

第3章:生テキストの処理

  • トークン化:テキストを単語、句読点などの単位に分割すること。
  • 正規表現:文字列を検索・操作するためのパターン言語。
  • ステミングとレマタイゼーション:語形を語幹や辞書形に還元すること。

第4章:構造化されたプログラムを書く

  • オブジェクト参照:Pythonの代入はオブジェクトを複製するのではなく共有する。
  • 動的計画法:部分問題の結果を保存して再計算を避ける手法で、自然言語処理で広く使われる。

第5章:単語の分類とタグ付け

  • 品詞タグ付け:トークンに名詞や動詞などの品詞を割り当てること。
  • バックオフ:必要に応じて、特化したモデル(バイグラムタガー)からより一般的なモデル(ユニグラムタガー)に切り替えること。
  • データの希薄性問題:大量の訓練データがあっても、可能な文脈のほとんどは観測されないこと。

第6章:テキスト分類の学習

  • 教師あり分類:ラベル付きの訓練データを使い、素性からラベルを予測するよう学習すること。
  • 訓練・開発テスト・テストセット:モデルの構築、調整、最終評価のために分けたデータ。
  • 適合率と再現率:予測した項目のうちどれだけが正しいか、正しい項目のうちどれだけを見つけたかの尺度。

第7章:テキストからの情報抽出

  • チャンキング:名詞句などの複数トークンの連なりを切り出してラベルを付けること。
  • IOBタグ:チャンクを表すためのInside/Outside/Beginのラベル。
  • 固有表現認識:人名、組織名、地名などへの言及を特定すること。

第8章:文構造の分析

  • 文脈自由文法:各範疇の句がどのような部分に分解されるかを述べる生成規則。
  • 構文解析アルゴリズム:再帰下降(トップダウン)、シフト還元(ボトムアップ)、チャート法。
  • 依存文法:構造を主要部と依存部の関係として分析すること。

第9章:素性に基づく文法の構築

  • 素性構造:文法的性質を記述する属性と値の組の集合。
  • 単一化:両立する場合に、二つの素性構造を両方の情報を含む一つの構造にまとめること。

第10章:文の意味の分析

  • モデルにおける真理:論理式を議論領域と付値に照らして評価すること。
  • λ計算とβ簡約:意味表示を合成的に組み立てるための道具。
  • 談話表示理論:照応を含め、複数の文にまたがる意味を表示する理論。

第11章:言語データの管理

  • コーパスのライフサイクル:収集、注釈付け、品質管理、公開、その後の拡充。
  • メタデータ(OLAC):他の人が言語資源を見つけられるようにするための標準的な記述。

第12章:あとがき

  • 合理主義と経験主義:言語処理において生得的知識とデータのどちらに重きを置くかをめぐる対立する見方。

批判的分析

長所

  • やってみて学ぶ。 序文の約束どおり、ほぼすべての考え方にNLTK付属のコーパスを使った実行可能なコードが添えられているため、読者は主張をすぐに試せます。各章には数百の例題と難易度別の演習が含まれています。
  • 人文系の学生にも取り組みやすい。 最初の数章は言語の例を通じてPythonをゼロから教え、第4章で後からプログラミングをまとめ直し、序文は人文系の学生向けの別の授業計画も示しています。
  • 言語学に根ざしている。 プログラミング優先の多くの自然言語処理の本と異なり、品詞タグセットの設計と単語の範疇、統語論と構文解析、素性に基づく文法、形式意味論、そして危機言語の記録やToolboxデータを含むコーパス管理に、それぞれ一章を割いています。
  • 評価についての明快な指導。 第5〜7章は訓練データとテストデータの分離を繰り返し強調し、ベースライン、正解率、適合率、再現率、交差検証を導入し、結果が楽観的すぎるものになりうる理由を論じています。

短所

  • ニューラル以前の内容。 内容は2009年頃までの自然言語処理を反映しています。分類器は決定木、ナイーブベイズ、最大エントロピーであり、現在の実践の中心である単語埋め込み、ニューラルネットワーク、大規模言語モデルは扱われていません。
  • オンライン版は一部未完成。 本書の目次ページでは第5、10、11章に「軽微な修正がまだ必要」と記されており、オンライン版はPython 3とNLTK 3.0向けに更新されています(Python 3.2以降を前提)。現在のNLTKのリリースでは、一部のコードに調整が必要な場合があります。
  • 一つのツールキットに依存。 本文の多くはNLTK独自のクラスとコーパスの使い方を教えるため、今日の産業界や研究で使われる他のライブラリへのスキルの移行はそれほど直接的ではありません。
  • 難易度のばらつき。 序文が述べるとおり第4章以降はペースが上がり、第9章と第10章(素性文法、λ計算)は冒頭の章よりかなり難しくなっています。

コースにおける位置づけ

「計算言語学・コーパス言語学」のリストで、本書はプログラミング不要の入門書と、より技術的な書籍との間に位置します。Language and Computers はプログラミングなしで言語技術が何をするかを説明し、Doing Corpus Linguistics はコーパスの方法を紹介します。どちらもよい第一歩であり、その後で本書を読めば、学生はそうした分析をPythonで自ら行えるようになります。McEneryとHardieの Corpus Linguistics: Method, Theory and Practice は一般に、コーパス言語学の方法論的・理論的な扱いとされ、本書の第1〜3章と第11章を補います。Griesの Quantitative Corpus Linguistics with R は、似たデータに対してRを用いた統計的な道筋をとります。

JurafskyとMartinの Speech and Language Processing は本書の自然な次の段階です。アルゴリズムとモデルをより深く扱い、現行の草稿では本書が扱わないニューラルな手法も取り上げています。学生はBird、Klein、Loperの本でタグ付け、構文解析、分類の実践的な技能を身につけてから、理論と現代的なアプローチのためにJurafskyとMartinに進むことができます。

本書の使い方

本書は、プログラミング経験のない読者にも経験のあるプログラマーにも向けて作られており、自然言語処理、計算言語学、コーパス言語学、テキストマイニングの授業に使えます。Python 3とNLTKをインストールし、NLTKのデータをダウンロードして、読みながら例を入力してください。序文の講義数の目安表では、人文系の授業は第1〜5章、第8章、第9章にそれぞれ2〜4回の講義を割き、第6章にはほとんど時間を使わない一方、理工系の授業は第1〜4章を速く進め、第6〜11章により多くの時間を使います。序文が示すもう一つの方法は、第1〜5章を扱った後、分類(第6〜7章)、統語論(第8〜9章)、意味論(第10章)、データ管理(第11章)のいずれかに特化することです。

各章の少なくとも易しい(☼)演習と中級(◑)演習に取り組み、「さらに読む」の節を使ってコードと研究文献を結びつけてください。分野は先に進んでいるため、授業で現在の手法を扱う場合は、第5〜7章を自然言語処理のための機械学習の現代的な解説と組み合わせるとよいでしょう。

版と出典

本ガイドは https://www.nltk.org/book/ にある Natural Language Processing with Python のオンライン版に基づいています。このオンライン版は著者たちによってPython 3とNLTK 3向けに更新されたものです(初版は2009年にO'Reillyから刊行され、サイトには第2版の予定はないと記されています)。本ガイドは、序文(対象読者、重点、構成、演習、Python 3についての注記、授業計画)、目次全体、第1〜11章とあとがきのすべての節見出し、そして各章冒頭の問いと章末の要約に基づいています。