基于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