提示词设计
1.本次,使用的数据集是收集的10000多条数据集。本次主要进行医疗实体识别,类别有以下几种类型:
实体类别 | 解释 |
---|---|
疾病 | 例如常见的高血压、糖尿病 |
症状 | 例如常见的肚子疼、发烧 |
人群 | 例如26岁年轻人 |
诱发因素 | 例如锻炼、不吃饭 |
检验 | 例如血压140,具体的检验结果 |
检查 | 例如手术、医院开的检查 |
科室 | 例如外科、呼吸内科 |
药品 | 例如吃的药品、水果、蔬菜 |
经过试验,使用的提示词为:
接下里你作为一名nlp工作者来进行实体识别,请提取句子《》关于疾病、症状、诱发因素、检验、检查、药品、人群、科室这八种对应的实体,输出格式为{'疾病': [], '症状': [], '诱发因素': [], '检验': [], '检查': [], '药品': [], '人群': [], '科室': []}
大模型预标注
采用的开源大模型通义千问72b,考虑到大模型本地化部署72b难度大,采用线上模型调用。key换成自己注册的
import os
key = ""
# export DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY
os.environ.setdefault('DASHSCOPE_API_KEY', key)
import random
from http import HTTPStatus
import dashscope
def call_with_messages():
text = "上环后出血可以做爱吗"
messages = [
{'role': 'user', 'content': "接下里你作为一名nlp工作者来进行实体识别,请提取句子《"+text+"》关于疾病、症状、诱发因素、检验、检查、药品、人群、科室这八种对应的实体,输出格式为{'疾病': [], '症状': [], '诱发因素': [], '检验': [], '检查': [], '药品': [], '人群': [], '科室': []}"}]
response = dashscope.Generation.call(
'qwen-72b-chat',
messages=messages,
# set the random seed, optional, default to 1234 if not set
seed=random.randint(1, 10000),
result_format='message', # set the result to be "message" format.
)
if response.status_code == HTTPStatus.OK:
print(response["output"]["choices"][0]["message"]["content"])
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
if __name__ == '__main__':
call_with_messages()
f1 = open("right.txt", "w", encoding="utf8")
f2 = open("low.txt", "w", encoding="utf8")
cc = 0
for line in open("data.txt", encoding="utf8"):
cc = cc+1
text = line.strip("\n")
print(cc,flush=True)
try:
result = call_with_messages(text)
if result:
tetx ="接下里你作为一名nlp工作者来进行实体识别,请提取句子《" + text + "》关于疾病、症状、诱发因素、检验、检查、药品、人群、科室这八种对应的实体,输出格式为{'疾病': [], '症状': [], '诱发因素': [], '检验': [], '检查': [], '药品': [], '人群': [], '科室': []}"
f1.write(tetx + "***" + result + "\n")
else:
f2.write(text + "\n")
except:
f2.write(text + "\n")
大模型结果预处理
大模型的结果有点一样难尽,所以基于规则进行简单的过滤。
import json,re
cc = 0
import jsonlines
al_ = []
for line in open("right.txt",encoding="utf8"):
line = line.strip("\n")
if "接下里你作为一名nlp工作者来进行实体识别" in line:
line = line.split("***")
try:
cc =cc+1
etx = line[0].replace("接下里你作为一名nlp工作者来进行实体识别,请提取句子《","").replace("》关于疾病、症状、诱发因素、检验、检查、药品、人群、科室这八种对应的实体,输出格式为{'疾病': [], '症状': [], '诱发因素': [], '检验': [], '检查': [], '药品': [], '人群': [], '科室': []}","")
temp = json.loads(line[1].replace("'", '"').replace(" ", '').strip(".").strip("]"))
my_result = []
for key,value in temp.items():
for element in value:
matches = re.finditer(element, etx)
for match in matches:
start = match.start()
end = match.end()
my_result.append([start,end,key])
al_.append({"text": etx, "label":my_result})
except:
pass
with jsonlines.open('data.jsonl', mode='w') as writer:
for item in al_:
writer.write(item)
最终预标注10000条数据