基于spaCy或NLTK的预训练的实体提取模型给出了很好的结果,但需要繁琐的注释和训练过程,以检测非本地实体,如职位名称、增值税号码、药品等。感谢GPT-3、GPT-J和GPT-NeoX这样的大型语言模型,现在可以通过少量的学习来提取任何类型的实体,而无需任何注释和训练。在这篇文章中,我们将展示如何做到这一点。
NER(实体提取)基本上是指从非结构化文本中提取结构化信息。如果你是NER的新手,你可以先阅读我们的简短介绍。 NER的介绍。
SpaCy在过去这些年几乎成为了NER的事实标准。 (见水疗中心网站). SpaCy是一个非常有吸引力的框架,因为它很容易使用,而且它的速度使它很适合生产使用。
SpaCy是一个Python自然语言处理框架,它提出了许多多语言的预训练模型,因此很容易用你自己的语言提取几种实体类型(公司、城市、地址、日期等),而不必训练自己的模型。
NLTK也是用Python进行实体提取的一个有趣的选择,但它默认提出的实体较少,而且一般来说,NLTK不被推荐用于生产(它更像是一个教育和研究框架)。
然而,你很快就会遇到这些框架的限制:本地支持的实体数量是有限的。大多数公司希望利用NER来提取特定的商业信息,如个人信息、财务数据、医疗等。当然,spaCy的预训练模型默认不支持这些实体,所以为了实现这一点,你必须创建你自己的数据集并训练你自己的模型。
训练你自己的spaCy模型是一个漫长而乏味的注释过程:一个或几个人需要合作,以创建一个巨大的好例子集,并对其进行注释。为了让模型正确学习,需要大量的例子。好的注释工具是存在的(如spaCy的Prodigy),但它仍然是一项痛苦的任务,导致许多NLP项目中止。
注释性插图
好消息:随着GPT-3、GPT-J和GPT-NeoX等大型语言模型的兴起,现在无需注释和训练新的模型就可以提取任何实体了!
用于文本生成的大型语言模型最近开始出现,GPT-3 (在OpenAI的网站上看到更多关于GPT-3的信息). 当OpenAI发布他们由1750亿个参数组成的GPT-3模型时,这是一场革命,因为它为许多基于自然语言处理的前沿人工智能应用铺平了道路,而不需要任何额外的培训。
像GPT-3这样的GPT模型的最初目标是生成文本:只需给模型一个输入,让它为你生成其余的内容。基于文本生成,几乎所有的自然语言处理用例都可以实现:分类、总结、对话式人工智能、转述...当然还有实体提取
由于GPT-3不是一个开源的模型,开源社区已经致力于GPT-3的替代品,我们现在有两个伟大的开源替代品。GPT-J和GPT-NeoX。它们仍然没有GPT-3那么大,但毫无疑问,开源社区赶上OpenAI只是一个时间问题。
正确地利用这些模型需要一种新的技术,即 "少许学习"。
这些大型的GPT模型是如此之大,以至于他们可以非常迅速地从你身上学习。
假设你希望GPT-3为你生成一个简短的产品描述。下面是一个没有几张照片的学习的例子。
Generate a product description containing these specific keywords: t-shirt, men, $50
你将得到的回应将是无用的。例如,它可能是这样的。
Generate a product description containing these specific keywords: t-shirt, men, $50 and short.
The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are
好消息是:你可以通过简单地给模型举几个例子来达到更好的效果
Generate a product description containing specific keywords.
Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:
其结果将是这样的。
Generate a product description containing specific keywords.
Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.
正如你所看到的,由于我们第一次给了它3个例子,现在这个模型的反应完全符合目的。然而,这个模型从未在这种产品描述生成任务上接受过训练。这就是 "少量学习 "技术的意义所在:你只用几个例子就能进行即时的 "迁移学习"。为了达到这样的结果,你通常期望用大量的例子来训练自然语言处理模型,但这里不是。
现在我们将进行实体提取,这要归功于少许的学习。
比方说,你想从网站上提取职位名称。在提出你的实际要求之前,只需给出几个职位名称提取的例子。
Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:
其结果将是如下。
Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO
正如你所注意到的,我们必须对如何制作我们的少数几个例子采取明智的态度。可能发生的情况是,根本没有找到任何职位,这就是为什么我们创建了一个返回 "无 "的例子(它避免了假阳性)。也许你想同时提取几个职位名称?在这种情况下,创建返回几个职位名称的例子也很重要(例如,逗号分隔的职位名称)。
通过增加更多的例子,你会得到更好的结果。而且重要的是,你的例子要尽可能地接近你的实际最终要求。例如,如果你知道你要分析的是整个段落而不是单纯的句子,那么最好也要创建有段落的例子。
如果你没有访问GPT模型,你可以简单地使用NLP Cloud API。有几个客户端可用(Python、Go、Node.js、Ruby、PHP...)。让我们在这里展示一个使用GPT-J与Python客户端的例子。
import nlpcloud
client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)
其结果将是。 CTO
让我给你简单解释一下我们刚才使用的文本生成参数。
我们设置了一个非常低的最高P值,因为我们不希望GPT-J创造出太原始的结果:我们只希望它坚持在你的请求中看到的东西。
"length_no_input "表示最大长度值不应该考虑到输入的文本。
"remove_input "表示应该从结果中删除输入的文本。
"end_sequence "意味着当模型遇到这个字符时,它应该停止生成文本。正如在我们的几张照片的例子中,我们在每个答案的末尾添加了 "##",模型在生成反应后会自动生成 "##",并且会在那里停止。
"remove_end_sequence "意味着我们要从响应中删除 "##"。
你可以在NLP Cloud文档中看到更多细节。 在这里看到。
用GPT模型进行实体提取给了人们很大的自由,因为任何新的实体都可以被提取出来,即使模型没有被训练过。
然而,这是有代价的:这些大型的语言模型是巨大的,而且相对缓慢。
例如,如果你想使用GPT-J或GPT-NeoX,它将需要一个巨大的GPU与大量的VRAM,如NVIDIA RTX A6000或A40。而且会有一些延迟(提取一个实体大约需要500ms)。相反,从基础设施的角度来看,spaCy或NLTK将更快,成本更低。
在2022年,不需要任何注释和培训就可以非常容易地进行高级NER!这将极大地帮助企业更快地交付他们的实体提取项目,而且还可以在自然语言处理的基础上实现更多的前沿应用。
然而像GPT-3、GPT-J和GPT-NeoX这样的大型语言模型是很昂贵的,所以你不应该低估其中的基础设施成本。
我希望这篇文章能帮助你节省时间和金钱!
Julien Salinas
NLP Cloud的首席技术官