Flair 0.6 Tutorial 1: NLP 基底型 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/25/2020 (0.6.1)
* 本ページは、Flair ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく 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” ラベルだけを与えます。
以上