原文:
towardsdatascience.com/extract-any-entity-from-text-with-gliner-32b413cea787
图片由Matt Hardy在Unsplash提供
那些过去使用过 NER(命名实体识别)范式的人很清楚,拥有一个针对其训练任务表现良好的模型的价值。
事实上,NER 模型对于数据挖掘和文本分析任务非常有用——它们是每个数字智能任务的基础,以及与更大、更复杂的科学数据管道相关的无数任务。
那些从事 NER 的人也知道,由于训练阶段需要指定的大量标签,训练这样的模型是多么复杂。像 SpaCy 和基于 transformer 的 Hugging Face 模型这样的库大大帮助数据科学家以越来越高效的方式开发 NER 模型,尽管如此,这个过程仍然在某个程度上得到了改进。
在这篇文章中,我们将一起探讨GLiNER 范式,这是一种结合经典 NER 范式和 LLMs(大型语言模型)力量的新实体提取技术。
到这篇文章结束时,你将了解 GLiNER 是什么,以及如何在 Python 中使用它对任何文本中的任何标记进行分类。
总结来说,通过阅读这篇文章,你将了解
-
什么是 GLiNER
-
为什么它可能具有革命性
-
如何在 Python 中实现它
-
GLiNER 的局限性
GLiNER 发表在以下链接的科学论文中👇
此外,该论文的作者已经发布了一个公共的 GitHub 仓库
什么是 GLiNER?
GLiNER 是一个 NER 模型,可以使用双向变换器编码器(类似于 BERT)识别任何类型的实体。它为传统 NER 模型提供了一种实用的替代方案,这些模型仅限于预定义的实体,以及尽管具有灵活性,但在资源受限场景中昂贵且庞大的大型语言模型(LLMs)。
GLiNER 使用双向语言模型(BiLM)并接受实体提示和句子/文本作为输入。
简单来说,每个实体之间由一个学习到的标记[ENT]分隔,BiLM 为每个标记生成向量表示(嵌入)。这些嵌入被传递到一个前馈神经网络中,而输入单词的表示则被传递到一个专门用于学习包含该标记的字符窗口的神经网络层)。这些窗口被称为跨度。
最后,通过点积和 sigmoid 激活计算实体表示和跨度表示之间的相似度得分。
从 GLiNER:使用双向 Transformer 的通用命名实体识别模型中提取的图像。arxiv.org/abs/2311.08526
而不是依赖于大规模自回归模型(如 GPT-3.5 和 4),使用的是小规模双向语言模型(如提到的 BiLMs),例如 BERT 或 deBERTa。
💡 GLiNER 不是以生成方式来构建问题,而是通过匹配过程。这种创新方法有效地解决了与自回归模型相关的可扩展性问题,同时促进了双向处理上下文。
在发表时,GLiNER 优于 ChatGPT 和 LLM 优化的零样本 NER 数据集。
为什么 GLiNER 可能具有革命性?
与基于 LLM 的方法(包括 ChatGPT)相比,GLiNER 更轻量、可扩展、更快、更准确。
最令人惊讶的是,现在可以进行零成本的 NER,快速且高效。
我们已经从从头开始训练 NER 模型或花钱购买基于 LLM 的解决方案,转变为结合这两种解决方案并以最有效的方式(从技术和经济角度来看)做到这一点。
下图显示了 GLiNER 的性能:
从 GLiNER:使用双向 Transformer 的通用命名实体识别模型中提取的图像。arxiv.org/abs/2311.08526
它在某些特定领域上仅被其他模型超越,但数值差距并不大。
以下是在零样本标记分类任务上仅针对 20 个公共 NER 数据集与 ChatGPT 进行的基准测试:
从 GLiNER:使用双向 Transformer 的通用命名实体识别模型中提取的图像。arxiv.org/abs/2311.08526
GLiNER 有多种大小可供选择,但小型版本已经能够超越 ChatGPT 的性能。小型版本有 5000 万个参数,相当于大约 600MB。
从结果的角度来看,该模型给人留下深刻印象,并且有潜力成为最常见命名实体识别(NER)问题的主要解决方案。
如何在 Python 中实现 GLiNER
项目作者提供了一个方便的包,可以通过 pip 安装。
pip install gliner
与另一个 NER 模型不同,我们不需要进行训练或微调。我们只需在 Python 列表中指定我们想要从文本中提取的实体。
因此,您需要两件事:
-
我们想要提取的实体(即标签)
-
我们想要从中提取实体的文本
使用项目 Git 仓库中的示例,您可以看到如何在 Python 中使用 GLiNER 是多么简单。
from gliner import GLiNER
model = GLiNER.from_pretrained("urchade/gliner_base")
text = """
Cristiano Ronaldo dos Santos Aveiro
(Portuguese pronunciation: [kɾiʃˈtjɐnu ʁɔˈnaldu]; born 5 February 1985)
is a Portuguese professional footballer who plays as a forward for
and captains both Saudi Pro League club Al Nassr and the Portugal national
team. Widely regarded as one of the greatest players of all time,
Ronaldo has won five Ballon d'Or awards,[note 3] a record three
UEFA Men's Player of the Year Awards, and four European Golden Shoes,
the most by a European player. He has won 33 trophies in his career,
including seven league titles, five UEFA Champions Leagues,
the UEFA European Championship and the UEFA Nations League.
Ronaldo holds the records for most appearances (183), goals (140)
and assists (42) in the Champions League, goals in the
European Championship (14), international goals (128) and
international appearances (205).
He is one of the few players to have made over 1,200 professional
career appearances, the most by an outfield player,
and has scored over 850 official senior career goals for club and country,
making him the top goalscorer of all time.
"""
labels = ["person", "award", "date", "competitions", "teams"]
entities = model.predict_entities(text, labels, threshold=0.5)
for entity in entities:
print(entity["text"], "=>", entity["label"])
作者提供的图片。
您可以根据需要更改列表,然后重新启动模型以获取更多实体。
我们修改了标签从
labels = ["person", "award", "date", "competitions", "teams"]
这些
labels = ["event", "location"]
这是输出
作者提供的图片。
GLiNER 的局限性
在论文中,作者强调了 GLiNER 可以改进的几个方面
-
该模型在训练上存在不平衡类别的缺陷:一些类别的频率比其他类别的频率高,我们希望使用专门的损失函数来改进这些类别的识别和管理
-
多语言技能需要提高:需要使用多种语言进行训练(目前意大利语支持不佳)
-
它基于相似度阈值:在未来,作者希望使其动态化,以便尽可能多地捕获实体而不会扭曲结果
结论
GLiNER 是数据挖掘和数据分析任务中必须探索和使用的工具。
我的观点是,这将成为一个在该领域越来越受欢迎的项目,可能出现的分支将带来更大的创新。
也许 RAG 范式可以通过快速有效地识别实体而得到改进?
GLiNER:通用实体抽取新范式

被折叠的 条评论
为什么被折叠?



