Skip to content

Latest commit

 

History

History
294 lines (185 loc) · 13.2 KB

chapter1.md

File metadata and controls

294 lines (185 loc) · 13.2 KB
title description prev next type id
第1章: 単語やフレーズ、名前、概念の検索
この章では、spaCyの基本的なテキスト処理の方法を紹介します。 データ構造や機械学習パイプラインの扱い方や、これらを用いてテキストの言語的特徴を抽出する方法を学んでいきます。
/chapter2
chapter
1

ではさっそく、spaCyを試していきましょう! この演習では、spaCyが対応している60以上の言語のうちのいくつかを試すことができます。

パート1: 英語

  • spacy.blankを使って、英語 ("en") のnlpオブジェクトを作ってください。
  • docオブジェクトを作り、文字列を表示してください。

パート2: ドイツ語

  • spacy.blankを使って、ドイツ語 ("de") のnlpオブジェクトを作ってください。
  • docオブジェクトを作り、文字列を表示してください。

パート3: スペイン語

  • spacy.blankを使って、スペイン語 ("es") のnlpオブジェクトを作ってください。
  • docオブジェクトを作り、文字列を表示してください。

パート4: 日本語

  • spacy.blankを使って、日本語 ("ja") のnlpオブジェクトを作ってください。
  • docオブジェクトを作り、文字列を表示してください。

nlpを文字列に適用すると、spaCyはまず文字列を分割し、Docオブジェクトを作ります。 この演習では、DocやそのビューであるTokenSpanについて詳しく学んでいきます。

ステップ1

  • spacy.blankを使って、日本語のnlpオブジェクトを作ってください。
  • テキストを処理し、Docオブジェクトであるdocを作ってください。
  • docの最初のトークンを選び、textを表示してください。

Pythonのリストの要素をインデックスを使って取得するのと同じ方法をDocに対して用いることができます。 例えば、doc[4]は位置4のトークン、つまりテキストの前から5番目のトークンを表します。 他の多くの言語と同様、Pythonではインデックスは1ではなく0から始まることに注意してください。

ステップ2

  • spacy.blankを使って、日本語のnlpオブジェクトを作ってください。
  • テキストを処理し、Docオブジェクトであるdocを作ってください。
  • 「ツリーカンガルー」と「ツリーカンガルーとイッカク」のトークンに対応するスライスをDocから作成してください。

Docからスライスを作るには、Pythonのリストと同様、:記法を使います。 スライスの右端のインデックスのトークンは、スライスに 含まれない ことに注意してください。 つまり0:4は、位置0,1,2,3のトークンを表し、位置4のトークンは含まれません。

spaCyのDocTokenオブジェクトと、その語彙属性(lexical attributes)を使って、 文字列の中からパーセンテージを表す部分を抜き出す方法をみていきます。 つまり、数字とパーセント記号からなる連続した二つのトークンを探す方法をみていきます。

  • Tokenオブジェクトのlike_numを使って、docに含まれるトークンが数字っぽいかどうかを判定してください。
  • Docのうち、数字のトークンの次のトークンを取得してみてください。あるトークンtokenの次のトークンのインデックスは token.i + 1です。
  • 次のトークンの文字列がパーセント記号(%)かどうかをチェックしてください。

トークンは、docからインデックスを使って取得できます。 例えば、doc[5]は位置5のトークンを表します。

次のうち、spaCyのパイプラインパッケージに含まれていないものはどれでしょう?

全てのパイプラインにはconfig.cfgという設定ファイルが含まれています。

全てのパイプラインにはmeta.jsonというメタファイルが含まれています。 これには、使用言語、ロードすべきパイプライン要素の名前のほか、学習時の設定 等が記載されています。

品詞タグや依存関係ラベル、固有表現等の言語特徴量の抽出をするため、機械学習パイプラインの重みが含まれています。

機械学習パイプラインは、データをもとに学習を行い、パイプラインの重みを更新し、その重みを用いて汎化した予測を行います。 つまり、予測には学習データが不必要なので、パイプラインパッケージには含まれていません。

パイプラインパッケージには、語彙データの要素とそのハッシュ値のマッピングが保存されているstrings.jsonという ファイルが含まれています。 ハッシュ値を用いることで、spaCyは内部で効率的にデータをやり取りしており、文字列は必要な場面でのみ参照されます。

このコースで使うパイプラインは、事前にインストールされているものです。 spaCyの機械学習パイプラインの詳細やインストール方法については、公式ドキュメントをみてください。

  • spacy.loadを使って、小サイズの日本語パイプライン"ja_core_news_sm"をロードしてください。
  • テキストを処理し、文字列を出力してください。

パイプラインをロードするには、spacy.load関数にパイプライン名を渡してください。 パイプライン名は、言語や使用されたトレーニングデータによって異なるので、適切なものを選んで使ってください。

では実際に、spaCyの学習済みパイプラインを用いて解析をしてみましょう。 お気軽にご自分の文章で試してみてください! タグやラベルの意味を調べるには、spacy.explainを使ってください。 例えば、spacy.explain("PROPN")spacy.explain("GPE")とすることで意味を出力することができます。

パート1

  • nlpオブジェクトでテキストを処理し、docを作ってください
  • それぞれのトークンについて、文字列、.pos_(品詞タグ)、.dep_(依存関係ラベル)を表示してください。

docオブジェクトを作るには、nlpオブジェクトを文字列に対して呼び出します。 トークンの属性の文字列を出力するには、属性名にアンダースコアをつけることを忘れないでください。

パート2

  • テキストを処理し、docオブジェクトを作ってください。
  • doc.entsをイテレートし、固有表現の文字列とラベルを出力してください。

docオブジェクトを作るには、nlpオブジェクトを文字列に対して呼び出します。 トークンの属性の文字列を出力するには、属性名にアンダースコアをつけることを忘れないでください。

機械学習パイプラインの出力は常に正しいとは限りません。 出力は、学習データや入力データに依存します。 一つ例をみてみましょう。

  • nlpオブジェクトでテキストを処理してください。
  • 固有表現をイテレートし、文字列とラベルを出力してください。
  • パイプラインは「三保の松原」を正しく抽出できないようです。手動でスパンを作ってみてください。
  • docオブジェクトを作るには、文に対してnlpオブジェクトを呼び出してください。固有表現は doc.entsプロパティから取得することができます。
  • Spanオブジェクトを作る最も簡単な方法は、スライス記法を使うことです。例えば、doc[5:10]は位置5から位置9までのトークンを示します。 右端は含まれないことに注意してください。

さて、spaCyのルールベース機能であるMatcherを使っていきましょう。 以前演習で用いた例を使って、「iPhone X」にマッチするパターンを書いていきます。

  • Matcherspacy.matcherからインポートしてください。
  • nlpが持つ共有語彙データvocabを用いて初期化してください。
  • 「iPhone」と「X」2つのトークンの文字列("TEXT")にマッチするパターンを書いてください。
  • matcher.addメソッドを使って、パターンをmatcherに追加してください。
  • matcherをdocに対して呼び出し、返り値をmatches変数に入れてください。
  • matchesをイテレートし、マッチしたスパンをstartendインデックスから取得してください。
  • 共有語彙データはnlp.vocabから取得できます。
  • パターンは、属性名をキーとする辞書からなるリストです。例えば、[{"TEXT": "Hello"}]は 文字列が「Hello」に正確に一致するトークンにマッチします。
  • それぞれのマッチのstartendは、マッチしたスパンの開始インデックスと終了インデックスを表しています。 実際のスパンを取得するには、docオブジェクトからスライスしてください。

この演習では、トークンの属性や演算子を用いてより複雑なパターンを書いていきます。

パート1

  • iOSの完全なバージョン(「iOS 7」「iOS 11」「iOS 10」等)にのみマッチするパターンを1つ書いてください。
  • トークンの文字列に完全一致させたいときは、TEXT属性を使いましょう。例えば、{"TEXT": "Apple"} は「Apple」という文字列を持つトークンにマッチします。
  • 数字のトークンにマッチさせたいときは、"IS_DIGIT"属性を使いましょう。これは トークンが数字だけからなるときのみTrueとなります。

パート2

  • 品詞が"PROPN"(固有名詞)のトークンと、見出し語が「県」のトークンの組み合わせからなる トークンにマッチするパターンを1つ書いてください。
  • 固有名詞を探すには"POS"属性が"PROPN"であるようなトークンを探します。
  • 見出し語を指定するには、"LEMMA"属性をトークンのパターンに使います。 例えば、{"LEMMA": "ある"}は「あり(ます)」「あっ(た)」「あれ(ば)」等にマッチします。

パート3

  • 形容詞"ADJ"と、一つか二つの名詞"NOUN"(つまり、一つの名詞と一つのオプショナルな名詞)からなるトークンの組にマッチするパターンを1つ書いてください。
  • 形容詞を探すには、"POS"属性が"ADJ"であるようなトークンを探してください。名詞は"NOUN"です。
  • 演算子は"OP"キーに追加します。例えば、"OP": "?"は0個もしくは1個にマッチします。