在自然语言处理(NLP)领域,应用最先进的模型从未如此简单。Hugging Face公司推出了一个名为transformers的库,它使能够以特定的方式执行和使用广泛的先进NLP模型。本文将介绍如何安装和使用transformers库来处理多种任务,例如文本分类、问答、遮蔽语言模型、文本生成、命名实体识别、文本摘要和翻译等。
在开始评估不同任务的实现之前,先来安装transformers库。以macOS为例,如果在尝试使用pip安装时遇到错误,可以通过先安装Rust编译器来解决,如下所示:
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
之后,使用pip安装transformers库:
$ pip install transformers
完成以上两步后,设备应该已经正确安装了该库。接下来,将分别实现不同的任务。
文本分类任务涉及将给定文本归类到一组预定义类别中的一个。情感分析是文本分类问题中最常执行的任务。在transformers库中实现文本分类示例,只需要两个参数:任务和模型,它们指定了要解决的问题的性质和要应用的模型。
考虑到Hugging Face库中支持的模型种类繁多,可以开始尝试使用它们中的任何一个。以下是文本分类任务的一些原则。
以下是使用最佳基础多语言未大写情感模型进行情感分析的代码实现:
from transformers import pipeline
st = f"不喜欢恐怖电影"
seq = pipeline(task="text-classification", model='nlptown/bert-base-multilingual-uncased-sentiment')
print(f"结果: { seq(st) }")
结果将显示模型对文本情感的分类结果。每个模型的文档都需要检查,以了解它们训练的数据集以及它们执行的分类类型。transformers库的另一个好处是,如果模型托管在Hugging Face库中,可以直接在这个库中使用它们。
抽取式问答任务是关于在给定上下文中寻找问题的答案。这个任务最典型的数据集之一是斯坦福问答数据集(SQuAD)。transformers管道需要上下文和问题。在以下代码中,上下文由《爱丽丝梦游仙境》书中的一句话定义;问题指的是该段落中描述的一个事件。
from transformers import pipeline
sentence = r"""
爱丽丝开始厌倦了坐在她姐姐身边,无所事事:她曾经一两次偷看她姐姐正在读的书,但书中既没有图片也没有对话
“没有图片或对话的书有什么用呢?”爱丽丝想,“没有图片或对话?”所以她正在考虑(就她所能的,因为炎热的天气让她感到非常困倦和愚蠢),制作雏菊链的乐趣是否值得起床采摘雏菊的麻烦,突然一只粉红色眼睛的白兔从她身边跑过。
"""
output = pipeline("question-answering", model="csarron/roberta-base-squad-v1")
question = output(question="谁在读书?", context=sentence)
print(f"答案: {question['answer']}")
结果将显示模型找到的答案。对于这个任务,选择了Roberta-base-squad-v1模型;然而,可以发现许多其他模型也适用于这个任务;探索它们中的任何一个都是值得的。
遮蔽语言模型任务涉及用遮蔽标记覆盖目标文本句子中的标记,模型需要用相关词汇填充每个遮蔽标记。对于这种类型的任务,transformers管道只需要库的名称(在这个例子中是fill-mask),然后是文本序列,其中定义了要遮蔽的标记。
from transformers import pipeline
nlp = pipeline("fill-mask")
nlp(f"{nlp.tokenizer.mask_token} 电影通常对人们来说非常可怕")
结果将显示模型预测的填充词汇及其相应的概率。在这个例子中,最佳预测是“恐怖”,最不可能的是“动作”。
文本生成任务涉及根据给定上下文构建一个在语法和语义上正确的文本片段。管道初始化需要任务类型和要使用的模型,如前所述研究。最后,管道实例需要两个参数:上下文(或种子)和要生成的序列长度max_length。要改进的行数是一个可选参数。
from transformers import pipeline
nlp = pipeline(task='text-generation', model='gpt2')
nlp("名字是Fernando,来自墨西哥和", max_length=30, num_return_sequences=5)
结果将显示模型生成的5个文本序列。
命名实体识别任务涉及将类别分配给呈现的文本序列中的每个标记。执行此任务时,需要将任务标识符分配给管道初始化。之后,对象只接收一个文本流。
from transformers import pipeline
seq = r"""
是Fernando,住在墨西哥。是一名机器学习工程师,在Hitch工作。
"""
nlp = pipeline(task='ner')
for item in nlp(seq):
print(f"{item['word'], item['entity']}"
)
结果将显示模型识别的实体及其类别。对于这个案例,组是:
文本摘要任务涉及从给定文本中提取摘要。初始化管道需要任务描述和摘要标识符。要执行,只需要文本和要生成的最大和最小序列长度作为参数。
from transformers import pipeline
txt = r'''
机器学习是计算机算法的研究,这些算法通过经验和数据的使用自动改进。它被视为人工智能的一部分。机器学习是数据科学这一日益增长领域的重要组成部分。机器学习、深度学习和神经网络都是人工智能的子领域。随着大数据的持续增长,对数据科学家的市场需求将增加,要求他们协助确定最相关的业务问题。机器学习是一种数据分析方法,它自动化了分析模型的构建。它是基于数据的系统学习、识别模式并做出决策的人工智能的一个分支,最小化了人为干预。
'''
nlp = pipeline(task='summarization')
nlp(txt, max_length=130, min_length=30)
结果将显示模型生成的摘要,与输入文本准确对应。与早期任务一样,可以执行多种文本摘要模型,如BART、DistilBart和Pegasus。
翻译任务涉及将一种语言中打印的文本翻译成另一种语言。transformers库承认使用最先进的模型进行翻译,如T5,以一种不经意的风格。管道初始化需要任务标识符,指的是原始语言和翻译语言;例如,要将法语翻译成英语,标识符是translation_en_to_fr。最后,返回的对象持有要渲染的文本作为参数。
from transformers import pipeline
txt = r'''
机器学习是人工智能(AI)和计算机科学的一个分支
它侧重于使用数据和算法来模仿人类学习的方式,
逐渐提高其准确性
'''
nlp = pipeline(task='translation_en_to_fr')
print(f"{nlp(txt)[0]['translation_text']}"
)