使用pipeline API来快速使用一些预训练模型
使用预训练模型最简单的方法就是使用pipeline(),transformers提供了一些任务:
1、情感分析(Sentment analysis):分析文本是正面的还是负面的
2、文本生成(in English):提供一个语句,模型将生成这条语句的下一句3、命名实体识别(NER):在输入的语句中,对每个单词进行标记,来揭示该单词的含义(比如人物、地点等等)
4、问题回答:输入一段文本以及一个问题,来从文本中抽取出这个问题的答案
5、填补被遮蔽的文本:输入一段文本,其中一些单词被[MASK]标签取代,模型填补这些被遮蔽的文本
6、摘要生成:产生一段长文本的摘要
7、翻译:将一种语言的文本翻译成另一种语言
8、特征抽取:得到一段文本的tensor表示
接下来是一个情感分析的例子:
from transformers import pipeline
classifier = pipeline('sentiment-analysis')
当第一次执行这段代码的时候,会下载一个预训练模型(Pre-training model)以及他的一个标记器(tokenizer),标记器的作用是对文本进行预处理,随后模型会对处理过后的文本进行预测。
classifier('We are very happy to show you the Transformers library.')
[{'label':'POSITIVE','score':0.9997795224189758}]
可以看到返回值为一个列表,其中包含一个字典,字典中有两个元素,分别是这个句子的表情以及分数。
上面的例子只是输入一个句子进行情感分析,如果我们需要处理很多句子时,只需要把句子放到一个列表(list)中
sentences=["We are very happy to show you the Transformers library",
"We hope you don't hate it"]
results = classifier(sentences)
for result in results:
print(f"label:{result['label']},with score:{round(result['score'],4)}")
这里我们将两个句子以列表的形式送入classifier中,随后对得到的结果用一个for循环进行打印,得到的结果如下:
label: POSITIVE, with score: 0.9998
label: NEGATIVE, with score: 0.5309
可以看到,模型把第一个句子分成了积极,第二个句子分成了消极,但实际上第二个句子的得分更接近于一个中性。
回过头来再看这个模型,当我们创建这个模型的时候,它会默认下载一个叫做"distilbert-base-uncased-finetuned-sst-2-english"的模型,这个模型是使用DistillBERT architecture 以及在SST-2数据集上进行微调的模型。
如果希望不使用这个默认的数据集,比如说,我希望使用一个在法语数据上训练的模型。我们可以在这个网站 model hub(https://huggingface.co/models)来查看一些模型,这个网址收集了许多的由实验室训练出来的模型,同时还有一些社区模型(社区模型是指在一些特殊的数据集上对一些模型进行微调得到的模型)。
那么我们使用标签"French"以及"text-classification"进行搜索的时候,会得到一个结果"nlptown/bert-base-multilingual-uncashed-sentiment"
接下来看一下如何使用这个模型:
classifier = pipeline('sentiment-analysis',model="nlptown/bert-base-multilingual-uncashed-sentiment")
可以看到,这个分类器的定义和之前相比,只是在创建pipeline()的时候多指定了一个model字段。
还可以在指定模型的时候用存放了模型的本地的文件夹来指定模型,或者传递一个模型以及这个模型的标记器。
这个分类器不仅仅能处理英语,法语,甚至能处理西班牙语,德语。
接下来我们需要两个类,一个是AutoTokenizer,这个类是用来自动下载与模型相关联的标记器,并且可以进行实例化。
第二个类是AutoModelForSequenceClassification(在Tensorflow中是TFAutoModelForSequenceClassification)用来去下载模型本身。(注意:⚠️如果我们在别的任务上使用这个库,模型的类会发生改变)
from transformers import AutoTokenizer,AutoModelForSequenceClassification
为了下载我们那之前指定的模型和标记器,需要使用一个叫做from_pretrained()的方法
model_name ="nlptown/bert-base-multilingual-uncashed-sentiment"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
classifier = pipeline('sentiment-analysis',model=model,tokenizer=tokenizer)
在创建pipeline实例的时候,指明模型以及标记器。
如果你没有找到一个在和你用到的数据类似的预训练模型,你需要去自己把模型用在你的数据上并进行微调。