HuggingFace NER教學範例

王柏鈞
6 min readNov 5, 2022

自定義NER tag後進行訓練

keywords:

  • token classification trainer
  • token classification from pre-train

主要知識點:

  • 自定義tag_name然後訓練
  • 從dataframe轉成dataset物件
  • 從dictionary轉成dataset物件
  • 切分訓練驗證datasets
  • 執行bert訓練

程式碼

Google Colab

資料來源

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
example for data format of pandas dataframe after data preprocessing

定義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)
tag_name的形式

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_test
dataset_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程式碼就好。

--

--