【娱乐圈明星知识图谱2】信息抽取

目录

1. 项目介绍

2. 信息抽取介绍

3. ChatGPT 信息抽取代码实战

4. 信息抽取主逻辑

5. 项目源码


1. 项目介绍

利用爬虫项目中爬取的大量信息

【娱乐圈明星知识图谱1】百科爬虫_Encarta1993的博客-CSDN博客娱乐圈明星知识图谱百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫百度百科爬虫https://blog.csdn.net/u014147522/article/details/131160490从中抽取出可结构化的关键信息。

此项目中我们比较关注

姓名

性别

生日

出生地

毕业学校

主要作品

这6个信息点。

2. 信息抽取介绍

信息抽取任务是指从文本中识别和提取特定类型的信息。这些信息可以是实体(如人名、地点、组织机构等)、关系(如人物之间的关联、物品属性等)或事件(如时间、动作、状态等)等。信息抽取任务通常包括以下步骤:

1. 实体识别:识别文本中的实体,例如人名、地点、组织机构等。

2. 关系识别:识别实体之间的关系,例如人物之间的关联、物品属性等。

3. 事件识别:识别文本中描述的事件,例如时间、动作、状态等。

4. 信息提取:从文本中提取出需要的信息,例如一个公司的总部所在地、某个人的联系方式等。

由于现在是 2023 年,大模型元年,NLP 任务全部被大模型统一了。因此,本项目使用 ChatGPT 来做信息抽取。

  • 大模型

大语言模型(LLM)是一种预训练的深度学习模型,可以用于各种自然语言处理任务,包括信息抽取。信息抽取是从非结构化文本中提取结构化信息的过程。LLM可以通过学习大量的文本数据来提高其在信息抽取任务中的性能。LLM通常使用自监督学习来预训练,这意味着它可以从未标记的数据中学习,而不需要人工标注数据。LLM可以通过多种方式进行微调,以适应不同的信息抽取任务。

  • ChatGPT

ChatGPT是由OpenAI开发的人工智能聊天机器人,它使用了基于GPT-3.5和GPT-4的大型语言模型,能够理解和学习人类的语言,进行自然的对话和互动。ChatGPT不仅可以聊天,还能完成各种任务,如写邮件、视频脚本、文案、翻译、代码、论文等。

3. ChatGPT 信息抽取代码实战

大模型的交互主要是使用 Prompt。

Prompt是一种用于指导大型语言模型生成自然语言文本的文本片段。在使用大型语言模型时,我们需要提供一个Prompt,以指导模型产生符合我们期望的文本结果。Prompt可以是一个单词、一句话、一段话或一个完整的篇章。

import openai

from utils import get_api_key


openai.api_key = get_api_key()


def call_gpt(context):
    prompt = "\n\n\n根据上文中给定的介绍细节,请仔细找出或推测出这个人的‘姓名、性别、生日、出生地、毕业学校、主要作品’这6个信息点,如果没有则用空字符串代替,并按照json格式输出,如果value有多个则按照jsonarray输出"
    content = context + prompt

    messages = [
        {
            'role': 'system', 
            'content': '你是一个自动信息抽取专家机器人。'
        }
    ]
    messages.append(
        {
            'role': 'user', 
            'content': content
        }
    )

    response = openai.ChatCompletion.create(
        model='gpt-3.5-turbo',
        messages=messages,
    )

    return response["choices"][0]["message"]["content"]


if __name__ == "__main__":
    context = "黄晓明,1977年11月13日出生于山东省青岛市市南区,中国内地影视男演员、流行乐歌手,毕业于北京电影学院表演系"
    result = call_gpt(context=context)
    print(result)


执行上面代码可得到:

{
  "姓名": "黄晓明",
  "性别": "男",
  "生日": "1977年11月13日",
  "出生地": "山东省青岛市市南区",
  "毕业学校": "北京电影学院",
  "主要作品": ""
}

可以看出非常满足我们信息抽取的要求。

4. 信息抽取主逻辑

本项目中主要是对前一项目中爬取的明星信息做抽取。以下是其中一条爬到的数据:

{
    "title": "黄晓明",
    "url": "https://baike.baidu.com/item/黄晓明/6597",
    "summary": "\n黄晓明,1977年11月13日出生于山东省青岛市,中国内地男演员、歌手,毕业于北京电影学院表演系\n[1-2]  。1998年主演个人首部电视剧《爱情不是游戏》进入演艺圈\n[3] \n。2001年凭借古装剧《大汉天子》获得关注\n[4] \n。自2005年起连续10年入选“福布斯中国名人榜”\n[5] \n。2006年参演古装片《夜宴》\n[378] \n。2007年主演民国剧《新上海滩》\n[440] \n;同年发行个人首张专辑《It's Ming》\n[382] \n 。2009年凭借歌曲《好人卡》获得北京流行音乐典礼年度金曲奖\n[391] \n。2010年凭借谍战片《风声》获得第17届北京大学生电影节最受欢迎男演员奖\n[6] \n。2011年成立黄晓明工作室\n[383] \n。2013年凭借剧情片《中国合伙人》获得中国电影金鸡奖、中国电影华表奖、大众电影百花奖最佳男主角奖\n[7-9]   。2015年成为首位在好莱坞中国剧院留下手印的中国内地男演员\n[10] \n。2016年凭借史诗片《大唐玄奘》获得第13届中国长春电影节最佳男主角奖\n[11] \n。2017年主演古装剧《琅琊榜之风起长林》\n[12] \n。2018年主演爱情片《无问西东》上映\n[13] \n。2019年凭借剧情片《烈火英雄》该片获得第35届大众电影百花奖最佳男主角奖、第33届中国电影金鸡奖最佳男主角奖\n[15-16]  ;同年担任第32届中国电影金鸡奖评委\n[17] \n。2020年主演民国剧《鬓边不是海棠红》\n[380] \n。2021年主演年代剧《光荣与梦想》播出\n[377] \n。演艺事业外,他还热心于公益慈善\n[390] \n。2008年担任中国儿童少年基金会形象大使。2009年担任联合国儿童基金香港委员会儿童基金会爱心大使\n[18] \n。2014年当选山东省十大杰出青年\n[19] \n,同年成立“黄晓明明天爱心基金”。2016年担任中国保护大熊猫研究中心形象大使\n[20] \n。\n",
    "basic-info": "\n\n中文名\n\n黄晓明\n\n外文名\n\nHuang Xiaoming\n\n别    名\n\n教主、猫、钢钉侠、熊猫明\n[376] \n、囧明\n\n国    籍\n\n中国\n\n民    族\n\n汉族\n\n出生地\n\n山东省青岛市市南区\n\n出生日期\n\n1977年11月13日\n\n星    座\n\n天蝎座\n\n血    型\n\nO型\n\n身    高\n\n179 cm\n[21] \n\n毕业院校\n\n北京电影学院\n\n职    业\n\n演员、歌手\n[22] \n\n经纪公司\n\n黄晓明工作室\n\n代表作品\n\n中国合伙人、风声、烈火英雄、无问西东、大唐玄奘、大上海、撒娇女人最好命、大汉天子、神雕侠侣、新上海滩、暗香、精忠岳飞、鬓边不是海棠红、匹夫、锦绣缘华丽冒险、琅琊榜之风起长林、赵氏孤儿、鹿鼎记、玫瑰之战、暗恋、什么都可以、缘、精忠传奇、就算没有明天\n\n\n\n主要成就\n\n第29届中国电影金鸡奖最佳男主角奖\n第32届大众电影百花奖最佳男主角奖\n第15届中国电影华表奖优秀男演员奖\n第32届中国电影金鸡奖评委\n第13届中国长春电影节最佳男主角奖\n\n展开\n\n\n\n主要成就\n\n第29届中国电影金鸡奖最佳男主角奖\n第32届大众电影百花奖最佳男主角奖\n第15届中国电影华表奖优秀男演员奖\n第32届中国电影金鸡奖评委\n第13届中国长春电影节最佳男主角奖\n\n第17届北京大学生电影节最受欢迎男演员\n第10届华语电影传媒大奖最具人气男演员\n第11届华语电影传媒大奖最受瞩目男演员\n山东省十大杰出青年称号\n[23] \n联合国艾滋病规划署中国亲善大使\n[24] \n中国电影家协会青年和新文艺群体工作委员会会长\n[25] \n第12届中国长春电影节最佳男主角奖\n第35届大众电影百花奖最佳男主角奖\n第33届中国电影金鸡奖最佳男主角奖\n[26] \n\n收起\n\n\n\n\n\n公益基金\n\n黄晓明明天爱心基金\n\n生    肖\n\n蛇\n\n影友会\n\n明教\n\n性    别\n\n男\n\n\n"
}

我们需要对每条爬到的数据依次进行抽取

import json
import random
import time
from tqdm import tqdm
from extractor import call_gpt


def main():
    with open("data/person.jsonl", "r", encoding="utf-8") as f:
        data = [i.strip() for i in f.readlines() if i.strip()]

    with open("data/result.jsonl", "w", encoding="utf-8") as f:
        for line in tqdm(data):
            line = json.loads(line)
            query = line["title"] + "\n\n\n" + line["summary"] + "\n\n\n" + line["basic-info"] + "\n\n\n"
            url = line["url"]
            try:
                res = call_gpt(query)
                f.write(json.dumps(json.loads(res), ensure_ascii=False) + "\t" + url + "\n")
            except KeyboardInterrupt:
                break
            except:
                print("error")
                time.sleep(120)
                continue
            
            time.sleep(random.random() * 3)
            


if __name__ == "__main__":
    main()

其中,person.jsonl 来自上一个爬虫项目中,执行完这个代码可以得到 result.jsonl,即信息抽取的结果。

5. 项目源码

https://gitee.com/hl0929/baike-extractor

你可能感兴趣的:(项目,知识图谱,人工智能)