文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

NamedEntityExtractor

此组件从一段文本中提取预定义的实体,并将其写入文档的 meta 字段。

pipeline 中的最常见位置在索引管道中的 PreProcessor 之后,或者在查询管道中的 Retriever 之后
必需的初始化变量"backend": 要用于 NER 的后端

"model": 要使用的模型的名称或路径
强制运行变量“documents”:文档列表
输出变量“documents”:文档列表
API 参考Extractors (提取器)
GitHub 链接https://github.com/deepset-ai/haystack/blob/main/haystack/components/extractors/named_entity_extractor.py

概述

NamedEntityExtractor 会查找文本中的实体(即跨度)。提取器会自动识别并根据其类别进行分组,例如人名、组织、地点和其他类型。确切的类别取决于您用来初始化组件的模型。

NamedEntityExtractor 以文档列表作为输入,并返回相同的文档列表,其中包含其meta 数据,并用NamedEntityAnnotations 进行丰富。一个NamedEntityAnnotation 由实体类型、跨度的开始和结束位置以及模型计算的分数组成,例如NamedEntityAnnotation(entity='PER', start=11, end=16, score=0.9).

在初始化NamedEntityExtractor 时,您需要设置一个model 和一个backend。后者可以是"hugging_face""spacy"。您还可以选择设置pipeline_kwargs,然后将其传递给 Hugging Face pipeline 或 spaCy pipeline。您还可以设置用于运行组件的device

用法

当前的实现支持两种 NER 后端:Hugging Face 和 spaCy。这两种后端都可以与支持 token 分类或 NER 的任何 HF 或 spaCy 模型一起使用。

以下是如何初始化不同后端的示例

# Initialize with HF backend
extractor = NamedEntityExtractor(backend="hugging_face", model="dslim/bert-base-NER")

# Initialize with spaCy backend
extractor = NamedEntityExtractor(backend="spacy", model="en_core_web_sm")

NamedEntityExtractor 接受一个 Documents 列表作为其输入。提取器注释文档中的原始文本,并将注释存储在文档的 meta 字典下的 named_entities 键中。

from haystack.dataclasses import Document
from haystack.components.extractors import NamedEntityExtractor

extractor = NamedEntityExtractor(backend="hugging_face", model="dslim/bert-base-NER")

documents = [Document(content="My name is Clara and I live in Berkeley, California."),
	     Document(content="I'm Merlin, the happy pig!"),
	     Document(content="New York State is home to the Empire State Building.")]

extractor.warm_up()
extractor.run(documents)
print(documents)

以下是示例结果

[Document(id=aec840d1b6c85609f4f16c3e222a5a25fd8c4c53bd981a40c1268ab9c72cee10, content: 'My name is Clara and I live in Berkeley, California.', meta: {'named_entities': [NamedEntityAnnotation(entity='PER', start=11, end=16, score=0.99641764), NamedEntityAnnotation(entity='LOC', start=31, end=39, score=0.996198), NamedEntityAnnotation(entity='LOC', start=41, end=51, score=0.9990196)]}), 
Document(id=98f1dc5d0ccd9d9950cd191d1076db0f7af40c401dd7608f11c90cb3fc38c0c2, content: 'I'm Merlin, the happy pig!', meta: {'named_entities': [NamedEntityAnnotation(entity='PER', start=4, end=10, score=0.99054915)]}), 
Document(id=44948ea0eec018b33aceaaedde4616eb9e93ce075e0090ec1613fc145f84b4a9, content: 'New York State is home to the Empire State Building.', meta: {'named_entities': [NamedEntityAnnotation(entity='LOC', start=0, end=14, score=0.9989541), NamedEntityAnnotation(entity='LOC', start=30, end=51, score=0.95746297)]})]

获取已存储的注释

此组件包含get_stored_annotations 帮助类方法,允许您透明地检索存储在Document 中的注释

from haystack.dataclasses import Document
from haystack.components.extractors import NamedEntityExtractor

extractor = NamedEntityExtractor(backend="hugging_face", model="dslim/bert-base-NER")

documents = [Document(content="My name is Clara and I live in Berkeley, California."),
	     Document(content="I'm Merlin, the happy pig!"),
	     Document(content="New York State is home to the Empire State Building.")]

extractor.warm_up()
extractor.run(documents)

annotations = [NamedEntityExtractor.get_stored_annotations(doc) for doc in documents]
print(annotations)

# If a Document doesn't contain any annotations, this returns None.
new_doc = Document(content="In one of many possible worlds...")
assert NamedEntityExtractor.get_stored_annotations(new_doc) is None

相关链接

在我们的 API 参考中查看参数详情