Flair 0.6 : Tutorial 2: テキストにタグ付けする

Flair 0.6 Tutorial 2: テキストにタグ付けする (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/26/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 2: テキストにタグ付けする

これはチュートリアルのパート 2 です。このライブラリの 基底型 に馴染みがあることを仮定しています。ここでは、貴方のテキストにタグ付けするために事前訓練モデルをどのように利用するかを示します。

 

事前訓練シークエンス・タグ付けモデルによるタグ付け

固有表現認識 (NER) のための事前訓練モデルを利用します。このモデルは English CoNLL-03 タスクに渡り訓練されて 4 つの異なるエンティティ型を認識できます。

from flair.models import SequenceTagger

tagger = SequenceTagger.load('ner')

行なう必要のある総てはセンテンス上でタガーの predict() メソッドを使用することです。これはセンテンスのトークンに予測されたタグを追加します。2 つの固有表現を持つセンテンスを使用しましょう :

sentence = Sentence('George Washington went to Washington .')

# predict NER tags
tagger.predict(sentence)

# print sentence with predicted tags
print(sentence.to_tagged_string())

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

George <B-PER> Washington <E-PER> went to Washington <S-LOC> . 

 

アノテートされたスパンを得る

多くのシークエンス・ラベリング法は、サンプル・センテンスの “George Washington” のような複数の単語から成るスパンにアノテートします。このようにタグ付けされたセンテンスでそのようなスパンを直接得ることができます :

for entity in sentence.get_spans('ner'):
    print(entity)

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

Span [1,2]: "George Washington"   [− Labels: PER (0.9968)]
Span [5]: "Washington"   [− Labels: LOC (0.9994)]

それは “George Washington” が person (PER) で “Washington” が location (LOC) であることを示しています。そのような各 Span はテキスト、センテンスの位置そして値とスコア (予測の確信度) を持つ Label を持ちます。

次を呼び出すことでセンテンスの各エンティティの位置オフセットのような、追加情報を得ることもできます :

print(sentence.to_dict(tag_type='ner'))

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

{'text': 'George Washington went to Washington .',
    'entities': [
        {'text': 'George Washington', 'start_pos': 0, 'end_pos': 17, 'type': 'PER', 'confidence': 0.999},
        {'text': 'Washington', 'start_pos': 26, 'end_pos': 36, 'type': 'LOC', 'confidence': 0.998}
    ]}

 

マルチ-タギング

時に様々なタイプのアノテーションを一度に予測することを望むかもしれません、例えば NER と品詞 (POS, part-of-speech) タグです。このため、このように、新しい MultiTagger オブジェクトを利用することができます :

from flair.models import MultiTagger

# load tagger for POS and NER 
tagger = MultiTagger.load(['pos', 'ner'])

# make example sentence
sentence = Sentence("George Washington went to Washington.")

# predict with both models
tagger.predict(sentence)

print(sentence)

センテンスは今では 2 つのタイプのアノテーション : POS と NER を持ちます。

 

事前訓練シークエンス・タガー・モデルのリスト

SequenceTagger クラスの load() メソッドに適切な文字列を渡すことによりどの事前訓練モデルをロードするかを選択します。現在、以下の事前訓練モデルが提供されています :

 

英語モデル

ID タスク 訓練データセット 精度
‘ner’ 4-クラス 固有表現認識 Conll-03 93.03 (F1)
‘ner-pooled’ 4-クラス 固有表現認識 (memory inefficient) Conll-03 93.24 (F1)
‘ner-ontonotes’ 18-クラス 固有表現認識 Ontonotes 89.06 (F1)
‘chunk’ Syntactic Chunking Conll-2000 96.47 (F1)
‘pos’ 品詞タギング (fine-grained) Ontonotes 98.19 (Accuracy)
‘upos’ 品詞タギング (univesal) Ontonotes 98.6 (Accuracy)
‘keyphrase’ Methods and materials in science papers (BETA) Semeval2017 47.3 (F1)
‘frame’ Semantic Frame 検出
‘negation-speculation’ Negations and speculations in biomedical articles Bioscope 80.2 (F1)

 

高速英語モデル

利用可能な GPU を持たない場合、CPU 上で高速に動作する小さいモデルの配布もしています。

ID タスク 訓練データセット 精度
‘ner-fast’ 4-クラス 固有表現認識 Conll-03 92.75 (F1)
‘ner-ontonotes-fast’ 18-クラス 固有表現認識 Ontonotes 89.27 (F1)
‘chunk-fast’ Syntactic Chunking Conll-2000 96.22 (F1)
‘pos-fast’ 品詞タギング (fine-grained) Ontonotes 98.1 (Accuracy)
‘upos-fast’ 品詞タギング (universal) Ontonotes 98.47 (Accuracy)
‘frame-fast’ 意味フレーム検出 Propbank 3.0 97.31 (F1)

 

多言語モデル

単一モデル内で他言語のテキストを扱うことができる新しいモデルを配布します。

NER モデルは 4 言語 (英語、ドイツ語、オランダ語とスペイン語) に渡り訓練されて PoS モデルは 12 言語 (英語、ドイツ語、フランス語、イタリア語、オランダ語、ポーランド語、スペイン語、スウェーデン語、デンマーク語、ノルウェー語、フィンランド語とチェコ語) に渡ります。

ID タスク 訓練データセット 精度
‘ner-multi’ 4-クラス 固有表現認識 Conll-03 (4 言語) 89.27 (average F1)
‘ner-multi-fast’ 4-クラス 固有表現認識 Conll-03 (4 言語) 87.91 (average F1)
‘ner-multi-fast-learn’ 4-言語 固有表現認識 Conll-03 (4 言語) 88.18 (average F1)
‘pos-multi’ 品詞タギング Universal Dependency Treebank (12 言語) 96.41 (average acc.)
‘pos-multi-fast’ 品詞タギング Universal Dependency Treebank (12 言語) 92.88 (average acc.)

これらの言語のいずれかのテキストをモデルに渡すことができます。特に、NER はフランス語のように、その上で訓練されていない言語のためにもある種の動作します。

‘ner-multi-fast-learn’ は実験モデルで固有表現を時間につれて蓄積していきます。

 

ドイツ語モデル

(訳注: 省略します。原文 参照)

 

他言語のためのモデル

(訳注: 省略します。原文 参照)

 

ドイツ語センテンスにタグ付けする

上のリストで示されるように、英語以外の言語のための事前訓練モデルも提供します。ドイツ語センテンスにタグ付けするためには、単に適切なモデルをロードします :

# load model
tagger = SequenceTagger.load('de-ner')

# make German sentence
sentence = Sentence('George Washington ging nach Washington .')

# predict NER tags
tagger.predict(sentence)

# print sentence with predicted tags
print(sentence.to_tagged_string())

これは次をプリントします :

George <B-PER> Washington <E-PER> ging nach Washington <S-LOC> .

 

他言語テキストにタグ付けする

多くの言語 (英語とドイツ語のような) のテキストを持つ場合、新しい他言語モデルを利用できます :

# load model
tagger = SequenceTagger.load('pos-multi')

# text with English and German sentences
sentence = Sentence('George Washington went to Washington . Dort kaufte er einen Hut .')

# predict PoS tags
tagger.predict(sentence)

# print sentence with predicted tags
print(sentence.to_tagged_string())

これは以下をプリントします :

George <PROPN> Washington <PROPN> went <VERB> to <ADP> Washington <PROPN> . <PUNCT>

Dort <ADV> kaufte <VERB> er <PRON> einen <DET> Hut <NOUN> . <PUNCT>

そして、’went’ と ‘kaufte’ の両者はこれらのセンテンスで VERB として識別されます。

 

実験的: 意味フレーム検出

英語について、Propbank 3.0 フレームを使用して訓練された、テキストの意味フレームを検出する事前訓練モデルを提供します。これはフレーム喚起語 (= frame evoking words) のための語義曖昧性解消 (= word sense disambiguation) の類を提供して私達は研究者がこれで何をするかに好奇心があります。

ここにサンプルがあります :

# load model
tagger = SequenceTagger.load('frame')

# make English sentence
sentence_1 = Sentence('George returned to Berlin to return his hat .')
sentence_2 = Sentence('He had a look at different hats .')

# predict NER tags
tagger.predict(sentence_1)
tagger.predict(sentence_2)

# print sentence with predicted tags
print(sentence_1.to_tagged_string())
print(sentence_2.to_tagged_string())

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

George returned <return.01> to Berlin to return <return.02> his hat .

He had <have.LV> a look <look.01> at different hats .

見れるように、フレーム検出器はセンテンス 1 で単語 ‘return’ の2 つの異なる意味の間を区別します。’return.01′ は位置に戻る (return) ことを意味する一方で、’return.02′ は何かを元に戻します (return)。

同様に、センテンス 2 ではフレーム検出器は軽動詞構文を見つけます、そこでは ‘have’ は軽同士で ‘look’ はフレーム喚起語です。

 

センテンスのリストにタグ付けする

しばしば、テキスト・コーパス全体にタグ付けすることを望むかもしれません。この場合、コーパスをセンテンスに分割して Sentence オブジェクトのリストを .predict() メソッドに渡す必要があります。

例えば、貴方のテキストを分割するために segtok のセンテンス splitter を利用できます :

from flair.models import SequenceTagger
from flair.tokenization import SegtokSentenceSplitter

# example text with many sentences
text = "This is a sentence. This is another sentence. I love Berlin."

# initialize sentence splitter
splitter = SegtokSentenceSplitter()

# use splitter to split text into list of sentences
sentences = splitter.split(text)

# predict tags for sentences
tagger = SequenceTagger.load('ner')
tagger.predict(sentences)

# iterate through sentences and print predicted labels
for sentence in sentences:
    print(sentence.to_tagged_string())

.predict() メソッドの mini_batch_size パラメータを使用して、タガーに渡されるミニバッチのサイズを設定できます。貴方のリソースに依拠して、速度を最適化するためにこのパラメータで遊ぶことを望むかもしれません。

 

事前訓練テキスト分類モデルでタグ付けする

ポジティブかネガティブ・コメントを検出するために事前訓練モデルを利用しましょう。このモデルは製品と映画レビュー・データセットの混合に渡り訓練されて英語テキストのポジティブとネガティブ・センチメントを認識できます。

from flair.models import TextClassifier

# load tagger
classifier = TextClassifier.load('sentiment')

貴方が行なう必要がある総てはセンテンス上で分類器の predict() メソッドを使用することです。これはセンテンスに予測されたラベルを追加します。ポジティブ・センチメントを持つセンテンスを利用しましょう :

# load tagger
classifier = TextClassifier.load('sentiment')

# predict for example sentence
sentence = Sentence("enormously entertaining for moviegoers of any age .")
classifier.predict(sentence)

# check prediction
print(sentence)

これは次をプリントします :

Sentence: "enormously entertaining for moviegoers of any age ."   [− Tokens: 8  − Sentence-Labels: {'class': [POSITIVE (0.9976)]}]

センテンスにラベル POSITIVE が追加され、このセンテンスがポジティブ・センチメントを持つことを示します。

 

事前訓練テキスト分類モデルのリスト

適切な文字列を TextClassifier クラスの load() メソッドに渡すことによりどの事前訓練モデルをロードするか選択します。
現在、以下の事前訓練モデルが提供されています :

ID 言語 タスク 訓練データセット 精度
‘sentiment’ 英語 ポジティブとネガティブ・センチメントの検出 (transformer-based) 映画と製品レビュー 98.87
‘sentiment-fast’ 英語 ポジティブとネガティブ・センチメントの検出 (RNN-based) 映画と製品レビュー 96.83
‘communicative-functions’ 英語 研究ペーパーのセンテンスの機能検出 (BETA) scholarly papers
‘de-offensive-language’ ドイツ語 不快な言葉 (= offensive language) の検出 GermEval 2018 Task 1 75.71 (Macro F1)

 

以上