当前位置:首页|资讯|ChatGPT|大语言模型|提示工程

使用 ChatGPT 进行命名实体识别 (NER)

作者:来点技术吧发布时间:2024-07-11

与其他 ChatGPT 不同,但在这里我们将尝试了解如何将promptify与 ChatGPT 等 LLM(大型语言模型)一起使用来执行命名实体识别(NER),以及这种方法如何比直接使用 ChatGPT 更为稳健。

什么是提示工程和提示

提示工程是一种自然语言处理 (NLP) 概念,涉及发现/创建产生理想或有用结果的输入。提示相当于告诉神灯里的精灵该做什么。在这种情况下,神灯是Chat-GPT,随时准备回答我们的任何问题,而promtify用于构建和构造我们的问题,以便像 ChatGPT 这样的 LLM 能够更好地理解问题并提供理想的结果。

什么是命名实体识别(NER)

实体可以定义为文本中的关键信息。实体可以是单个单词或一组单词。命名实体识别(NER)可以定义为识别和分类 文本中的实体(关键信息)的过程。


这里的人、国家和职位是实体所属的组/类,识别这些实体及其所属组的过程称为命名实体识别(NER)。

Promptify 到底是做什么的?


像 ChatGPT 这样的 LLM 的输入和输出通常是纯非结构化文本,但是当你将它与某些参数(其中许多是可选的)一起通过 promptify 时,promtify 会向这些 LLM 发送一个结构化的输入,这相当于提出一个结构正确的问题,这将有助于这些 LLM 更好地理解问题。然后,LLM 的输出将作为python 对象返回。

输出 - 普通 ChatGPT 与 Promtify+ChatGPT

我们将要求 ChatGPT 对纯文本执行命名实体识别,我们还将判断输入句子属于哪个域,然后我们将尝试使用 promptify 提供相同的输入并观察响应。

ChatGPT 输出结构很有可能在重试时发生变化,并且在应用程序中使用此输出相对困难,因为结构可能会因每个查询而异。

Promtify+ChatGPT 实体 (E) 及其对应的类/类型 (T) 作为 python 对象从 promptify 返回。您还可以观察到,当通过 promptify 传递时,会识别出更多实体。现在,相对而言,这是一个更强大的输出,可以轻松地在应用程序中使用。


现在让我们来看看 promptify 的 python 实现,代码实现是使用google colab完成的,以帮助更好地解释......

Promptify - ChatGPT

 %%capture
 !git clone https://github.com/promptslab/Promptify.git
 !pip3 install openai

克隆 promptify 存储库并安装 openai 库

 # 定义 OpenAI 模型的 API 密钥
 api_key  = "" # 创建 OpenAI 模型的实例,目前支持 Openai 的所有模型,未来将添加来自 Hugginface 和其他平台的更多生成模型
 model = OpenAI(api_key)
 nlp_prompter = Prompter(model)

创建 OpenAI 模型的一个实例并将其传递给 promptify 的Prompter,现在您有一个对象,您可以将提示与所需的参数一起传递到其中。

 # 发送至 GPT 的例句
 sent = "The patient is a 93-year-old female with a medical history of chronic right hip pain, osteoporosis, hypertension, depression, and chronic atrial fibrillation admitted for evaluation and management of severe nausea and vomiting and urinary tract infection"

此示例输入与医疗领域相关,涉及患者的医疗状况。

仅用两行代码即可实现命名实体识别

 # 无标签、无描述、无样本、无示例的命名实体识别
 # 带有说明的简单提示
 # 域名为模型提供了更多信息以便生成更好的结果,该参数是可选的
 # 输出是 python 对象-> [ {'E' : Entity Name, 'T': Type of Entity } ]
 
 result = nlp_prompter.fit('ner.jinja',
                           domain      = 'medical',
                           text_input  = sent,
                           labels      = None)
 # Output
 pprint(eval(result['text']))


在输出:E -实体,T -实体所属的类型/类中 ,如果您观察输出,则输出是一个Python 对象,与 ChatGPT 的原始输出相比,其结构良好。promptify 的这个功能/特性在将 LLM 与应用程序集成时非常有用。域参数是可选的,将域传递给提示将产生更精确的响应。

这并不是 promptify 的全部内容...

用于命名实体识别 (NER) 的自定义标签

您还可以提供自定义标签,以便从提示中识别自定义标签及其对应的实体。

 # 如果只想使用自定义标签执行 NER(处理越界预测)提示
 result = nlp_prompter.fit('ner.jinja',
                           domain      = 'medical',
                           text_input  = sent,
                           labels      = ["SYMPTOM", "DISEASE"])
 
 # Output
 pprint(eval(result['text']))

您可以从输出中观察到,属于所提供的自定义标签的实体已被识别。

一次完成——命名实体识别(NER)

顾名思义,一次性学习是指模型通过一次训练数据进行理解的能力。这真是太神奇了,有了 GPT 这样强大的 LLM 和 promptify 的帮助,你就可以做到这一点。

 one_shot_training_data = "Leptomeningeal metastases (LM) occur in patients with breast cancer (BC) and lung cancer (LC). The cerebrospinal fluid (CSF) tumour microenvironment (TME) of LM patients is not well defined at a single-cell level. We did an analysis based on single-cell RNA sequencing (scRNA-seq) data and four patient-derived CSF samples of idiopathic intracranial hypertension (IIH)"
 one_shot_labelled_training_data = [[one_shot, [{'E': 'DISEASE', 'W': 'Leptomeningeal metastases'}, {'E': 'DISEASE', 'W': 'breast cancer'}, {'E': 'DISEASE', 'W': 'lung cancer'}, {'E': 'BIOMARKER', 'W': 'cerebrospinal fluid'}, {'E': 'DISEASE', 'W': 'tumour microenvironment'}, {'E': 'TEST', 'W': 'single-cell RNA sequencing'}, {'E': 'DISEASE', 'W': 'idiopathic intracranial hypertension'}]]]
 
 result = nlp_prompter.fit('ner.jinja',
                           domain      = 'medical',
                           text_input  = sent,
                           examples    = one_shot_labelled_training_data,
                           labels      = ["SYMPTOM", "DISEASE"])
 
 
 pprint(eval(result['text']))

在这里,你只向模型提供了 1 个带标签的数据,标签为SYMPTOMDISEASE,其中

  • E -实体所属的标签/类别

  • W -实体

您可以从输出中观察到,一次性训练数据中提供的特定标签(症状、疾病)的实体与其相应的标签一起被准确识别。

命名实体识别 - 利用领域知识

 # 如果想在提示中给出一些领域知识和描述以增强输出
 result = nlp_prompter.fit('ner.jinja',
                           domain      = 'clinical',
                           text_input  = sent,
                           examples    = one_shot_labelled_training_data,
                           description = "以下段落摘自一位患者的出院总结。该段落描述了患者的病情和症状。",
                           labels      = ["SYMPTOM", "DISEASE"])
 
 pprint(eval(result['text']))

如果您具有领域知识,在上述案例中是临床领域以及有关数据内容的简短描述,那么可以在描述参数中传递该知识,这将进一步提高输出的准确性。





Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1