Flair 0.6 : Tutorial 1: NLP 基底型

Flair 0.6 Tutorial 1: NLP 基底型 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/25/2020 (0.6.1)

* 本ページは、Flair ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

Tutorial 1: NLP 基底型

これはチュートリアルのパート 1 です、ここではライブラリで使用される基底型の幾つかを調べます。

 

センテンスを作成する

このライブラリに中心的な 2 つのタイプのオブジェクトがあります、すなわち Sentence と Token オブジェクトです。Sentence はテキストのセンテンスを保持し本質的には Token のリストです。

サンプル・センテンスのために Sentence オブジェクトを作成することから始めましょう。

# The sentence objects holds a sentence that we may want to embed or tag
from flair.data import Sentence

# Make a sentence object by passing a string
sentence = Sentence('The grass is green.')

# Print the object to see what's in there
print(sentence)

これは次をプリントするはずです :

Sentence: "The grass is green ."   [− Tokens: 5]

プリント出力はセンテンスが 5 トークンから成ることを伝えています。センテンスのトークンにはそれらのトークン id かインデックスでアクセスできます :

# using the token id
print(sentence.get_token(4))
# using the index itself
print(sentence[3])

これは両者の場合で次をプリントするはずです :

Token: 4 green

このプリント出力はトークン id (4) とトークン (“green”) の語彙の値を含みます。センテンスの総てのトークンに渡り反復することもできます。

for token in sentence:
    print(token)

これは以下をプリントするはずです :

Token: 1 The
Token: 2 grass
Token: 3 is
Token: 4 green
Token: 5 .

 

トークン化

上のように Sentence を作成するとき、テキストは軽量 segtok ライブラリ を使用して自動的にトークン化されます。

この tokenizer を使用することを望まない場合には、Sentence をトークン化されていない文字列でインスタンス化するとき単純に use_tokenizer フラグを False に設定します :

from flair.data import Sentence

# Make a sentence object by passing an untokenized string and the 'use_tokenizer' flag
untokenized_sentence = Sentence('The grass is green.', use_tokenizer=False)

# Print the object to see what's in there
print(untokenized_sentence)

この場合、トークン化は遂行されずにテキストは空白文字で分割され、ここでは 4 トークンだけという結果になります。

 

異なる Tokenizer を使用する

初期化メソッドにカスタム tokenzier を渡すこともできます。例えば、日本語センテンスをトークン化することを望む場合、このように、代わりに ‘janome’ tokenizer を利用することができます :

from flair.data import Sentence
from flair.tokenization import JapaneseTokenizer

# init japanese tokenizer
tokenizer = JapaneseTokenizer("janome")

# make sentence (and tokenize)
japanese_sentence = Sentence("私はベルリンが好き", use_tokenizer=tokenizer)

# output tokenized sentence
print(japanese_sentence)

これは次をプリントするはずです :

Sentence: "私 は ベルリン が 好き"   [− Tokens: 5]

貴方自身のトークン化ルーチンを書くことができます。貴方自身のトークン化メソッドをどのように追加するかのアイデアを得るには flair.data.Tokenizer とその実装 (e.g. flair.tokenization.SegtokTokenizer or flair.tokenization.SpacyTokenizer) のコードを確認してください。

 

ラベルを追加する

Flair では、任意のデータポイントはラベル付けできます。例えば、単語にラベル付けしたりセンテンスにラベル付けできます :

 

トークンにラベル付けする

Token は見出し語、品詞タグや固有表現タグのような言語上のアノテーションのためのフィールドを持ちます。タグ型とタグ値を指定することによりタグを追加できます。このサンプルでは、型 ‘color’ の NER タグを単語 ‘green’ に追加しています。これはこの単語を型 color のエンティティとしてタグ付けしたことを意味します。

# add a tag to a word in the sentence
sentence[3].add_tag('ner', 'color')

# print the sentence with all tags of this type
print(sentence.to_tagged_string())

これは次をプリントするはずです :

The grass is green <color> .

各タグはクラス Label で、これは value の次に信頼度を示す score を持ちます。このようにプリントします :

# get token 3 in the sentence 
token = sentence[3]

# get the 'ner' tag of the token
tag = token.get_tag('ner')

# print token
print(f'"{token}" is tagged as "{tag.value}" with confidence score "{tag.score}"')

これは次をプリントするはずです :

"Token: 4 green" is tagged as "color" with confidence score "1.0"

color タグは 1.0 のスコアです、何故ならばそれを手動で追加したからです。タグがシークエンス labeler により予測される場合、スコア値は分類器の確信を示します。

 

センテンスにラベルを追加する

Label を Sentence 全体に追加することもできます。例えば、下のサンプルはセンテンスにラベル ‘sports’ をどのように追加するかを示します、それによってそれにスポーツ “topic” に属するようにラベル付けします。

sentence = Sentence('France is the current world cup winner.')

# add a label to a sentence
sentence.add_label('topic', 'sports')

print(sentence)

# Alternatively, you can also create a sentence with label in one line
sentence = Sentence('France is the current world cup winner.').add_label('topic', 'sports')

print(sentence)

これは次をプリントするはずです :

Sentence: "France is the current world cup winner."   [− Tokens: 7  − Sentence-Labels: {'topic': [sports (1.0)]}]

このセンテンスは確信度 1.0 でトピック ‘sports’ に属することを示します。

 

マルチラベル

任意のデータポイントは何度もラベル付けできます。インスタンスのためのセンテンスは 2 つのトピックに属するかもしれません。この場合、同じラベル名で 2 つのラベルを追加します :

sentence = Sentence('France is the current world cup winner.')

# this sentence has multiple topic labels
sentence.add_label('topic', 'sports')
sentence.add_label('topic', 'soccer')

同じセンテンスに異なる層のアノテーションを追加することを望むかもしれません。topic の次に、センテンスの “language” を予測することも望むかもしれません。この場合、異なるラベル名でラベルを追加できます :

sentence = Sentence('France is the current world cup winner.')

# this sentence has multiple "topic" labels
sentence.add_label('topic', 'sports')
sentence.add_label('topic', 'soccer')

# this sentence has a "language" labels
sentence.add_label('language', 'English')

print(sentence)

これは次をプリントするはずです :

Sentence: "France is the current world cup winner."   [− Tokens: 7  − Sentence-Labels: {'topic': [sports (1.0), soccer (1.0)], 'language': [English (1.0)]}]

このセンテンスは 2 つの “topic” ラベルと 1 つの “language” ラベルを持つことを示します。

 

センテンスのラベルにアクセスする

これらのラベルにこのようにアクセスできます :

for label in sentence.labels:
    print(label)

各ラベルは Label オブジェクトであることを忘れないでください、そしてラベルの value と score フィールドに直接アクセスすることもできます :

print(sentence.to_plain_string())
for label in sentence.labels:
    print(f' - classified as "{label.value}" with score {label.score}')

これは次をプリントするはずです :

France is the current world cup winner.
 - classified as "sports" with score 1.0
 - classified as "soccer" with score 1.0
 - classified as "English" with score 1.0

アノテーションの 1 つの層のラベルにだけ感心がある場合には、それらにこのようにアクセスできます :

for label in sentence.get_labels('topic'):
    print(label)

“topic” ラベルだけを与えます。

 

以上