title | description | prev | next | type | id |
---|---|---|---|---|---|
第1章: 単語やフレーズ、名前、概念の検索 |
この章では、spaCyの基本的なテキスト処理の方法を紹介します。 データ構造や機械学習パイプラインの扱い方や、これらを用いてテキストの言語的特徴を抽出する方法を学んでいきます。 |
/chapter2 |
chapter |
1 |
ではさっそく、spaCyを試していきましょう! この演習では、spaCyが対応している60以上の言語のうちのいくつかを試すことができます。
spacy.blank
を使って、英語 ("en"
) のnlp
オブジェクトを作ってください。doc
オブジェクトを作り、文字列を表示してください。
spacy.blank
を使って、ドイツ語 ("de"
) のnlp
オブジェクトを作ってください。doc
オブジェクトを作り、文字列を表示してください。
spacy.blank
を使って、スペイン語 ("es"
) のnlp
オブジェクトを作ってください。doc
オブジェクトを作り、文字列を表示してください。
spacy.blank
を使って、日本語 ("ja"
) のnlp
オブジェクトを作ってください。doc
オブジェクトを作り、文字列を表示してください。
nlp
を文字列に適用すると、spaCyはまず文字列を分割し、Doc
オブジェクトを作ります。
この演習では、Doc
やそのビューであるToken
とSpan
について詳しく学んでいきます。
spacy.blank
を使って、日本語のnlp
オブジェクトを作ってください。- テキストを処理し、
Doc
オブジェクトであるdoc
を作ってください。 doc
の最初のトークンを選び、text
を表示してください。
Pythonのリストの要素をインデックスを使って取得するのと同じ方法をDoc
に対して用いることができます。
例えば、doc[4]
は位置4のトークン、つまりテキストの前から5番目のトークンを表します。
他の多くの言語と同様、Pythonではインデックスは1ではなく0から始まることに注意してください。
spacy.blank
を使って、日本語のnlp
オブジェクトを作ってください。- テキストを処理し、
Doc
オブジェクトであるdoc
を作ってください。 - 「ツリーカンガルー」と「ツリーカンガルーとイッカク」のトークンに対応するスライスを
Doc
から作成してください。
Doc
からスライスを作るには、Pythonのリストと同様、:
記法を使います。
スライスの右端のインデックスのトークンは、スライスに 含まれない ことに注意してください。
つまり0:4
は、位置0,1,2,3のトークンを表し、位置4のトークンは含まれません。
spaCyのDoc
とToken
オブジェクトと、その語彙属性(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")
とすることで意味を出力することができます。
nlp
オブジェクトでテキストを処理し、doc
を作ってください- それぞれのトークンについて、文字列、
.pos_
(品詞タグ)、.dep_
(依存関係ラベル)を表示してください。
doc
オブジェクトを作るには、nlp
オブジェクトを文字列に対して呼び出します。
トークンの属性の文字列を出力するには、属性名にアンダースコアをつけることを忘れないでください。
- テキストを処理し、
doc
オブジェクトを作ってください。 doc.ents
をイテレートし、固有表現の文字列とラベルを出力してください。
doc
オブジェクトを作るには、nlp
オブジェクトを文字列に対して呼び出します。
トークンの属性の文字列を出力するには、属性名にアンダースコアをつけることを忘れないでください。
機械学習パイプラインの出力は常に正しいとは限りません。 出力は、学習データや入力データに依存します。 一つ例をみてみましょう。
nlp
オブジェクトでテキストを処理してください。- 固有表現をイテレートし、文字列とラベルを出力してください。
- パイプラインは「三保の松原」を正しく抽出できないようです。手動でスパンを作ってみてください。
doc
オブジェクトを作るには、文に対してnlp
オブジェクトを呼び出してください。固有表現はdoc.ents
プロパティから取得することができます。Span
オブジェクトを作る最も簡単な方法は、スライス記法を使うことです。例えば、doc[5:10]
は位置5から位置9までのトークンを示します。 右端は含まれないことに注意してください。
さて、spaCyのルールベース機能であるMatcher
を使っていきましょう。
以前演習で用いた例を使って、「iPhone X」にマッチするパターンを書いていきます。
Matcher
をspacy.matcher
からインポートしてください。nlp
が持つ共有語彙データvocab
を用いて初期化してください。- 「iPhone」と「X」2つのトークンの文字列(
"TEXT"
)にマッチするパターンを書いてください。 matcher.add
メソッドを使って、パターンをmatcherに追加してください。- matcherを
doc
に対して呼び出し、返り値をmatches
変数に入れてください。 matches
をイテレートし、マッチしたスパンをstart
とend
インデックスから取得してください。
- 共有語彙データは
nlp.vocab
から取得できます。 - パターンは、属性名をキーとする辞書からなるリストです。例えば、
[{"TEXT": "Hello"}]
は 文字列が「Hello」に正確に一致するトークンにマッチします。 - それぞれのマッチの
start
とend
は、マッチしたスパンの開始インデックスと終了インデックスを表しています。 実際のスパンを取得するには、doc
オブジェクトからスライスしてください。
この演習では、トークンの属性や演算子を用いてより複雑なパターンを書いていきます。
- iOSの完全なバージョン(「iOS 7」「iOS 11」「iOS 10」等)にのみマッチするパターンを1つ書いてください。
- トークンの文字列に完全一致させたいときは、
TEXT
属性を使いましょう。例えば、{"TEXT": "Apple"}
は「Apple」という文字列を持つトークンにマッチします。 - 数字のトークンにマッチさせたいときは、
"IS_DIGIT"
属性を使いましょう。これは トークンが数字だけからなるときのみTrue
となります。
- 品詞が
"PROPN"
(固有名詞)のトークンと、見出し語が「県」のトークンの組み合わせからなる トークンにマッチするパターンを1つ書いてください。
- 固有名詞を探すには
"POS"
属性が"PROPN"
であるようなトークンを探します。 - 見出し語を指定するには、
"LEMMA"
属性をトークンのパターンに使います。 例えば、{"LEMMA": "ある"}
は「あり(ます)」「あっ(た)」「あれ(ば)」等にマッチします。
- 形容詞
"ADJ"
と、一つか二つの名詞"NOUN"
(つまり、一つの名詞と一つのオプショナルな名詞)からなるトークンの組にマッチするパターンを1つ書いてください。
- 形容詞を探すには、
"POS"
属性が"ADJ"
であるようなトークンを探してください。名詞は"NOUN"
です。 - 演算子は
"OP"
キーに追加します。例えば、"OP": "?"
は0個もしくは1個にマッチします。