huggingfacer QuestionAnswerig问答模型调用方式

11 篇文章 1 订阅
文章展示了huggingface的问答模型在transformers较低版本下可能出现的问题,即输出完整上下文而非答案。通过升级到transformersv4版本,可以得到正确的问答结果。此外,还提供了一种不同的调用方式,使用了不同的预训练模型,但结果可能略有差异。
摘要由CSDN通过智能技术生成

        huggingface网站提供了大量深度学习预训练模型及其调用方式。本文主要介绍问答模型调用方式,主要是针对问答结果输出完整上下文的问题。其现象在于问题答案为输入的上下文,而不是答案部分。出现该问题主要原因是transformers版本过低。

1 完整输出上下文

        下面示例程序采用transformers v2版本,输出结果是完整上下文,即不正确的问答结果。

#Transformers v2,
# -*- coding: utf-8 -*-
from transformers import AutoModelForQuestionAnswering,AutoTokenizer,pipeline
if __name__ == '__main__':
    context = '卡利亚·基拔(,)生于英国汉默史密斯,是一名英格兰籍职业足球员,于2010年夏季约满离开母会阿仙奴。直到2005/06年,基拔通常在阿仙奴的青年后备队效力。他在首次在2005年11月29日的联赛杯赛事上场,并于12月7日,在一个欧洲联赛冠军杯比赛对阿积士,作为替代左后卫,入替受伤的劳伦。2006年7月21日阿仙奴宣布,将基拔出借卡迪夫城整个2006-07赛季,其后转借给修安联。2008年1月3日返回阿仙奴授予46号码。2008年2月11日,阿仙奴的英超联赛比赛中对布莱克本作为后备球员。但2008年7月10日,基拔被出借莱斯特城的一个赛季之久。2009年3月3日主场对-{zh-hans:斯托克港;zh-hk:史托港}-,开赛后仅两分钟,基拔的传中球「挞Q」却直入网角,是他个人首个入球。基拔在外借期间成为常规正选,整季上阵达39场及射入1球,协助莱斯特城赢取英甲联赛冠军及重返英冠。2009/10年上半季仅于两场英格兰联赛杯及一场无关痛痒的欧联分组赛上阵,将于季后约满的基拔获外借到英冠榜末球会彼德堡直到球季结束,期间上阵10场。2010年夏季基拔约满阿仙奴成为自由球员,仅为母会合共上阵10场,英超「升班马」黑池有意罗致,其后前往-{zh-hans:谢菲尔德联; zh-hk:锡菲联;}-参加试训,惟未有获得录用。'
    mode_name = 'liam168/qa-roberta-base-chinese-extractive'
    model = AutoModelForQuestionAnswering.from_pretrained(mode_name)
    tokenizer = AutoTokenizer.from_pretrained(mode_name)
    QA = pipeline('question-answering', model=model, tokenizer=tokenizer)
    QA_input = {'question': "卡利亚·基拔的职业是什么?",'context': context}
    print(QA(QA_input))

      输出结果如下所示:

 {'score': 0.9999152439741863, 'start': 0, 'end': 535, 'answer': '卡利亚·基拔(,)生于英国汉默史密斯,是一名英格兰籍职业足球员,于2010年夏季约满离开母会阿仙奴。直到2005/06年,基拔通常在阿仙奴的青年后备队效力。他在首次在2005年11月29日的联赛杯赛事上场,并于12月7日,在一个欧洲联赛冠军杯比赛对阿积士,作为替代左后卫,入替受伤的劳伦。2006年7月21日阿仙奴宣布,将基拔出借卡迪夫城整个2006-07赛季,其后转借给修安联。2008年1月3日返回阿仙奴授予46号码。2008年2月11日,阿仙奴的英超联赛比赛中对布莱克本作为后备球员。但2008年7月10日,基拔被出借莱斯特城的一个赛季之久。2009年3月3日主场对-{zh-hans:斯托克港;zh-hk:史托港}-,开赛后仅两分钟,基拔的传中球「挞Q」却直入网角,是他个人首个入球。基拔在外借期间成为常规正选,整季上阵达39场及射入1球,协助莱斯特城赢取英甲联赛冠军及重返英冠。2009/10年上半季仅于两场英格兰联赛杯及一场无关痛痒的欧联分组赛上阵,将于季后约满的基拔获外借到英冠榜末球会彼德堡直到球季结束,期间上阵10场。2010年夏季基拔约满阿仙奴成为自由球员,仅为母会合共上阵10场,英超「升班马」黑池有意罗致,其后前往-{zh-hans:谢菲尔德联;'}

2 正确输出结果

        下面示例程序采用transformers v4版本,可以得到正确的问答结果。

#Transformers v4,
# -*- coding: utf-8 -*-
from transformers import AutoModelForQuestionAnswering,AutoTokenizer,pipeline
if __name__ == '__main__':
    context = '卡利亚·基拔(,)生于英国汉默史密斯,是一名英格兰籍职业足球员,于2010年夏季约满离开母会阿仙奴。直到2005/06年,基拔通常在阿仙奴的青年后备队效力。他在首次在2005年11月29日的联赛杯赛事上场,并于12月7日,在一个欧洲联赛冠军杯比赛对阿积士,作为替代左后卫,入替受伤的劳伦。2006年7月21日阿仙奴宣布,将基拔出借卡迪夫城整个2006-07赛季,其后转借给修安联。2008年1月3日返回阿仙奴授予46号码。2008年2月11日,阿仙奴的英超联赛比赛中对布莱克本作为后备球员。但2008年7月10日,基拔被出借莱斯特城的一个赛季之久。2009年3月3日主场对-{zh-hans:斯托克港;zh-hk:史托港}-,开赛后仅两分钟,基拔的传中球「挞Q」却直入网角,是他个人首个入球。基拔在外借期间成为常规正选,整季上阵达39场及射入1球,协助莱斯特城赢取英甲联赛冠军及重返英冠。2009/10年上半季仅于两场英格兰联赛杯及一场无关痛痒的欧联分组赛上阵,将于季后约满的基拔获外借到英冠榜末球会彼德堡直到球季结束,期间上阵10场。2010年夏季基拔约满阿仙奴成为自由球员,仅为母会合共上阵10场,英超「升班马」黑池有意罗致,其后前往-{zh-hans:谢菲尔德联; zh-hk:锡菲联;}-参加试训,惟未有获得录用。'
    mode_name = 'liam168/qa-roberta-base-chinese-extractive'
    model = AutoModelForQuestionAnswering.from_pretrained(mode_name)
    tokenizer = AutoTokenizer.from_pretrained(mode_name)
    QA = pipeline('question-answering', model=model, tokenizer=tokenizer)
    QA_input = {'question': "卡利亚·基拔的职业是什么?",'context': context}
    print(QA(QA_input))

        输出结果如下所示:

        {'score': 0.9999152421951294, 'start': 20, 'end': 31, 'answer': '一名英格兰籍职业足球员'}

3 另一种调用方式及其结果

# -*- coding: utf-8 -*-
from transformers import AutoTokenizer, AutoModelForQuestionAnswering, QuestionAnsweringPipeline
if __name__ == '__main__':
    context = '卡利亚·基拔(,)生于英国汉默史密斯,是一名英格兰籍职业足球员,于2010年夏季约满离开母会阿仙奴。直到2005/06年,基拔通常在阿仙奴的青年后备队效力。他在首次在2005年11月29日的联赛杯赛事上场,并于12月7日,在一个欧洲联赛冠军杯比赛对阿积士,作为替代左后卫,入替受伤的劳伦。2006年7月21日阿仙奴宣布,将基拔出借卡迪夫城整个2006-07赛季,其后转借给修安联。2008年1月3日返回阿仙奴授予46号码。2008年2月11日,阿仙奴的英超联赛比赛中对布莱克本作为后备球员。但2008年7月10日,基拔被出借莱斯特城的一个赛季之久。2009年3月3日主场对-{zh-hans:斯托克港;zh-hk:史托港}-,开赛后仅两分钟,基拔的传中球「挞Q」却直入网角,是他个人首个入球。基拔在外借期间成为常规正选,整季上阵达39场及射入1球,协助莱斯特城赢取英甲联赛冠军及重返英冠。2009/10年上半季仅于两场英格兰联赛杯及一场无关痛痒的欧联分组赛上阵,将于季后约满的基拔获外借到英冠榜末球会彼德堡直到球季结束,期间上阵10场。2010年夏季基拔约满阿仙奴成为自由球员,仅为母会合共上阵10场,英超「升班马」黑池有意罗致,其后前往-{zh-hans:谢菲尔德联; zh-hk:锡菲联;}-参加试训,惟未有获得录用。'
    model_name = "chinese_pretrain_mrc_roberta_wwm_ext_large"
    tokenizer = AutoTokenizer.from_pretrained(f"luhua/{model_name}")
    model = AutoModelForQuestionAnswering.from_pretrained(f"luhua/{model_name}")
    QA = QuestionAnsweringPipeline(model,tokenizer)
    QA_input = {'question': "卡利亚·基拔的职业是什么?",'context': context}
    print(QA(QA_input))
#输出结果:{'score': 0.5592695474624634, 'start': 26, 'end': 31, 'answer': '职业足球员'}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Hugging Face是一个自然语言处理(NLP)模型和工具库的开源社区,它提供了许多预训练的NLP模型和相关工具。使用Hugging Face可以方便地加载、使用和部署这些模型。 要在本地使用Hugging Face模型,首先需要安装`transformers`库。可以使用以下命令进行安装: ``` pip install transformers ``` 安装完成后,可以通过以下步骤来使用本地模型: 1. 导入所需的库和模型: ```python from transformers import AutoModelForQuestionAnswering, AutoTokenizer model_name = "模型名称" # 比如"bert-base-chinese" model = AutoModelForQuestionAnswering.from_pretrained(model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) ``` 2. 准备输入数据: ```python context = "上下文文本" # 输入的上下文文本 question = "问题文本" # 输入的问题文本 ``` 3. 对输入进行编码和处理: ```python inputs = tokenizer.encode_plus(question, context, add_special_tokens=True, return_tensors="pt") input_ids = inputs["input_ids"].tolist()[0] attention_mask = inputs["attention_mask"].tolist()[0] ``` 4. 使用模型进行预测: ```python outputs = model(**inputs) start_scores = outputs.start_logits end_scores = outputs.end_logits start_index = torch.argmax(start_scores) end_index = torch.argmax(end_scores) answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[start_index:end_index+1])) ``` 以上是使用Hugging Face的步骤,你可以根据自己的需求进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding的叶子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值