标注#
argilla.labeling
模块旨在提供增强你的标注工作流程的工具。
文本分类#
用于文本分类任务的标注工具。
- class argilla.labeling.text_classification.rule.Rule(query, label, name=None, author=None)#
一种规则(标注函数),形式为 ElasticSearch 查询。
- 参数:
query (str) – 使用 query string syntax 的 ElasticSearch 查询。
label (Union[str, List[str]]) – 与查询关联的标签。也可以是标签列表。
name (Optional[str]) – 规则的可选名称,用作 argilla.labeling.text_classification.WeakLabels 类中的标识符。 默认情况下,我们将使用
query
字符串。author (Optional[str]) –
示例
>>> import argilla as rg >>> urgent_rule = Rule(query="inputs.text:(urgent AND immediately)", label="urgent", name="urgent_rule") >>> not_urgent_rule = Rule(query="inputs.text:(NOT urgent) AND metadata.title_length>20", label="not urgent") >>> not_urgent_rule.apply("my_dataset") >>> my_dataset_records = rg.load(name="my_dataset") >>> not_urgent_rule(my_dataset_records[0]) "not urgent"
- __call__(record)#
检查给定的记录是否在
self.apply
调用中匹配的 ID 中。- 参数:
record (TextClassificationRecord) – 要标注的记录。
- 返回:
如果记录 ID 在匹配的 ID 中,则返回标签或标签列表,否则返回 None。
- Raises:
RuleNotAppliedError – 如果规则在之前未应用于数据集。
- Return type:
Optional[Union[str, List[str]]]
- add_to_dataset(dataset)#
将规则添加到给定的数据集
- 参数:
dataset (str) –
- apply(dataset)#
将规则应用于数据集并保存记录的匹配 ID。
- 参数:
dataset (str) – 数据集的名称。
- property author#
规则的作者。
- property label: Union[str, List[str]]#
规则标签
- metrics(dataset)#
计算给定数据集的规则指标
coverage: 规则标注的记录的比例。
annotated_coverage: 规则标注的已标注记录的比例。
correct: 规则正确标注的记录数(如果注释可用)。
incorrect: 规则错误标注的记录数(如果注释可用)。
precision: 规则给出的正确标签的比例(如果注释可用)。精度不会因规则的弃权而受到惩罚。
- 参数:
dataset (str) – 要计算规则指标的数据集名称。
- 返回:
规则指标。
- Return type:
Dict[str, Union[int, float]]
- property name#
规则的名称。
- property query: str#
规则查询
- remove_from_dataset(dataset)#
从给定的数据集中删除规则
- 参数:
dataset (str) –
- update_at_dataset(dataset)#
在给定的数据集中更新规则
- 参数:
dataset (str) –
- argilla.labeling.text_classification.rule.add_rules(dataset, rules)#
将规则添加到给定的数据集
- 参数:
dataset (str) – 数据集的名称。
rules (List[Rule]) – 要添加到数据集的规则
返回
- argilla.labeling.text_classification.rule.delete_rules(dataset, rules)#
从给定的数据集中删除规则
- 参数:
dataset (str) – 数据集的名称
rules (List[Rule]) – 要从数据集中删除的规则
返回
- argilla.labeling.text_classification.rule.load_rules(dataset)#
加载给定数据集中定义的规则。
- 参数:
dataset (str) – 数据集的名称。
- 返回:
给定数据集中定义的规则列表。
- Return type:
List[Rule]
- argilla.labeling.text_classification.rule.update_rules(dataset, rules)#
更新给定数据集的规则
- 参数:
dataset (str) – 数据集的名称
rules (List[Rule]) – 要在数据集中更新的规则
返回
- class argilla.labeling.text_classification.weak_labels.WeakLabels(dataset, rules=None, ids=None, query=None, label2int=None)#
通过应用给定的规则列表,计算单标签文本分类数据集的弱标签。
- 参数:
dataset (str) – 要应用规则的数据集的名称。
rules (Optional[List[Callable]]) – 规则(标注函数)列表。 它们必须返回字符串,或者在弃权的情况下返回
None
。 如果为 None,我们将使用数据集的规则(默认)。ids (Optional[List[Union[str, int]]]) – 可选的记录 ID 列表,用于在应用规则之前过滤数据集。
query (Optional[str]) –
可选的 ElasticSearch 查询,使用 query string syntax 在应用规则之前过滤数据集。
label2int (Optional[Dict[Optional[str], int]]) – 可选的字典,将标签映射到整数。 请记住,返回类型
None
表示弃权(例如{None: -1}
)。 默认情况下,我们将在应用规则时动态构建映射。
- Raises:
NoRulesFoundError – 当你未提供规则,且数据集也没有规则时。
DuplicatedRuleNameError – 当你提供了多个同名的规则时。
NoRecordsFoundError – 当过滤后的数据集为空时。
MultiLabelError – 当尝试获取多标签文本分类任务的弱标签时。
MissingLabelError – 当提供了
label2int
字典,并且弱标签或注释标签不在其键中时。
示例
>>> # Get the weak label matrix from a dataset with rules: >>> weak_labels = WeakLabels(dataset="my_dataset") >>> weak_labels.matrix() >>> weak_labels.summary() >>> >>> # Get the weak label matrix from rules defined in Python: >>> def awesome_rule(record: TextClassificationRecord) -> str: ... return "Positive" if "awesome" in record.text else None >>> another_rule = Rule(query="good OR best", label="Positive") >>> weak_labels = WeakLabels(dataset="my_dataset", rules=[awesome_rule, another_rule]) >>> weak_labels.matrix() >>> weak_labels.summary() >>> >>> # Use the WeakLabels object with snorkel's LabelModel: >>> from snorkel.labeling.model import LabelModel >>> label_model = LabelModel() >>> label_model.fit(L_train=weak_labels.matrix(has_annotation=False)) >>> label_model.score(L=weak_labels.matrix(has_annotation=True), Y=weak_labels.annotation()) >>> label_model.predict(L=weak_labels.matrix(has_annotation=False)) >>> >>> # For a builtin integration with Snorkel, see `argilla.labeling.text_classification.Snorkel`.
- annotation(include_missing=False, exclude_missing_annotations=None)#
将注释标签作为整数数组返回。
- 参数:
include_missing (bool) – 如果为 True,则返回记录列表长度的数组 (
self.records()
)。 为此,对于没有注释的记录,我们将使用self.label2int[None]
整数填充数组。exclude_missing_annotations (Optional[bool]) – 已弃用
- 返回:
整数的注释数组。
- Return type:
ndarray
- property cardinality: int#
标签的数量。
- change_mapping(label2int)#
允许你更改标签和整数之间的映射。
这将更新
self.matrix
以及self.annotation
。- 参数:
label2int (Dict[str, int]) – 新的标签到整数的映射。 必须涵盖所有之前的标签。
- extend_matrix(thresholds, embeddings=None, gpu=False)#
根据每个规则的相似度阈值,通过嵌入扩展弱标签矩阵。
基于 Epoxy 的实现。
- 参数:
thresholds (Union[List[float], ndarray]) – 介于 0.0 和 1.0 之间的阈值数组,弱标签矩阵的每一列一个。 每一个都代表两个句子之间对于规则扩展的最小余弦相似度。
embeddings (Optional[ndarray]) – 弱标签矩阵的每一行的嵌入。 如果未提供,我们将使用上次
WeakLabels.extend_matrix()
调用的嵌入。gpu (bool) – 如果为 True,则在 GPU 上执行 FAISS 相似度查询。
示例
>>> # Choose any model to generate the embeddings. >>> from sentence_transformers import SentenceTransformer >>> model = SentenceTransformer('all-mpnet-base-v2', device='cuda') >>> >>> # Generate the embeddings and set the thresholds. >>> weak_labels = WeakLabels(dataset="my_dataset") >>> embeddings = np.array([ model.encode(rec.text) for rec in weak_labels.records() ]) >>> thresholds = [0.6] * len(weak_labels.rules) >>> >>> # Extend the weak labels matrix. >>> weak_labels.extend_matrix(thresholds, embeddings) >>> >>> # Calling the method below will now retrieve the extended matrix. >>> weak_labels.matrix() >>> >>> # Subsequent calls without the embeddings parameter will reutilize the faiss index built on the first call. >>> thresholds = [0.75] * len(weak_labels.rules) >>> weak_labels.extend_matrix(thresholds) >>> weak_labels.matrix()
- property int2label: Dict[int, Optional[str]]#
将整数映射到弱标签/注释标签的字典。
- property label2int: Dict[Optional[str], int]#
将弱标签/注释标签映射到整数的字典。
- property labels: List[str]#
标签列表。
- matrix(has_annotation=None)#
返回弱标签矩阵,或者可选地仅返回其一部分。
- 参数:
has_annotation (Optional[bool]) – 如果为 True,则仅返回矩阵中具有对应注释的部分。 如果为 False,则仅返回矩阵中没有对应注释的部分。 默认情况下,我们返回整个弱标签矩阵。
- 返回:
弱标签矩阵,或者可选地仅返回其一部分。
- Return type:
ndarray
- show_records(labels=None, rules=None)#
在 pandas DataFrame 中显示记录,可以选择按弱标签和非弃权规则进行过滤。
如果同时提供
labels
和rules
,我们将取两个过滤器的交集。- 参数:
labels (Optional[List[str]]) – 所有这些标签都在记录的弱标签中。 如果为 None,则不按标签过滤。
rules (Optional[List[Union[str, int]]]) – 所有这些规则都没有对记录弃权。 如果为 None,则不按规则过滤。 你可以通过其(函数)名称或它们在
self.rules
列表中的索引来引用规则。
- 返回:
可选过滤后的记录作为 pandas DataFrame。
- Return type:
DataFrame
- summary(normalize_by_coverage=False, annotation=None)#
返回每个规则的以下摘要统计信息
label: 规则返回的唯一标签集,排除 “None”(弃权)。
coverage: 规则标注的记录的比例。
annotated_coverage: 规则标注的已注释记录的比例(如果注释可用)。
overlaps: 规则与至少一个其他规则一起标注的记录的比例。
conflicts: 规则与至少一个其他规则不一致的记录的比例。
correct: 规则正确预测的标签数(如果注释可用)。
incorrect: 规则错误预测的标签数(如果注释可用)。
precision: 规则给出的正确标签的比例(如果注释可用)。精度不会因规则的弃权而受到惩罚。
- 参数:
normalize_by_coverage (bool) – 通过各自的覆盖率来标准化重叠和冲突。
annotation (Optional[ndarray]) – 可选的整数数组,用于保存注释。 默认情况下,我们将使用
self.annotation(include_missing=True)
。
- 返回:
pandas DataFrame 中每个规则的摘要统计信息。
- Return type:
DataFrame
- class argilla.labeling.text_classification.weak_labels.WeakMultiLabels(dataset, rules=None, ids=None, query=None)#
通过应用给定的规则列表,计算多标签文本分类数据集的弱标签。
- 参数:
dataset (str) – 要应用规则的数据集的名称。
rules (Optional[List[Callable]]) – 规则(标注函数)列表。 它们必须返回字符串、字符串列表,或者在弃权的情况下返回
None
。 如果为 None,我们将使用数据集的规则(默认)。ids (Optional[List[Union[str, int]]]) – 可选的记录 ID 列表,用于在应用规则之前过滤数据集。
query (Optional[str]) –
可选的 ElasticSearch 查询,使用 query string syntax 在应用规则之前过滤数据集。
- Raises:
NoRulesFoundError – 当你未提供规则,且数据集也没有规则时。
DuplicatedRuleNameError – 当你提供了多个同名的规则时。
NoRecordsFoundError – 当过滤后的数据集为空时。
示例
>>> # Get the 3 dimensional weak label matrix from a multi-label classification dataset with rules: >>> weak_labels = WeakMultiLabels(dataset="my_dataset") >>> weak_labels.matrix() >>> weak_labels.summary() >>> >>> # Get the 3 dimensional weak label matrix from rules defined in Python: >>> def awesome_rule(record: TextClassificationRecord) -> str: ... return ["Positive", "Slang"] if "next level" in record.text else None >>> another_rule = Rule(query="amped OR psyched", label=["Positive", "Slang"]) >>> weak_labels = WeakMultiLabels(dataset="my_dataset", rules=[awesome_rule, another_rule]) >>> weak_labels.matrix() >>> weak_labels.summary()
- annotation(include_missing=False)#
将注释标签作为整数矩阵返回。
它具有维度(“记录数” x “标签数”)。 它保存 1 或 0,以指示记录是否使用相应的标签进行注释。 如果记录没有注释,则每个标签都保存 -1。
- 参数:
include_missing (bool) – 如果为 True,则返回记录列表长度的矩阵 (
self.records()
)。 为此,对于没有注释的记录,我们将使用 -1 填充矩阵。- 返回:
作为整数矩阵的注释标签。
- Return type:
ndarray
- property cardinality: int#
标签的数量。
- extend_matrix(thresholds, embeddings=None, gpu=False)#
根据每个规则的相似度阈值,通过嵌入扩展弱标签矩阵。
基于 Epoxy 的实现。
- 参数:
thresholds (Union[List[float], ndarray]) – 介于 0.0 和 1.0 之间的阈值数组,弱标签矩阵的每一列一个。 每一个都代表两个句子之间对于规则扩展的最小余弦相似度。
embeddings (Optional[ndarray]) – 弱标签矩阵的每一行的嵌入。 如果未提供,我们将使用上次
WeakLabels.extend_matrix()
调用的嵌入。gpu (bool) – 如果为 True,则在 GPU 上执行 FAISS 相似度查询。
示例
>>> # Choose any model to generate the embeddings. >>> from sentence_transformers import SentenceTransformer >>> model = SentenceTransformer('all-mpnet-base-v2', device='cuda') >>> >>> # Generate the embeddings and set the thresholds. >>> weak_labels = WeakMultiLabels(dataset="my_dataset") >>> embeddings = np.array([ model.encode(rec.text) for rec in weak_labels.records() ]) >>> thresholds = [0.6] * len(weak_labels.rules) >>> >>> # Extend the weak labels matrix. >>> weak_labels.extend_matrix(thresholds, embeddings) >>> >>> # Calling the method below will now retrieve the extended matrix. >>> weak_labels.matrix() >>> >>> # Subsequent calls without the embeddings parameter will reutilize the faiss index built on the first call. >>> thresholds = [0.75] * len(weak_labels.rules) >>> weak_labels.extend_matrix(thresholds) >>> weak_labels.matrix()
- property labels: List[str]#
多标签文本分类数据集的标签。
- matrix(has_annotation=None)#
返回 3 维弱标签矩阵,或者可选择仅返回其一部分。
它具有 (“记录数” x “规则数” x “标签数”) 的维度。如果规则对标签进行投票,则它持有 1 或 0。如果规则弃权,则每个标签持有 -1。
- 参数:
has_annotation (Optional[bool]) – 如果为 True,则仅返回矩阵中具有对应注释的部分。 如果为 False,则仅返回矩阵中没有对应注释的部分。 默认情况下,我们返回整个弱标签矩阵。
- 返回:
3 维弱标签矩阵,或者可选择仅返回其一部分。
- Return type:
ndarray
- show_records(labels=None, rules=None)#
在 pandas DataFrame 中显示记录,可以选择按弱标签和非弃权规则进行过滤。
如果同时提供
labels
和rules
,我们将取两个过滤器的交集。- 参数:
labels (Optional[List[str]]) – 所有这些标签都在记录的弱标签中。 如果为 None,则不按标签过滤。
rules (Optional[List[Union[str, int]]]) – 所有这些规则都没有对记录弃权。 如果为 None,则不按规则过滤。 你可以通过其(函数)名称或它们在
self.rules
列表中的索引来引用规则。
- 返回:
可选过滤后的记录作为 pandas DataFrame。
- Return type:
DataFrame
- summary(normalize_by_coverage=False, annotation=None)#
返回每个规则的以下摘要统计信息
label: 规则返回的唯一标签集,排除 “None”(弃权)。
coverage: 规则标注的记录的比例。
annotated_coverage: 规则标注的已注释记录的比例(如果注释可用)。
overlaps: 规则与至少一个其他规则一起标注的记录的比例。
correct: 规则正确预测的标签数(如果注释可用)。
incorrect: 规则预测不正确或遗漏的标签数量(如果注释可用)。
precision: 规则给出的正确标签的比例(如果注释可用)。精度不会因规则的弃权而受到惩罚。
- 参数:
normalize_by_coverage (bool) – 通过各自的覆盖率来标准化重叠部分。
annotation (Optional[ndarray]) – 一个可选的矩阵,其中包含整数类型的注释(请参阅
self.annotation
)。默认情况下,我们将使用self.annotation(include_missing=True)
。
- 返回:
pandas DataFrame 中每个规则的摘要统计信息。
- Return type:
DataFrame
- class argilla.labeling.text_classification.label_models.MajorityVoter(weak_labels)#
一个基本的标签模型,用于计算所有规则的多数投票。
对于单标签分类,它将预测获得最多票数的标签。对于多标签分类,它将预测所有获得至少一票的标签。
- 参数:
weak_labels (Union[WeakLabels, WeakMultiLabels]) – 弱标签对象。
- fit(*args, **kwargs)#
引发 NotImplementedError 异常。
无需在
MajorityVoter
上调用 fit!
- predict(include_annotated_records=False, include_abstentions=False, prediction_agent='MajorityVoter', tie_break_policy='abstain')#
应用标签模型。
- 参数:
include_annotated_records (bool) – 是否包含已注释的记录。
include_abstentions (bool) – 是否在输出中包含标签模型弃权的记录。
prediction_agent (str) – 用于返回记录中
prediction_agent
的字符串。tie_break_policy (Union[TieBreakPolicy, str]) –
打破平局的策略(多标签分类中被忽略!)。您可以从以下两种策略中选择
abstain: 不提供任何预测
random: 使用确定性哈希在平局选项中随机选择
最后一种策略可能会引入相当多的噪声,特别是当平局发生在许多标签之间时,例如当所有标注函数(规则)都弃权时。
- 返回:
包含标签模型预测的数据集记录。
- Return type:
- score(tie_break_policy='abstain', output_str=False)#
返回标签模型相对于已注释记录的一些分数/指标。
指标包括
准确率
精确率、召回率和 f1 值的微平均/宏平均
每个标签的精确率、召回率、f1 值和支持度
有关指标的更多详细信息,请查看 sklearn 文档。
注意
指标仅在非弃权的预测上计算!
- 参数:
tie_break_policy (Union[TieBreakPolicy, str]) –
打破平局的策略(多标签分类中被忽略)。您可以从以下两种策略中选择
abstain: 不提供任何预测
random: 使用确定性哈希在平局选项中随机选择
最后一种策略可能会引入相当多的噪声,特别是当平局发生在许多标签之间时,例如当所有标注函数(规则)都弃权时。
output_str (bool) – 如果为 True,则以格式良好的字符串形式返回输出。
- 返回:
以字典或格式良好的字符串形式返回的分数/指标。
- Raises:
MissingAnnotationError – 如果
weak_labels
不包含已注释的记录。- Return type:
Union[Dict[str, float], str]
- argilla.labeling.text_classification.label_errors.find_label_errors(records, sort_by='likelihood', metadata_key='label_error_candidate', n_jobs=1, **kwargs)#
使用 [cleanlab](https://github.com/cleanlab/cleanlab) 在您的记录中查找潜在的注释/标签错误。
我们将考虑所有预测和注释都可用的记录。确保预测是以留出方式进行的,也就是说,您应该仅包含未用于预测器训练的记录。
- 参数:
records (Union[List[TextClassificationRecord], DatasetForTextClassification]) – 文本分类记录列表
sort_by (Union[str, SortBy]) – 以下三个选项之一 - “likelihood”: 按包含标签错误的似然性对返回的记录进行排序(最有可能的排在最前面)- “prediction”: 按预测的概率对返回的记录进行排序(最高概率排在最前面)- “none”: 不对返回的记录进行排序
metadata_key (str) – 添加到记录元数据的键,用于保存顺序,如果
sort_by
不是 “none”。n_jobs (Optional[int]) – 多进程使用的处理线程数。如果为 None,则使用 CPU 上的线程数。默认为 1,这将移除并行处理。
**kwargs – 传递给 cleanlab.pruning.get_noise_indices (cleanlab < 2.0) 或 cleanlab.filter.find_label_issues (cleanlab >= 2.0)
- 返回:
包含潜在注释/标签错误的记录列表
- Raises:
NoRecordsError – 如果没有记录同时具有预测和注释。
MissingPredictionError – 如果其中一个标签缺少预测。
ValueError – 如果传递了不支持的 kwargs,例如 ‘sorted_index_method’。
- Return type:
List[TextClassificationRecord]
示例
>>> import argilla as rg >>> records = rg.load("my_dataset") >>> records_with_label_errors = find_label_errors(records)