背景
使用大语言模型做实体识别的实验时,发现大模型关于实体的边界预测一直不准。
主要原因在于当时找了很多同学标注数据,由于不同组同学关于实体的边界没有统一,故导致数据集中实体边界也没统一。
(找太多人标,会有这样的缺点)
如果重新标注数据,那么之前的标的数据就浪费了,而且又得折腾人来标。
虽然之前标的数据不好,但训练出的大模型,还是学到了一些东西。于是便打算让训练后的大模型预测,将大模型预测的结果导入到Doccano,再人工修正大模型预测不准的实体,这样可以减轻人工标注压力还能轻易获得更多的数据集。
简介
- 展示大模型预测输出的数据格式;
- 展示Doccano 命名实体识别导入的数据集格式;
- 提供将大模型输出数据转为Doccano 导入数据集格式代码;
大模型预测结果的样例如下:
{"instruction": "你是专门进行实体抽取的专家。请从text中抽取出符合schema定义的实体,不存在的实体类型返回空列表。请按照JSON字符串的格式回答。schema:['数据', '项目', '任务'], text:三大攻坚战取得关键进展", "input": "", "output": "{\"数据\": [], \"项目\": [\"三大攻坚战\"], \"任务\": []}", "predict": {"数据": [], "项目": ["三大攻坚战取得关键进展"], "任务": []}
}
Doccano 导入的数据集样例如下:
{"id":17168,"text":"三大攻坚战取得关键进展","label":[[0,5,"任务"]],"Comments":[]}
大模型输出数据转为Doccano 代码
找出模型预测的实体,在text句子的开始下标和结束下标:
def find_substring_indices(parent_string, substring): start_index = parent_string.find(substring) if start_index != -1:end_index = start_index + len(substring)return start_index, end_index else: return -1, -1
import redef tran_llm_doccano(input_file, output_file, schema):doccano_format = {"text": None,"label": [],"Comments": []}def _find_text(text):pattern = r'text:(.*?)",' match = re.search(pattern, text, re.MULTILINE)text_content = match.group(1)return text_contentwith open(input_file, 'r') as f:with open(output_file, 'w') as w:for line in f:text = _find_text(line)doccano_format["text"] = textdata = json.loads(line)predict = data["predict"]tmp = []for ent_cls in schema:for predict_ent_name in predict[ent_cls]:start_idx, end_idx = find_substring_indices(text, predict_ent_name)if start_idx == -1 or end_idx == -1:continuetmp.append([start_idx, end_idx, ent_cls])doccano_format["label"] = tmpw.write(json.dumps(doccano_format, ensure_ascii=False) + '\n')schema = ['数据', '项目', '任务']
tran_llm_doccano('data.jsonl', "doccano_import.jsonl", schema)
tran_llm_doccano(input_file, output_file, schema)
:
- input_file 大模型预测的结果文件;
- output_file 到入到 doccano的文件;
- schema 实体类别;
将 大模型的预测结果转换后的Doccano格式的 output_file 文件,导入到Doccano的结果如下图所示:
开源
完整的代码点击查看: https://github.com/JieShenAI/csdn/blob/main/24/04/tran_llm_doccano/tran_llm_doccano.ipynb