NER 数据模板
模板中的标记作为占位符,用实际的数据去填充。
根据占位符生成样本
tag2sample = {
'PER': ('person',per_data),
'LOC': ('address',loc_data),
'ORG': ('organization',org_data)
}
def replace_tag(tag):
tag = tag.strip('<>')
for k, v in tag2sample.items():
if tag.startswith(k):
return (v[0], random.choice(v[1]))
else:
raise Exception(f"Unkown tag: {tag}")
# 例如: replace_tag('<LOC2>')
# 输出: ('address', '天津市东丽区金钟街道悦和里1号楼1401')
生成样本
- 随机选取模板
- 随机选取样例数据
- 使用find函数完成位置标记
import re
from collections import defaultdict
def find_entity(long_str, sub_str): # 查找子串在长串中的所有位置
if len(sub_str) <= 0:
return []
positions = []
l = len(sub_str)
start = 0
while True:
pos = long_str.find(sub_str, start)
if pos == -1:
break
positions.append([pos, pos+l-1])
start = pos + len(sub_str)
return positions
data = []
for _ in tqdm(range(10000)):
template = random.choice(templates)
tags = re.findall('<.*?>', template)
sentence = template
labels = defaultdict(dict)
for tag in tags:
label, tag_sample = replace_tag(tag)
labels[label][tag_sample] = []
sentence = sentence.replace(tag, tag_sample)
for label in labels:
for entity in labels[label]:
labels[label][entity] = find_entity(sentence, entity)
data.append({'text': sentence, 'label': dict(labels)})