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. 参考
日本語で固有表現抽出を行うには、次が参考になります。
この記事が気に入ったらサポートをしてみませんか?