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 defaultdictdef find_entity(long_str, sub_str): # 查找子串在长串中的所有位置if len(sub_str) <= 0:return []positions = []l = len(sub_str)start = 0while True:pos = long_str.find(sub_str, start)if pos == -1:breakpositions.append([pos, pos+l-1])start = pos + len(sub_str)return positionsdata = []
for _ in tqdm(range(10000)):template = random.choice(templates)tags = re.findall('<.*?>', template)sentence = templatelabels = 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)})