关于人工智能:ArgMiner一个用于对论点挖掘数据集进行处理增强训练和推理的-PyTorch-包

7次阅读

共计 4962 个字符,预计需要花费 13 分钟才能阅读完成。

论点开掘 (Argument Mining)是一项从文本中提取论点成分的工作,通常作为主动写作评估零碎的一部分。这是自然语言解决中一个十分热门的畛域。一个好的 AM 模型能够将一段原始将一段原始文本的序列标记为它们所属的论点内容。尽管历史上这一问题被视为一个语义宰割问题,最先进的(SOTA) AM 技术把它作为一个命名实体辨认(NER) 问题的长序列的文本。

只管有这个畛域的历史,对于 NER AM 数据集的文献绝对较少,自 2014 年以来的惟一奉献是 Christian Stab 和 Iryna Gurevych 的 Argument Annotated Essays。最近 (截至 2022 年 3 月),随着 PERSUADE(在 Kaggle 比赛 Feedback Prize 中应用) 和 ARG2020 数据集(在 GitHub 公布),这种状况尽管失去了改善,但很少有对于 AM 模型的跨数据集性能测试。因而也没有钻研对抗性训练如何进步 AM 模型的跨数据集性能。对 AM 模型反抗实例的鲁棒性钻研也较少。

因为每个数据集都以不同的格局存储,使上述挑战变得更加简单,这使得在试验中对数据进行标准化解决变得艰难(Feedback Prize 较量就能够确认这一点,因为大部分代码都是用于解决数据的)。

本文介绍的 ArgMiner 是一个用于应用基于 Transformer 的模型对 SOTA 论点开掘数据集进行标准化的数据处理、数据加强、训练和推断的 pytorch 的包。本文从包个性介绍开始,而后是 SOTA 数据集的介绍,并详细描述了 ArgMiner 的解决和扩大个性。最初对论点开掘模型的推理和评估 (通过 Web 应用程序) 进行了简要的探讨。

ArgMiner 简介

ArgMiner 的次要特点总结如下:

  • 解决 SOTA 数据集,而无需编写任何额定的代码行
  • 能够在单词和子标记级别生成以下标记办法 {io, bio, bioo, bixo},无需额定的代码
  • 能够在不更改数据处理管道的状况下进行自定义加强
  • 提供一个 用于应用任何 HuggingFace TokenClassification 模型进行论点开掘微调的 PyTorch 数据集类
  • 提供高效的训练和推理流程

下图显示了 ArgMiner 的端到端工作:

数据处理和加强

数据集

论点正文论文(Argument Annotated Essays ):这是一个 402 篇论文的合集。它有三个论点组成部分:Claim, MajorClaim, Premise。数据集能够在 TUDarmstadt 中找到; 原始的论文在 ACL 上,后续的论文在 MIT Press Direct 上。PERSUADE:这是一本由美国 6 -12 年级学生撰写的 15000 篇文章的合集。它有 7 个论点组成部分:Lead, Position, Claim, Counterclaim, Rebuttal, Evidence, ConcludingStatement。数据集能够通过 Kaggle 较量拜访。

ARG2020:这是一本 145 篇中学生作文的合集。它有两个论点组成部分:Claim Premise。该数据集在 GitHub 上公开,无关这项工作的论文在 ArXiv 上。

这些数据集以不同的形式存储和解决。例如,AAE 和 ARG2020 数据集有 ann 文件,数据还附带了原始论文文本的.txt 文件。与 ARG2020 不同,AAE 数据集带有用于宰割数据的训练和测试 id。

PERSUADE有更简单的目录构造,其中包含原始的.txt 论文的训练和测试目录。对于论点标签的理论信息蕴含在 train.csv 中。

没有一个数据集实际上表明文章中不是论点组成部分的局部,即所谓的“其余”类。然而 NER 问题通常须要这样做(否则你是选择性地从文章中而不是整个文章中查看信息)。因而须要从论文自身提取这些内容。

为了以标准化的格局解决这些变化很大的原始文本,ArgMiner 采纳了 3 个阶段:

预处理: 从源中提取数据

这个步骤以原始格局 (对于每个数据集) 获取数据,并应用 span_start 和 span_end 个性和原始文本生成一个 DataFrame,其构造如下:[essay_id, text, argument_component]。

这样能够反对应用规范办法来生成 NER 标签,或加强数据。这些解决都基于一个根本的 DataProcessor 类,该类具备保留和利用 train-test-split 的内置个性,因而能够轻松地从它创立新的解决类。

from argminer.data import TUDarmstadtProcessor, PersuadeProcessor, DataProcessor

# process the AAE dataset from source
processor = TUDarmstadtProcessor('path_to_AAE_dir').preprocess()
print(processor.dataframe.head())

# process the Persuade dataset from source
processor = PersuadeProcessor('path_to_persuade_dir').preprocess()
print(processor.dataframe.head())

# create a custom processor for new dataset (e.g. ARG2020 will be done this way)
class ARG2020Processor(DataProcessor):
  def __init__(self, path=''):
    super().__init__(path)
  
  def _preprocess(self):
    pass

生成标签和 (可选) 减少数据

数据通过了解决曾经变为规范格局了,那么下一步就能够为数据生成 NER 款式标签。在这一步完结时,数据集将像这样:[essay_id, text, argument_component, NER_labels]。

有时人们可能会对加强数据感兴趣,无论是对抗性训练还是对抗性例子的鲁棒性测试。在这种状况下,能够提供一个承受一段文本并返回一段加强文本的函数。在这个函数里能够应用其余的 NLP 裁减库,如 textattack 和 nlpaug。

from argminer.data import PersuadeProcessor

processor = PersuadeProcessor().preprocess().process(strategy='bio')

# augmenters

# remove first word (toy example) on io labelling
first_word_removal = lambda x: ' '.join(x.split()[1:])
processor = PersuadeProcessor().preprocess().process(strategy='io', processors=[first_word_removal])

# remove last word (toy example) on bieo labelling
last_word_removal = lambda x: ' '.join(x.split()[:-1])
processor = PersuadeProcessor().preprocess().process(strategy='io', processors=[last_word_removal])

后处理: 将序列聚合到文档

最初一步非常简单,因为标签曾经创立好了,最初就须要通过段的 doc_id 来连贯它们。这个阶段的后果输入是一个 DataFrame:[essay_id, full_essay_text, NER_labels]。应用内置的训练和测试集的宰割也是非常容易的。

from argminer.data import PersuadeProcessor

processor = PersuadeProcessor().preprocess().process('bio').postprocess()

# full data
print(processor.dataframe.head())

# train test split
df_dict = processor.get_tts(test_size=0.3, val_size=0.1)
df_train = df_dict['train']
df_test = df_dict['test']
df_val = df_dict['val']

PyTorch 数据集

PyTorch 数据集被设计为承受.postprocess()阶段的输出,变量 strategy_level 能够确定标记策略是否应该利用于单词级别还是标记级别。数据集将类标签能够扩大到子标记。与 Kaggle 上的例子相比,这是一个微小的改良,因为它是矢量化的能够无效地应用 GPU。数据集还创立了一个映射,将扩大标签合并到它们的外围标签,以进行推断(例如“B-Claim, I- claim, E-Claim”都被合并为 Claim)。

它的应用也非常简单,而且因为它是基于 PyTorch 的能够很容易地将它集成到训练中。例如:

from argminer.data import ArgumentMiningDataset

trainset = ArgumentMiningDataset(df_label_map, df_train, tokenizer, max_length)
train_loader = DataLoader(trainset)

for epoch in range(epochs):
    model.train()

    for i, (inputs, targets) in enumerate(train_loader):

        optimizer.zero_grad()

        loss, outputs = model(
            labels=targets,
            input_ids=inputs['input_ids'],
            attention_mask=inputs['attention_mask'],
            return_dict=False
        )

        # backward pass

        loss.backward()
        optimizer.step()

推理

ArgMiner 还提供了用于训练模型训练和进行推理的函数。

ArgMiner 将推断函数编写成高效的 (在可能的状况下,它们利用 GPU 和矢量化) 和批处理的(因而非常适合低内存设置),这意味着推断函数也能够在针对验证数据的训练过程中应用。在推理过程中当从标记映射回单词时,能够轻松地抉择聚合级别。例如,给定两个标记“Unit”和“ed”以及每个类的概率,能够应用单词“Unit”的最佳概率、最佳均匀概率或最佳最大概率将它们聚合成“United”。

与 Feedback Prize 比赛中应用的计划相比,该推理计划具备一些劣势。

Web 应用程序

ArgMiner 还蕴含有一个 web 应用程序,能够查看模型给出的输入 (或任何来自 HuggingFace 的模型),也可用于评估自定义数据集上的模型的性能。这是一种有用的(非正式的) 办法,能够在特定的例子上探索模型,

理解它在做什么。

总结

很长一段时间以来,论点开掘的文献对数据集的形容非常少,但随着 PERSUADE 和 ARG2020 的公布,这种状况产生了扭转。论点开掘中的常识转移问题以及鲁棒性问题还有待进一步钻研。但首先从数据处理方面来看,这通常是艰难的,因为不同源的数据格式、示意数据有很多多种办法,以及因为应用不相等的段进行示意和推断而导致的效率问题。

ArgMiner 是 Early Release Access 中的一个包,能够用于对 SOTA 论点开掘数据集进行标准化解决、裁减、训练和执行推断

尽管包的外围曾经筹备好了,然而还有一些零散的局部须要解决,例如:ARG2020 数据集的数据处理还不欠缺,还没有扩大 DataProcessor 类以容许分层的训练测试宰割。

如果您对论点开掘和 NLP 感兴趣,并且对本文感兴趣,能够分割该项目标并申请成为合作者。因为作者想将这个我的项目做成长期的我的项目并帮忙更多的人可能不便的构建论点开掘的模型。

我的项目地址如下:

https://avoid.overfit.cn/post/8bed8579a0c6485fab8c414dbf6eff90

作者:yousefnami

正文完
 0