乐趣区

关于自然语言处理:使用GPT完成复杂场景命名实体识别

基于 Transformers 的深度生成学习模型曾经呈现了好几年,目前 GPT-3 和 GPT-J 是当今最先进的文本生成模型(目前风行的 ChatGPT 也在 GPT- 3 和 InstructGPT 的根底上进行进一步的研发)GPT 家族简直彻底改变了许多 NLP 的生态环境,明天咱们来探讨如何用 GPT 来进行传统的命名实体辨认工作。

这篇文章介绍如何应用 GPT 模型来进行命名实体辨认。应用 GPT 来做 NER 工作的长处是不须要再进行额定的标注工作。

1. 传统 NER 工作实现:SpaCy+NLTK

NER 是最原始最古老的 NLP 工作之一,也是在实在工业工作中被应用次数最多的 NLP 技术。传统的 NER 工作能够应用 spaCy 或者 NLTK 这种框架来进行,SpaCy 在很长一段时间内成为了 NER 工作的默认最优工具。

SpaCy 是一个 Python 自然语言解决工具包。SpaCy 的易用性很高,它提供了许多 pre-trained 语言模型,这些 NLP 模型能够反对提取地址、日期、货币等多种常见的实体类型。除此之外,SpyCy 在生产环境部署之后有着很高的运行效率。

NLTK 在生产环境中的效率和可用性不如 SpaCy,然而它能够满足学术研究的强度。NLTK 也提供了许多 pre-trained models,然而 NLTK 反对的默认实体类型要少于 SpaCy。

应用 SpaCy 或者 NLTK 的 pre-trained model 进行 NER 工作的最大问题是,他们仅仅反对无限的少数几种实体类别,通常是那些用于进行训练的实体类别。这些实体类别尽管经常出现,然而对于许多日常 NER 工作来说是齐全不够的(例如提取药品名字、提取职务职位、提取 VAT 卡号等等)。

许多 NER 我的项目只能为此额定创立一个新的数据集(而且规模还挺大的),通过新增标注类型定义、从新进行数据标注、从新训练,来实现针对非凡场景的 NER 工作。

GPT 大语言模型的呈现缓解了这种人力开销宏大的场景,咱们再也不必花工夫去筹备语料和标注数据了!

2. GPT 模型:OpenAI + NLP Cloud

2020 年五月,OpenAI 公布了大语言模型 GPT-3,GPT- 3 是一种基于 Transformer 的语言模型(LM),它有 1750 亿个参数。作为一种生成式模型,GPT- 3 最根底的利用场景是依据用户输出的文本,持续生成后续的文本内容,也就是常说的文本生成(text generation)。GPT 的文本生成性能能够很好的满足许多传统 NLP 模型能实现的工作,比如说 NER、摘要、翻译、分类等等。

3. 应用 NLP Cloud 进行 NER

GPT- 3 也有一些毛病,第一个毛病是 GPT- 3 的接口比拟贵并且被 OpenAI API 垄断(OpenAI 总是不开源,还不如说是 CloseAI),第二个毛病是基于云服务的大模型运行速度比较慢,第三个毛病是对于一些场景有点过于杀鸡用牛刀。

2021 年,EleutherAI 开源了 GPT- 3 的平替产品:GPT-J 和 GPT-NeoX 20B。这些模型不再被大公司的云服务所垄断,能够部署在任意的服务器上。不过 EleutherAI 的这些计划减少了运维部署方面的工作,也就是咱们还须要把握一些 MLOps 的技能。

NLP Cloud API 公司一方面提供了开放性的 GPT 服务,一方面又防止了部署运维等内容带来的额定复杂性。咱们能够应用它来进行疾速的 NLP 工作。这篇文章应用 NLP Cloud API 提供的 GPT- J 来进行代替。

3.1 筹备工作

注册、抉择付费计划,获取 API 的 token,下载 Python Client 安装包——

pip install nlpcloud

3.2 未应用 Prompt 提醒:失败……

假如咱们当初须要提取文本中的 工作头衔

咱们向 GPT 发问“Extract job titles from the following sentence”(提取以下文本中的工作头衔),这种发问形式十分直白,没有应用任何的提醒技术(Prompt Engineering),在没有应用 Prompt 技术的状况下,咱们很可能无奈失去称心的后果。

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""Extract job titles from the following sentence: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.
    """)
print(generation["generated_text"])

Output:

Extract job titles from the following sentence: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.1. Maxime works in the data science team at Auto Dataset.

咱们失败的起因是 GPT- 3 或者 GPT- J 这种生成式模型须要进行一些显著的提醒(Prompt)来加深对问题的了解,这种提醒也能够了解成一种“few-shot learning”。

3.3 应用 Prompt 提醒:胜利!

Prompt 没有想的那么玄乎,它就是在咱们的正式问题之前提供一些文本模板,上面是一些实例——

Let’s try again with 3 examples in the prompt:

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""
    [Text]: Helena Smith founded Core.ai 2 years ago. She is now the CEO and CTO of the company and is building a team of highly skilled developers in machine learning and natural language processing.
    [Position]: CEO and CTO
    ###
    [Text]: Tech Robotics is a robot automation company specialized in AI driven robotization. Its Chief Technology Officer, Max Smith, says a new wave of improvements should be expected for next year.
    [Position]: Chief Technology Officer
    ###
    [Text]: François is a Go developer. He mostly works as a freelancer but is open to any kind of job offering!
    [Position]: Go developer
    ###
    [Text]: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.
    [Position]:""",
    max_length=500,
    end_sequence="\n###",
    remove_end_sequence=True,
    length_no_input=True,
    remove_input=True)
print(generation["generated_text"])

Output:

Data scientist

咱们能够看出,运行下面的代码之后,咱们胜利提取了工作职务“Data scientist”。当初咱们来解释一下,下面的 Prompt 是如何运作的。

在咱们询问正式的问题之前,咱们给 GPT 输出了三个例子,每个例子都由文本和答案组成——

###
[Text]: Tech Robotics is a robot automation company specialized in AI driven robotization. Its Chief Technology Officer, Max Smith, says a new wave of improvements should be expected for next year.
[Position]: Chief Technology Officer

之所以在 Text 和 Position 这两个单词里面加上中括号,是因为应用一些显著的标点符号能够强化 Prompt 的提醒作用,把 GPT 模型的重点凝聚到这些重点词语左近。

除此之外,咱们还设置了一些参数——

  • max_length 限度 GPT 模型最多只能再输入 500 个单词。
  • end_sequence="\n###" 限度 GPT 在遇到字符串 \n### 之后进行文本输入。再察看一下后面的 Prompt 提醒文本,咱们每个 Prompt 案例都以换行 ### 完结,依照 GPT 弱小的学习能力来说,在抽取了 NER 内容之后,GPT 也会输入换行###。此时曾经能够进行 GPT 文本生成了,因为咱们并不需要前面的内容。如果没有设置这个选项,那么 GPT 就会滔滔不绝的输入内容晓得最大文本下限(即后面设置的 500 个单词)。GPT- 3 和 GPT- J 这些模型在学习这些格局上的能力很强,这也再次证实了在 Prompt 提醒文本中应用标点符号和特殊字符进行格局设计的重要性。
  • remove_end_sequence 移除最开端的 \n###
  • remove_input 移除后面的 Prompt 提醒文本内容
  • length_no_input means that the maximum length value should not take the input text into account.

还有一些 Prompt 设置能够进一步地进步 GPT 的输入成果。

3.3.1 调整 P 值

P 值是一个十分根底的统计学概念,如果 P 值比拟高,那么 GPT 模型趋向于输入原创内容。GPT 原创的实体后果可能并不是咱们想要的,咱们心愿 GPT 能够在不同的文本中对立地提取出尽可能对立的 NER 实体,尽可能不要随便施展。一个比拟好的实际法令是把 top_p 设置为 $0.1$。

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""......""",
    top_p=0.1, # 额定减少这一条 其余内容不变    
    )
print(generation["generated_text"])

3.3.2 解决空输入与多输入

在有些状况下,输出的文本内容中可能没有咱们须要的 NER 标签,或者可能有多个 NER 标签,咱们须要批改 Prompt 提醒文原本针对性地解决这两个场景(这并不是常见的场景)。

解决多个输入 NER 的 Prompt 文本如下,留神 Position 中的and

[Text]: Helena Smith founded Core.ai 2 years ago. She is now the CEO and CTO of the company and is building a team of highly skilled developers in machine learning and natural language processing.
[Position]: CEO and CTO
###

解决空输入 NER 的 Prompt 文本如下,咱们应用 None 来示意空输入:

[Text]: The second thing we should care about is the ability to handle empty responses.
[Position]: none
###

进过上述的两个补齐之后,咱们的提取 Demo 变成了如下模式——

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""
    [Text]: Helena Smith founded Core.ai 2 years ago. She is now the CEO and CTO of the company and is building a team of highly skilled developers in machine learning and natural language processing.
    [Position]: CEO and CTO
    ###
    [Text]: Tech Robotics is a robot automation company specialized in AI driven robotization. Its Chief Technology Officer, Max Smith, says a new wave of improvements should be expected for next year.
    [Position]: Chief Technology Officer
    ###
    [Text]: François is a Go developer. He mostly works as a freelancer but is open to any kind of job offering!
    [Position]: Go developer
    ###
    [Text]: The second thing we should care about is the ability to handle empty responses.
    [Position]: none
    ###
    [Text]: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.
    [Position]:
    """,
    max_length=500,
    top_p=0.1,    
    end_sequence="\n###",
    remove_end_sequence=True,
    remove_input=True)
print(generation["generated_text"])

通过以上 Prompt 提醒工程,咱们就实现了在 SpaCy 和 NLTK 中无奈实现的 NER 工作,再也不须要消耗数天甚至数个星期去筹备垂直畛域数据集和组织标注人员了。

You can see more details in the NLP Cloud documentation: see it here.

4. 总结

通过下面的案例,咱们发现应用 GPT 进行命名实体辨认工作能够节俭大量的语料筹备、数据标注的工作。然而天下没有收费的午餐,应用 GPU 进行 NER 工作有着比拟高的性能开销,这些开销包含本地应用 GPU 的压力,也包含网络 API 提早的压力(每个实体可能须要破费 0.5 秒钟,这些工夫在 SpaCy 中可能曾经提取了几百个实体了),甚至包含租用付费云端 GPU 的时长费。

所以咱们须要对 NLTK、SpaCy 和 GPT 的应用场景做一些衡量。如果你当初的 NER 工作数量不多,而且只是一锤子买卖,那么破费几十块钱租用云端 GPT 服务器进行 NER 是十分适合的,而且计算工夫也不会很长。如果你当初的 NER 工作须要解决十分多的数据(百万级别),那么以 GPT 每个实体 0.5 秒的龟速,无论是工夫老本还是机房租用老本都是难以承受的,这是还不如把估算给标注人员和数据处理团队来进行 SpaCy 传统训练。

心愿这篇文章能够帮到你。

相干材料:

Press (English)
OpenAI vs NLP Cloud
Hugging Face vs NLP Cloud
Google Cloud Natural Language vs NLP Cloud

退出移动版