chatgpt实现NLP基本任务(实体识别、关系抽取、属性抽取、事件抽取、文本分类)

前置:基础函数

import openai
import time
from tqdm import tqdm


def chatgpt_function(content, key=None):
    openai.api_key = key
    print("问题为:{}".format(content))
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {
    
    "role": "system", "content": "你是一个自然语言处理模型,用于完成NLP基础任务"},
                {
    
    "role": "user", "content": content}
            ],
            temperature=0.1
        )
    except openai.error.APIConnectionError as error:
        print(error)
        time.sleep(120)
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {
    
    "role": "system", "content": "你是一个自然语言处理模型,用于完成NLP基础任务"},
                {
    
    "role": "user", "content": content}
            ],
            temperature=0.1
        )
    return response["choices"][0]["message"]["content"]

一、实体识别

抽取文本:
驻港部队从1993年初开始组建,1996年1月28日组建完毕,1997年7月1日0时进驻香港,取代驻港英军接管香港防务,驻港军费均由中央人民政府负担。《中华人民共和国香港特别行政区驻军法》规定了驻香港部队的职责为防备和抵抗侵略,保卫香港特别行政区的安全以及在特别时期(战争状态、香港进入紧急状态时 )根据中央人民政府决定在香港特别行政区实施的全国性法律的规定履行职责。

代码:

# 实体识别
def entity_extraction(sentence):
    entities = ["时间", "地点", "人物", "国家地区", "组织机构"]
    prompt = "你现在需要完成一个实体识别任务,定义的实体类别有:" + "、".join(entities) + "\n要求:1、输出格式表示为实体名:实体类型;2、输出的每个结果用换行符分割;3请从给定的句子中抽取,不要自行总结。\n" + f"句子:{
      
      sentence}"
    result = chatgpt_function(prompt, key="your key")
    print("实体识别完毕!")
    print("答案为:\n{}".format(result))
    return result

结果:
驻港部队:组织机构
1993年初:时间
1996年1月28日:时间
1997年7月1日0时:时间
香港:地点
驻港英军:组织机构
中央人民政府:组织机构
中华人民共和国香港特别行政区驻军法:组织机构
防备和抵抗侵略:组织机构
保卫香港特别行政区的安全:组织机构
特别时期:时间
战争状态:时间
香港进入紧急状态时:时间
中央人民政府决定:组织机构
香港特别行政区:地点
全国性法律:组织机构

二、关系抽取

抽取文本:
糖尿病是一种常见的慢性疾病,主要症状包括多饮、多尿、乏力、体重下降等。发病人群通常是肥胖、家族病史、不良饮食习惯等高风险人群。治疗方法主要包括定期血糖检测、饮食控制、锻炼、药物治疗和胰岛素注射。治愈周期因不同患者而异,但坚持正确的治疗和生活方式改变,能有效控制病情、预防并发症的发生。

代码:

# 关系抽取
def relation_extraction(sentence):
    relations = ["疾病-症状-症状", "疾病-发病人群-发病人群", "疾病-治愈周期-治愈周期", "疾病-治疗方法-治疗方法"]
    prompt = "你现在需要完成一个关系抽取任务,定义的关系三元组有:" + "、".join(relations) + "\n要求:1、输出格式表示为头实体-关系-尾实体;2、输出的每个结果用换行符分割;3请从给定的句子中抽取,不要自行总结。\n" + f"句子:{
      
      sentence}"
    result = chatgpt_function(prompt, key="your key")
    print("关系抽取完毕!")
    print("答案为:\n{}".format(result))
    return result

结果:
糖尿病-症状-多饮
糖尿病-症状-多尿
糖尿病-症状-乏力
糖尿病-症状-体重下降
糖尿病-发病人群-肥胖
糖尿病-发病人群-家族病史
糖尿病-发病人群-不良饮食习惯
糖尿病-治疗方法-定期血糖检测
糖尿病-治疗方法-饮食控制
糖尿病-治疗方法-锻炼
糖尿病-治疗方法-药物治疗
糖尿病-治疗方法-胰岛素注射
糖尿病-治愈周期-因不同患者而异
糖尿病-治愈周期-坚持正确的治疗和生活方式改变

三、属性抽取

抽取文本:
该款智能手机搭载高通骁龙处理器,内置5000mAh电池,支持快充功能,采用6.5英寸全高清显示屏,照方面具备6400万像素后置摄像头和1600万素前置摄像头。操作系统为Android 11,存储容量64GB,可扩展至512GB。
代码:

# 属性抽取
def property_extraction(sentence):
    properties = ["处理器", "电池容量", "功能", "屏幕尺寸", "分辨率", "后置摄像头像素", "前置摄像头像素", "操作系统", "存储容量"]
    prompt = "你现在需要完成一个属性抽取任务,定义的属性有:" + "、".join(properties) + "\n要求:1、输出格式表示为属性名-属性值;2、输出的每个结果用换行符分割;3请从给定的句子中抽取,不要自行总结。\n" + f"句子:{
      
      sentence}"
    result = chatgpt_function(prompt, key="your key")
    print("属性抽取完毕!")
    print("答案为:\n{}".format(result))
    return result

结果:
处理器-高通骁龙处理器
电池容量-5000mAh
功能-快充功能
屏幕尺寸-6.5英寸
分辨率-全高清
后置摄像头像素-6400万像素
前置摄像头像素-1600万像素
操作系统-Android 11
存储容量-64GB

四、事件抽取

抽取文本:
当地时间7月5日,俄罗斯铁路公司发布消息表示,俄罗斯铁路网站和移动应用程序遭受大规模黑客攻击。
代码:

# 事件抽取
def event_extraction(sentence):
    event_types = ["黑客攻击", "台风", "恐怖袭击"]
    event_roles = ["时间", "地点", "事件主体", "事件客体", "造成影响"]
    prompt = "你现在需要完成一个事件抽取任务,定义的事件类型有:" + "、".join(event_types) + ",定义的事件论元有:" + "、".join(event_roles) + "\n要求:1、首先输出事件类型并换行,输出事件论元格式表示为论元名-内容;2、输出的每个结果用换行符分割;3请从给定的句子中抽取,不要自行总结。\n" + f"句子:{
      
      sentence}"
    result = chatgpt_function(prompt, key="your key")
    print("事件抽取完毕!")
    print("答案为:\n{}".format(result))
    return result

结果:
事件类型:黑客攻击

事件论元:
时间-当地时间7月5日
地点-俄罗斯
事件主体-俄罗斯铁路公司
事件客体-俄罗斯铁路网站和移动应用程序
造成影响-大规模黑客攻击

五、文本分类

抽取文本:
中国国家女子足球队将于7月7日从广州出发,飞赴澳大利亚阿德莱德队伍大本营,踏上2023年女足世界杯之旅。抵达澳大利亚之后,队伍还计划于13日和17日分别与巴西国家女子足球队和哥伦比亚国家女子足球队进行热身赛。
代码:

# 文本分类
def text_classification(sentence):
    types = ["体育", "军事", "娱乐"]
    prompt = "你现在需要完成一个文本分类任务,定义的文本类型有:" + "、".join(types) + "\n要求:1、仅输出文本类型。\n" + f"句子:{
      
      sentence}"
    result = chatgpt_function(prompt, key="your key")
    print("文本分类完毕!")
    print("答案为:\n{}".format(result))
    return result

结果:
体育

六、可能存在的问题(报错)

1.需要挂梯子
2.可能挂了梯子仍然会报错,解决办法是修改openai的源码,增加代理地址。
在这里插入图片描述
可见:https://blog.csdn.net/weixin_56572465/article/details/129971406
3.还有这些报错:openai.error.ServiceUnavailableError: The server is overloaded or not ready yet.

猜你喜欢

转载自blog.csdn.net/m0_46275020/article/details/131559404