Flair 0.6 : Tutorial 6: 訓練データをロードする

Flair 0.6 Tutorial 6: 訓練データをロードする (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/29/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 6: 訓練データをロードする

チュートリアルのこのパートはモデルを訓練するためにコーパスをどのようにロードできるかを示します。ライブラリの基底型に精通していることを仮定しています。

 

Corpus オブジェクト

Corpus はモデルを訓練するために使用するデータセットを表します。それは訓練センテンスのリスト、dev センテンスのリスト、そしてテストセンテンスのリストから成り、これらはモデル訓練の間の訓練、検証とテスト分割に相当します。

次のサンプル・スニペットはコーパス・オブジェクトとして英語のための Universal Dependency Treebank をインスタンス化します :

import flair.datasets
corpus = flair.datasets.UD_ENGLISH()

このスニペットを最初に呼び出すとき、それは貴方のハードドライブ上への英語のための Universal Dependency Treebank のダウンロードを開始します。それから訓練、テストと dev 分割を Corpus コーパスに読み込み、これらを返します。センテンスがそこに幾つあるかを見るために 3 つの分割の長さを確認します :

# print the number of Sentences in the train split
print(len(corpus.train))

# print the number of Sentences in the test split
print(len(corpus.test))

# print the number of Sentences in the dev split
print(len(corpus.dev))

各分割の Sentence オブジェクトに直接アクセスすることもできます。例えば、英語 UD の訓練分割の最初のセンテンスを見ましょう :

# print the first Sentence in the training split
print(corpus.test[0])

これは次を出力します :

Sentence: "What if Google Morphed Into GoogleOS ?" - 7 Tokens

センテンスは統合的そして形態的な (= morphological) 情報で完全にタグ付けされます。例えば、センテンスを PoS タグでプリントします :

# print the first Sentence in the training split
print(corpus.test[0].to_tagged_string('pos'))

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

What <WP> if <IN> Google <NNP> Morphed <VBD> Into <IN> GoogleOS <NNP> ? <.>

そしてコーパスはタグ付けされて訓練のための準備ができます。

 

ヘルパー関数

Corpus は多くの有用なヘルパー関数を含みます。例えば、downsample() を呼び出して割合 (= ratio) を渡すことによりデータをダウンサンプリングできます。従って、このようにコーパスを普通に得る場合 :

import flair.datasets
corpus = flair.datasets.UD_ENGLISH()

単純にこのように、コーパスをダウンサンプリングできます :

import flair.datasets
downsampled_corpus = flair.datasets.UD_ENGLISH().downsample(0.1)

両者のコーパスをプリントすれば、2 番目のものはデータの 10% にダウンサンプリングされたことを見ます。

print("--- 1 Original ---")
print(corpus)

print("--- 2 Downsampled ---")
print(downsampled_corpus)

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

--- 1 Original ---
Corpus: 12543 train + 2002 dev + 2077 test sentences

--- 2 Downsampled ---
Corpus: 1255 train + 201 dev + 208 test sentences

多くの学習タスクについてターゲット辞書を作成する必要があります。そして学習することを望むタスクに依拠して、Corpus はタグやラベル辞書を作成することを貴方に可能にします。それを行なうために以下のコードスニペットを単純に実行します :

# create tag dictionary for a PoS task
corpus = flair.datasets.UD_ENGLISH()
print(corpus.make_label_dictionary('upos'))

# create tag dictionary for an NER task
corpus = flair.datasets.CONLL_03_DUTCH()
print(corpus.make_label_dictionary('ner'))

# create label dictionary for a text classification task
corpus = flair.datasets.TREC_6()
print(corpus.make_label_dictionary())

もう一つの有用な関数は obtain_statistics() で、これはデータセットについての有用なスタッツを持つ python 辞書を返します。
例えば、このような IMDB データセット上での使用は :

import flair.datasets 
corpus = flair.datasets.TREC_6()
stats = corpus.obtain_statistics()
print(stats)

データセット上の詳細情報、各分割、そしてクラスラベルの distribution を出力します。

 

MultiCorpus オブジェクト

複数のタスクを一度に訓練することを望む場合、MultiCorpus オブジェクトを使用できます。MultiCorpus をインスタンス化するためには最初に任意の数の Corpus オブジェクトを作成する必要があります。その後で、Corpus のリストを MultiCorpus に渡すことができます。例えば、次のスニペットは英語、ドイツ語とオランダ語 Universal Dependency Treebanks から成る結合コーパスをロードします。

english_corpus = flair.datasets.UD_ENGLISH()
german_corpus = flair.datasets.UD_GERMAN()
dutch_corpus = flair.datasets.UD_DUTCH()

# make a multi corpus consisting of three UDs
from flair.data import MultiCorpus
multi_corpus = MultiCorpus([english_corpus, german_corpus, dutch_corpus])

MultiCorpus は Corpus から継承していますので、モデルを訓練するためにそれを任意の他のコーパスのように使用できます。

 

準備されたデータセット

Flair は準備されたデータセットの増え続けるリストを独創的にサポートします。すなわち、最初に相当するコンストラクタ ID を呼びだっすときデータを自動的にダウンロードしてセットアップします。以下のデータセットがサポートされます :

 

Chunking

ID 言語 説明
‘CONLL_2000’ 英語 CoNLL-2000 syntactic chunking

 

固有表現認識

ID 言語 説明
‘BIOFID’ ドイツ語 CoNLL-03 Biodiversity literature NER
‘CONLL_03_DUTCH’ オランダ語 CoNLL-03 4-クラス NER
‘CONLL_03_SPANISH’ スペイン語 CoNLL-03 4-クラス NER
‘DANE’ デンマーク語 DaNE データセット
‘EUROPARL_NER_GERMAN’ ドイツ語 German Europarl データセット NER in German EU parliament speeches
‘LER_GERMAN’ ドイツ語 Legal Entity 認識 NER in German Legal ドキュメント
‘MIT_RESTAURANTS’ 英語 NER データセット for レストラン・レビュー
‘NER_BASQUE’ バスク語 バスク語のための NER データセット
‘NER_FINNISH’ フィンランド語 Finer-データ
‘NER_SWEDISH’ スウェーデン語 Swedish Spraakbanken NER 4-クラス NER
‘TWITTER_NER’ 英語 Twitter NER データセット
‘WIKIANN’ 282 言語 Wikipedia に由来するクロスリンガル NER のための巨大コーパス
‘WNUT_17’ 英語 WNUT-17 emerging entity 検出
‘WIKIGOLD_NER 英語 Wikigold 手動でアノテートされた Wikipedia テキストのコレクション
‘WIKINER_ENGLISH’ 英語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_GERMAN’ ドイツ語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_FRENCH’ フランス語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_ITALIAN’ イタリア語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_SPANISH’ スペイン語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_PORTUGUESE’ ポルトガル語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_POLISH’ ポーランド語 WikiNER Wikipedia から自動的に生成された NER データセット
‘WIKINER_RUSSIAN’ ロシア語 WikiNER Wikipedia から自動的に生成された NER データセット
‘XTREME’ 174 言語 合計 176 言語のデータセットから成るクロスリンガル NER のための Google Researchによる Xtreme コーパス

 

生物医学的な固有表現認識

ここでリストされる、31 生物医学的 NER データセットをサポートします。

 

Universal Dependency Treebanks

ID 言語 説明
‘UD_ARABIC’ アラビア語 アラビア語 のための Universal Dependency Treebank
‘UD_BASQUE’ バスク語 バスク語 のための Universal Dependency Treebank
‘UD_BULGARIAN’ ブルガリア語 ブルガリア語 のための Universal Dependency Treebank
‘UD_CATALAN’ カタロニア語 (= Catalan) カタロニア語 のための Universal Dependency Treebank
‘UD_CHINESE’ 中国語 中国語 のための Universal Dependency Treebank
‘UD_CHINESE_KYOTO’ 漢文 (古典中国語) 漢文 (古典中国語) のための Universal Dependency Treebank
‘UD_CROATIAN’ クロアチア語 クロアチア語 のための Universal Dependency Treebank
‘UD_CZECH’ チェコ語 チェコ語 のための Very large Universal Dependency Treebank
‘UD_DANISH’ デンマーク語 デンマーク語 のための Universal Dependency Treebank
‘UD_DUTCH’ オランダ語 オランダ語 のための Universal Dependency Treebank
‘UD_ENGLISH’ 英語 英語 のための Universal Dependency Treebank
‘UD_FINNISH’ フィンランド語 フィンランド語 のための Universal Dependency Treebank
‘UD_FRENCH’ フランス語 フランス語 のための Universal Dependency Treebank
‘UD_GERMAN’ ドイツ語 ドイツ語 のための Universal Dependency Treebank
‘UD_GERMAN-HDT’ ドイツ語 ドイツ語 のための Very large Universal Dependency Treebank
‘UD_HEBREW’ ヘブライ語 ヘブライ語 のための Universal Dependency Treebank
‘UD_HINDI’ ヒンディー語 ヒンディー語 のための Universal Dependency Treebank
‘UD_INDONESIAN’ インドネシア語 インドネシア語 のための Universal Dependency Treebank
‘UD_ITALIAN’ イタリア語 イタリア語 のための Universal Dependency Treebank
‘UD_JAPANESE’ 日本語 日本語 のための Universal Dependency Treebank
‘UD_KOREAN’ 韓国語 韓国語 のための Universal Dependency Treebank
‘UD_NORWEGIAN’ ノルウェー語 ノルウェー語 のための Universal Dependency Treebank
‘UD_PERSIAN’ ペルシャ語 / Farsi ペルシャ語 のための Universal Dependency Treebank
‘UD_POLISH’ ポーランド語 ポーランド語 のための Universal Dependency Treebank
‘UD_PORTUGUESE’ ポルトガル語 ポルトガル語 のための Universal Dependency Treebank
‘UD_ROMANIAN’ ルーマニア語 ルーマニア語 のための Universal Dependency Treebank
‘UD_RUSSIAN’ ロシア語 ロシア語 のための Universal Dependency Treebank
‘UD_SERBIAN’ セルビア語 セルビア語 のための Universal Dependency Treebank
‘UD_SLOVAK’ スロバキア語 スロバキア語 のための Universal Dependency Treebank
‘UD_SLOVENIAN’ スロベニア語 スロベニア語 のための Universal Dependency Treebank
‘UD_SPANISH’ スペイン語 スペイン語 のための Universal Dependency Treebank
‘UD_SWEDISH’ スェーデン語 スェーデン語 のための Universal Dependency Treebank
‘UD_TURKISH’ トルコ語 トルコ語 のための Universal Dependency Treebank

 

キーワード / キーフレーズ抽出

ID 言語 説明
‘INSPEC’ 英語 INSPEC オリジナル・コーパス (2000 docs) from INSPEC データベース, adapted by midas-research
‘SEMEVAL2017’ 英語 オリジナル SEMEVAL2017 データセット (500 docs) from ScienceDirect, adapted by midas-research
‘SEMEVAL2010’ 英語 オリジナル SEMEVAL2010 データセット (~250 docs) from ACM デジタル・ライブラリ, adapted by midas-research

 

テキスト分類

ID 言語 説明
‘AMAZON_REVIEWS’ 英語 センチメント・アノテーションを持つ Amazon 製品レビュー データセット
‘COMMUNICATIVE_FUNCTIONS’ 英語 学術的ペーパーのセンテンスの communicative functions
‘IMDB’ 英語 センチメント・アノテーションを持つ映画レビューの IMDB データセット
‘NEWSGROUPS’ 英語 ポピュラーな 20 ニュースグループ 分類データセット
‘SENTIMENT_140’ 英語 センチメント・アノテーションを持つ Tweets データセット
‘SENTEVAL_CR’ 英語 センチメント・アノテーションを持つ SentEval のカスタマー・レビュー・データセット
‘SENTEVAL_MR’ 英語 センチメント・アノテーションを持つ SentEval の映画レビュー・データセット
‘SENTEVAL_SUBJ’ 英語 SentEval の主観 (= Subjectivity) データセット
‘SENTEVAL_MPQA’ 英語 opinion-polarity アノテーションを持つ SentEval の opinion-polarity データセット
‘SENTEVAL_SST_BINARY’ 英語 センチメント・アノテーションを持つ SentEval の Stanford センチメント treebank データセット
‘SENTEVAL_SST_GRANULAR’ 英語 fine-grained センチメント・アノテーションを持つSentEval の Stanford センチメント treebank データセット
‘TREC_6’, ‘TREC_50’ 英語 TREC 質問分類データセット

 

テキスト回帰

ID 言語 説明
‘WASSA_ANGER’ 英語 WASSA 感情強度 (= emotion-intensity) 検出チャレンジ (anger, 怒り)
‘WASSA_FEAR’ 英語 WASSA 感情強度 (= emotion-intensity) 検出チャレンジ (fear, 恐れ)
‘WASSA_JOY’ 英語 WASSA 感情強度 (= emotion-intensity) 検出チャレンジ (joy, 喜び)
‘WASSA_SADNESS’ 英語 WASSA 感情強度 (= emotion-intensity) 検出チャレンジ (sadness, 悲しみ)

 

実験的: 類似度学習

ID 言語 説明
‘FeideggerCorpus’ ドイツ語 Feidegger データセット ファッション画像とドイツ語説明
‘OpusParallelCorpus’ 任意の言語ペア OPUS プロジェクトの Parallel コーパス、現在は Tatoeba コーパスだけをサポートします

 
そしてセンチメント・テキスト分類のための IMDB コーパスをロードするためには、単純に次を行ないます :

import flair.datasets
corpus = flair.datasets.IMDB()

これは貴方のモデルを訓練するために必要な総てをダウンロードしてセットアップします。

 

貴方自身のシークエンス・ラベリング・データセットを読む

上のリストにはないシークエンス・ラベリング・データセットに渡り訓練することを望む場合、それらを ColumnCorpus オブジェクトでロードできます。NLP の殆どのシークエンス・ラベリング・データセットはある種のカラム形式を使用し、そこでは各行は単語で各カラムは言語学的アノテーションの一つのレベルです。例えばこのセンテンスを見てください :

George N B-PER
Washington N I-PER
went V O
to P O
Washington N B-LOC

Sam N B-PER
Houston N I-PER
stayed V O
home N O

最初のカラムは単語自身で、2 番目は荒い PoS タグ、そして 3 番目は BIO-アノテートされた NER タグです。空行はセンテンスを分割します。そのようなデータセットを読むには、カラム構造を辞書として定義して ColumnCorpus をインスタンス化します。

from flair.data import Corpus
from flair.datasets import ColumnCorpus

# define columns
columns = {0: 'text', 1: 'pos', 2: 'ner'}

# this is the folder in which train, test and dev files reside
data_folder = '/path/to/data/folder'

# init a corpus using column format, data folder and the names of the train, dev and test files
corpus: Corpus = ColumnCorpus(data_folder, columns,
                              train_file='train.txt',
                              test_file='test.txt',
                              dev_file='dev.txt')

これはそれぞれが Sentence のリストを持つ train, dev と test 分割を含む Corpus オブジェクトを与えます。そして、訓練分割に幾つのセンテンスがあるかを確認するために、次を行ないます :

len(corpus.train)

センテンスにアクセスしてアノテーションを確認することもできます。訓練分割が上のサンプルから読まれることを仮定しましょう、そしてこれらのコマンドの実行は :

print(corpus.train[0].to_tagged_string('ner'))
print(corpus.train[1].to_tagged_string('pos'))

アノテーションの異なる層を持つセンテンスをプリントします :

George <B-PER> Washington <I-PER> went to Washington <B-LOC> .

Sam <N> Houston <N> stayed <V> home <N>

 

テキスト分類データセットを読む

貴方自身のテキスト分類データセットを使用することを望む場合、これに取り組む現在 2 つの方法があります : 単純な CSV ファイルから指定されたテキストとラベルをロードするか、データを FastText 形式 にフォーマットします。

 

単純な CSV ファイルからロードする

多くのテキスト分類データセットは単純な CSV ファイルとして配布されそこでは各行はデータポイントに対応してカラムはテキスト、ラベルと他のメタデータに対応します。CSVClassificationCorpus を使用して (上の ColumnCorpus でのように) カラム形式を渡すことにより CSV 形式分類データセットをロードできます。このカラム形式は CSV のどのカラムがテキストを保持するかそしてどのフィールドがラベルかを示します。デフォルトでは、Python の CSV ライブラリはファイルが Excel CSV 形式であることを仮定しますが、カスタム区切り文字や引用文字を使用する場合には 追加のパラメータを指定できます

Note: 各ファイルが適切にタイトル付けられた i.e. train.csv test.csv dev.csv、分割 CSV データファイルを data_folder パスにセーブする必要があります。

from flair.data import Corpus
from flair.datasets import CSVClassificationCorpus

# this is the folder in which train, test and dev files reside
data_folder = '/path/to/data'

# column format indicating which columns hold the text and label(s)
column_name_map = {4: "text", 1: "label_topic", 2: "label_subtopic"}

# load corpus containing training, test and dev data and if CSV has a header, you can skip it
corpus: Corpus = CSVClassificationCorpus(data_folder,
                                         column_name_map,
                                         skip_header=True,
                                         delimiter='\t',    # tab-separated files
) 

 

FastText 形式

CSVClassificationCorpus を使用することが実際的でない場合、貴方のデータを FastText 形式にフォーマットしても良いです、そこではファイルの各行はテキスト・ドキュメントを表します。ドキュメントは prefix __label__ で始まる行の最初で定義される 1 つか複数のラベルを持つことができます。これはこのように見えます :

__label__<label_1> <text>
__label__<label_1> __label__<label_2> <text>

前に言及したように、テキスト分類タスクのための Corpus を作成するためには、一つのフォルダにある上の形式の 3 ファイル (train, dev と test) を持つ必要があります。IMDB タスクのためのこのデータフォルダ構造は、例えばこのように見えます :

/resources/tasks/imdb/train.txt
/resources/tasks/imdb/dev.txt
/resources/tasks/imdb/test.txt

今はこのフォルダ (/resources/tasks/imdb) を指すことにより ClassificationCorpus を作成します。それによって、ファイルの各行はラベルでアノテートされる Sentence オブジェクトに変換されます。

Attention: 行のテキストは複数のセンテンスを持つ可能性があります。従って、Sentence オブジェクトは実際には複数のセンテンスから成る可能性があります。

from flair.data import Corpus
from flair.datasets import ClassificationCorpus

# this is the folder in which train, test and dev files reside
data_folder = '/path/to/data/folder'

# load corpus containing training, test and dev data
corpus: Corpus = ClassificationCorpus(data_folder,
                                      test_file='test.txt',
                                      dev_file='dev.txt',
                                      train_file='train.txt')

コーパス initializer はフォルダの train, dev と test 分割を自動的に探すメソッドを持つことに再度注意してください。
従って殆どの場合ファイル名を貴方自身で指定する必要はありません。しばしば、これで十分です :

# this is the folder in which train, test and dev files reside
data_folder = '/path/to/data/folder'

# load corpus by pointing to folder. Train, dev and test gets identified automatically. 
corpus: Corpus = ClassificationCorpus(data_folder)
 

以上