标注#

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 中显示记录,可以选择按弱标签和非弃权规则进行过滤。

如果同时提供 labelsrules,我们将取两个过滤器的交集。

参数:
  • 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 中显示记录,可以选择按弱标签和非弃权规则进行过滤。

如果同时提供 labelsrules,我们将取两个过滤器的交集。

参数:
  • 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:

DatasetForTextClassification

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)