论点开掘(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 sourceprocessor = TUDarmstadtProcessor('path_to_AAE_dir').preprocess()print(processor.dataframe.head())# process the Persuade dataset from sourceprocessor = 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 PersuadeProcessorprocessor = PersuadeProcessor().preprocess().process(strategy='bio')# augmenters# remove first word (toy example) on io labellingfirst_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 labellinglast_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 PersuadeProcessorprocessor = PersuadeProcessor().preprocess().process('bio').postprocess()# full dataprint(processor.dataframe.head())# train test splitdf_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 ArgumentMiningDatasettrainset = 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