自定義NER tag後進行訓練
keywords:
- token classification trainer
- token classification from pre-train
主要知識點:
- 自定義tag_name然後訓練
- 從dataframe轉成dataset物件
- 從dictionary轉成dataset物件
- 切分訓練驗證datasets
- 執行bert訓練
程式碼
資料來源
twitter_nlp/data/annotated/wnut16 at master · aritter/twitter_nlp (github.com)
預處理後的資料格式
預處理之前的來源資料百百種,總之預處理後,至少要包含tokens和ner_tags兩個欄位,而且為避免許多麻煩這兩個名稱請不要改。
- tokens: list, [[單字, 單字,…], [單字, 單字,…], …] 單字:str
- ner_tage: list, [[tag, tag, … ], [tag,tag,…],…] tag:str

定義tag_name
tag_name就是所有ner_tags欄位的元素類型。如果你是拿別人的dataset,可以用下面的程序取得
def get_tag_name(df):
tag_name = []
assert isinstance(df, pd.DataFrame), '輸入要是pd.Series,也就是dataframe的ner_tags欄位'
for i in df.ner_tags:
tag_name += [e for e in list(set(i)) if not e in tag_name]
return tag_name
tag_name = get_tag_name(df)

DataFrame to dataset
下面的程序可以將單一個dataFrame轉成huggingFace用的dataset物件,接著dataset物件可以透過切分,並透過DatasetDict
來組成包含train, test, valid等複合資料的大資料集。
如果你有自己切分df_train或df_test等等,請看更下面的程式碼區塊。
df_to_dataset
from datasets import Dataset, ClassLabel, Sequence, Features, Value, DatasetDictdef df_to_dataset(df, columns=['ner_tags', 'tokens']):
assert set(['ner_tags', 'tokens']).issubset(df.columns) ner_tags = df['ner_tags'].map(tags.str2int).values.tolist()
tokens = df['tokens'].values.tolist() assert isinstance(tokens[0], list)
assert isinstance(ner_tags[0], list)
d = {'ner_tags':ner_tags, 'tokens':tokens}# 如果有其他欄位例如id, spans請從這裡添加
# create dataset
dataset = Dataset.from_dict(mapping=d,
features=Features(dataset_structure),)
return dataset
只有一個df_train,或只有一個來源
dataset = df_to_dataset(df)
train = dataset.train_test_split(test_size=0.1)
# Split the 10% test + valid in half test, half valid
test_valid = train['test'].train_test_split(test_size=0.5)
# gather everyone if you want to have a single DatasetDict
dataset = DatasetDict({
'train': train['train'],
'test': test_valid['test'],
'valid': test_valid['train']})label_names = dataset["train"].features["ner_tags"].feature.names
自己有先切分df_train或df_test,或有多個來源
df_train
df_testdataset_train = df_to_dataset(df_train, columns=['ner_tags', 'tokens'])
dataset_test = df_to_dataset(df_test, columns=['ner_tags', 'tokens'])dataset_train = dataset.train_test_split(test_size=0.1)
dataset = DatasetDict({
'train': dataset_train['train'],
'test': dataset_test,
'valid': dataset_train['train']})label_names = dataset_train["train"].features["ner_tags"].feature.names
完成資料集建立後,後續大概就是單純訓練,請直接看最上面的colab程式碼就好。