見出し画像

Simple Transformers 入門 (2) - 固有表現抽出

Simple Transformers」で「固有表現抽出」を行う方法をまとめました。

1. 固有表現抽出

固有抽出表現」(NER : Named Entity Recognition)とは、「固有表現」(組織名、人名、場所名、日付、金額など)をテキスト中から抽出するタスクです。トークンを分類するタスクでもあります。

利用例は、次のとおりです。

・大量の記事から、特定の企業の情報を抽出。
・メールの文面から、スケジュール登録。
・AIアシスタントで音声をテキスト化したものから、命令を認識。

サポートモデルは、次のとおりです。

・BERT
・CamemBERT
・DistilBERT
・ELECTRA
・RoBERTa
・XLM-RoBERTa

「固有表現抽出」の最小限のコードは、次のとおりです。

from simpletransformers.ner import NERModel
import pandas as pd
import logging

# ログの設定
logging.basicConfig(level=logging.INFO)
transformers_logger = logging.getLogger("transformers")
transformers_logger.setLevel(logging.WARNING)

# 訓練データ
train_data = [
    [0, 'Simple', 'B-MISC'],
    [0, 'Transformers', 'I-MISC'],
    [0, 'started', 'O'],
    [1, 'with', 'O'],
    [0, 'text', 'O'],
    [0, 'classification', 'B-MISC'],
    [1, 'Simple', 'B-MISC'],
    [1, 'Transformers', 'I-MISC'],
    [1, 'can', 'O'],
    [1, 'now', 'O'],
    [1, 'perform', 'O'],
    [1, 'NER', 'B-MISC']
]
train_df = pd.DataFrame(train_data, columns=['sentence_id', 'words', 'labels'])

# 評価データ
eval_data = [
    [0, 'Simple', 'B-MISC'],
    [0, 'Transformers', 'I-MISC'],
    [0, 'was', 'O'],
    [1, 'built', 'O'],
    [1, 'for', 'O'],
    [0, 'text', 'O'],
    [0, 'classification', 'B-MISC'],
    [1, 'Simple', 'B-MISC'],
    [1, 'Transformers', 'I-MISC'],
    [1, 'then', 'O'],
    [1, 'expanded', 'O'],
    [1, 'to', 'O'],
    [1, 'perform', 'O'],
    [1, 'NER', 'B-MISC']
]
eval_df = pd.DataFrame(eval_data, columns=['sentence_id', 'words', 'labels'])

# モデルの作成
model = NERModel('bert', 'bert-base-cased', args={'overwrite_output_dir': True, 'reprocess_input_data': True})

# 学習
model.train_model(train_df)

# 評価
result, model_outputs, predictions = model.eval_model(eval_df)

# 予測
predictions, raw_outputs = model.predict(["Some arbitary sentence"])
print(predictions)

◎ 学習データと評価データ
学習データと評価のデータは、3列のDataFrameです。sentence_id列word列label列が含まれている必要があります。

◎ 予測結果
予測結果は、次のとおりです。

[[{'Some': 'I-PER'}, {'arbitary': 'I-MISC'}, {'sentence': 'I-PER'}]]

2. 固有表現抽出のデータセット

主な「固有表現抽出」のデータセットは、次のとおりです。

CoNLL 2003

◎ CoNLL 2003
「CoNLL 2003」は、1,393件の英語のニュース記事の固有表現に LOC (場所)、ORG (組織)、PER (人)、MISC (その他) の情報をタグ付けしたデータセットです。
スペース区りの4列で、各単語は行別に配置され、各文の最後は空行にします。各行の1列目は単語、2列目は品詞、3列目はチャンク、4列目は固有表現になります。

  U.N.         NNP  I-NP  I-ORG 
  official     NN   I-NP  O 
  Ekeus        NNP  I-NP  I-PER 
  heads        VBZ  I-VP  O 
  for          IN   I-PP  O 
  Baghdad      NNP  I-NP  I-LOC 
  .            .    O     O 
      :

固有表現は、次のとおりです。

・O : 固有表現外
・B-MIS : 別のその他の直後のその他の始まり
・I-MIS : その他
・B-PER : 別の人物名の直後の人物名の始まり
・I-PER : 人物名
・B-ORG : 別の組織の直後の組織の始まり
・I-ORG : 組織
・B-LOC : 別の場所の直後の場所の始まり
・I-LOC : 場所

3. NERModel

「NERModel」は、「固有表現抽出」で使用するクラスです。

◎ コンストラクタ
コンストラクタの書式は、次のとおりです。

NERModel (model_type, model_name, labels=None, args=None, use_cuda=True)

パラメータは、次のとおりです。

・model_type : (required) str - モデル種別(bert, xlnet, xlm, roberta)。
・model_name : (required) str -  Huggingface Transformersの事前学習済みモデル名、またはモデルファイルを含むディレクトリへのパス。
・labels : (optional) - 固有表現ラベル。デフォルトは  ["O", "B-MISC", "I-MISC", "B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC"]。
・args : (optional) - オプション引数。
・use_cuda : (optional) bool - CUDAを使用するかどうか。
・cuda_device : (optional) str - CUDAデバイス。

◎ クラス属性

・tokenizer : トークナイザー。
・mode : モデル。
・model_name : Huggingface Transformersの事前学習済みモデル名、またはモデルファイルを含むディレクトリへのパス。
・device : デバイス。
・args : オプション引数。
・cuda_device : (optional) - DUDAデバイス。

◎ train_model()
学習します。

train_model(self, train_data, output_dir=None, args=None, eval_df=None)

パラメータは、次のとおりです。

・train_data : 学習データのDataFrame。
・output_dir : 出力ディレクトリ。
・show_running_loss : (optional) - 損失出力。
・args : (optional) - オプション引数。
・eval_df : (optional) - 評価データのDataFrame。

戻り値はありません。

◎ eval_model()
評価します。

eval_model(self, eval_data, output_dir=None, verbose=True)

パラメータは、次のとおりです。

・eval_data : 評価データのDataFrame。
・output_dir : 出力ディレクトリ。
・verbose : 詳細出力。

戻り値は、次のとおりです。

・result : 評価結果。
 (eval_loss、精度、再現率、f1_score)
・model_outputs : 生のモデル出力のリスト。
・preds_list : 予測されるタグのリスト。

◎ predict()
予測します。

predict(self, to_predict)

パラメータは、次のとおりです。

・to_predict : str - 予測するテキスト。

戻り値は、次のとおりです。

・preds : NERタグにマップされた各単語を含むdictを含むリストのPythonリスト。
・model_outputs : 生のモデル出力でリストにマップされた各単語を含むdictを含むリストのPythonリスト。

4. 参考

日本語で固有表現抽出を行うには、次が参考になります。



この記事が気に入ったらサポートをしてみませんか?