基于开源大模型实现医疗实体识别自动标注

提示词设计

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条数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西门废物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值