【Transformers实战】二、自然语言处理可解决的任务

transformer初始用于自然语言处理任务而产生的,也要用于自然语言处理的任务中,下面介绍9种任务。

〇、9种任务

  1. 文本二分类
  2. 文本多标签分类
  3. 句子相似性识别
  4. 实体命名识别
  5. 多项选择
  6. 文本生成
  7. 文本摘要
  8. 文本翻译
  9. 抽取式问答

一、文本二分类

1.1 介绍

根据给出的文本及标签对文本进行分类。
如:
Label,Content
1,6月下旬去丹东,在携程网上预定了丹东国际酒店2天的住宿。24日傍晚抵丹东,便打车去酒店。丹东城市不大,一说国际酒店,司机都知道。酒店在一条不起眼的小街上,周围环境一般。到总台一问,接待员说没有收到携程的预定单。我给他们看了手机收到的携程确认短信,接待员说那好吧,就按携程预定价住下吧。我说,能不能给个朝鸭绿江的房间,接待查了一下电脑,说可以,不过房间小了点,我说没关系,反正一个人住。安排的是15层(接待员还真满足了客人看江的要求),进了房间,往窗外一看,蜿蜒的鸭绿江就在眼前,朝鲜一侧的房屋和农田也清晰可见,稍远处隐约可见鸭绿江桥!房间略显旧了些,但床、被还较整洁、干净。这江景房的性价比应该是超值的!想当年国际酒店在丹东大概是数一数二的,现在来看,装修上比不上新开业的,大堂不太光亮,楼层的电梯口也只开了一小部分灯光,但服务上还不错。服务员遇到客人都会问好。特别值得一提的是23楼的旋转餐厅,可以与深圳国贸和上海新锦江顶楼的旋转餐厅相比拼!毕竟是在丹东那么一个边境小城里。20元的自助早餐较丰盛,再加上可以面对鸭绿江,饱览异国风光(尽管是农田沙洲景色)。在丹东国际酒店2天的停留还是给我留下来不错的印象。

1.2 基本思路

1)pre-trained

  1. 确定输入文本的最大长度
  2. tokenizer将文本转为id,超过最大长度截断、少于最大长度pad补齐
  3. 使用attention_mask记录哪些是pad哪些不是,不在pad上计算attention
  4. 使用bert_model计算句子的pooled_output表示

2)fine-tuned

  1. 建立全连接层,将pooled_output计算为2个值,分别代表类别1与类别2的概率。

二、文本多标签分类

2.1 介绍

与二分类类似,根据给出的文本及标签对文本进行分类,类别较多。
如:
THUCNews是根据新浪新闻RSS订阅频道2005~2011年间的历史数据筛选过滤生成,包含74万篇新闻文档(2.19 GB),均为UTF-8纯文本格式。我们在原始新浪新闻分类体系的基础上,重新整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐。

THUCNews

2.2 基本思路

使用transformer自带的AutoModelForSequenceClassification模型进行训练。查看模型的结构,可以看到最后自己带了分类器。

BertForSequenceClassification(
  (bert): BertModel(
    (embeddings): BertEmbeddings(
      (word_embeddings): Embedding(30522, 128, padding_idx=0)
      (position_embeddings): Embedding(512, 128)
      (token_type_embeddings): Embedding(2, 128)
      (LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
      (dropout): Dropout(p=0.1, inplace=False)
    )
    (encoder): BertEncoder(
      (layer): ModuleList(
        (0): BertLayer(
          (attention): BertAttention(
            (self): BertSelfAttention(
              (query): Linear(in_features=128, out_features=128, bias=True)
              (key): Linear(in_features=128, out_features=128, bias=True)
              (value): Linear(in_features=128, out_features=128, bias=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
            (output): BertSelfOutput(
              (dense): Linear(in_features=128, out_features=128, bias=True)
              (LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
          )
          (intermediate): BertIntermediate(
            (dense): Linear(in_features=128, out_features=512, bias=True)
            (intermediate_act_fn): GELUActivation()
          )
          (output): BertOutput(
            (dense): Linear(in_features=512, out_features=128, bias=True)
            (LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
            (dropout): Dropout(p=0.1, inplace=False)
          )
        )
        (1): BertLayer(
          (attention): BertAttention(
            (self): BertSelfAttention(
              (query): Linear(in_features=128, out_features=128, bias=True)
              (key): Linear(in_features=128, out_features=128, bias=True)
              (value): Linear(in_features=128, out_features=128, bias=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
            (output): BertSelfOutput(
              (dense): Linear(in_features=128, out_features=128, bias=True)
              (LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
          )
          (intermediate): BertIntermediate(
            (dense): Linear(in_features=128, out_features=512, bias=True)
            (intermediate_act_fn): GELUActivation()
          )
          (output): BertOutput(
            (dense): Linear(in_features=512, out_features=128, bias=True)
            (LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
            (dropout): Dropout(p=0.1, inplace=False)
          )
        )
      )
    )
    (pooler): BertPooler(
      (dense): Linear(in_features=128, out_features=128, bias=True)
      (activation): Tanh()
    )
  )
  (dropout): Dropout(p=0.1, inplace=False)
  (classifier): Linear(in_features=128, out_features=6, bias=True)
)

三、句子相似性识别

3.1 介绍

判断句子A与句子B是否相似。
如:
{"sentence1": "花呗分期支付的时候,明明显示了可以分期,但是为什么支付的时候,却扣全额款", "sentence2": "宝贝可用花呗分期,下单时提示支付全额,并没有提示花呗分期支付", "label": "0"}
{"sentence1": "花呗现在不能订酒店了吗", "sentence2": "花呗预定酒店服务怎么不见了", "label": "1"}

3.2 基本思路

1)pre-tuned

  1. 设置最大长度,为句子1 + 句子2的最大长度
  2. 分词tokenizer,将句子1与句子2分别放入函数,分词后的token_type_ids数组中0代表第一句、1代表第二句;句子与句子之间用[SEP]区分。
    如:
    ['[CLS]', '今', '天', '早', '上', '9', '点', '半', '起', '床', ',', '我', '在', '学', '习', '预', '训', '练', '模', '型', '的', '使', '用', '.', '[SEP]', '啊', '哈', '哈', '哈', '哈', '啊', '哈', '.', '[SEP]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']
  3. 选择模型如roberta-base

2)pre-tuned
加入分类输出层,固定Bert层,进行训练。

四、命名实体识别

4.1 介绍

将每个元素标注为“B-X”、“I-X”或者“O”。其中,“B-X”表示此元素所在的片段属于X类型并且此元素在此片段的开头,“I-X”表示此元素所在的片段属于X类型并且此元素在此片段的中间位置,“O”表示不属于任何类型。
如:
今(O)年(O)海(O)钓(O)比(O)赛(O)在(O)厦(B-LOC)门(I-LOC)市(E-LOC)与(O)金(B-LOC)门(E-LOC)之(O)间(O)的(O)海(O)域(O)举(O)行(O)。

命名实体识别类似于多分类任务,即对分词后的每个词预测类别。

4.2 基本做法

1、分词(n个词)
2、预测输出(n个词*m个类别)

五、多项选择

5.1 介绍

类似于阅读理解的多项选择题。
例如:

女: 怎么样?买到票了吗?
男: 火车站好多人啊,我排了整整一天的队,等排到我了,他们说没票了,要等过了年才有。
女: 没关系,过了年回来也是一样的。
男: 公司初六就上班了,我怕过了年来不及。要不今年您和我爸来上海过年吧?
女: 我这老胳膊老腿的不想折腾了。
男: 一点儿不折腾,等我帮你们买好票,你们直接过来就行。

Q2 男的遇到了什么困难?
A. 公司不放假
B. 过年东西贵
C. 没买到车票 ✔
D. 找不到车站

5.2 基本做法

  1. 构造样本集,对于Reference QA的,可以变成数据集feature: [Reference + Q + A1, Reference + Q + A2, Reference + Q + A3, Reference + Q + A4], lable: 0/1/2/3。
  2. 选取句子截断长度、分词等
  3. 选择AutoModelForMultipleChoice的模型进行训练

六、文本生成

6.1 介绍

文本生成可以包含很多子任务,但代表性的就是让机器写文章,在工业上并不好套用。

6.2 基本做法

  1. 分词
  2. 预测下一个词(分类)
  3. 分词
  4. 预测下一个词(分类)
    ...

七、文本摘要

7.1 介绍

摘要是一个经典的序列到序列(seq2seq)任务,有一个输入文本和一个目标文本。

seq2seq

图片来源:NLP知识普及 —— Encoder-Decoder 和 Seq2Seq

7.2 基本做法

  1. Encoder端为原文,Decoder端会构造很多样本,如:
步骤 Decoder输入 输出
1 [SOS] Knowledge
2 [SOS] Knowledge is
2 [SOS] Knowledge is power
2 [SOS] Knowledge is power [EOS]
  1. 训练
    使用AutoModelForSeq2SeqLM模型训练,使用DataCollatorForSeq2Seq构造样本。因为构造出很多样本,所以训练集特别大。

八、文本翻译

与七、文本摘要类似

九、问答

9.1 介绍

问答与阅读理解的多项选择类似,但是没有固定选项。问答阅读理解的一般任务形式为:给定一段或多段文本作为数据来源, 输入问题,经过处理后输出一段文本作为问题的答案。依据答案是否直接来自文本,可将阅读理解划分为抽取式阅读理解与生成式阅读理解。

抽取式问答模型通常采用纯 Encoder 框架(例如 BERT),它更适用于处理事实性问题,例如“谁发明了 Transformer 架构?”;而生成式问答模型则通常采用 Encoder-Decoder 框架(例如 T5、BART),它更适用于处理开放式问题,例如“天空为什么是蓝色的?”。

抽取式的做法
抽取句子中的词作为答案,所以是分类任务,求取start_index与end_index。

QA.PNG

9.2 基本做法

  1. 构造样本
    input: [CLS] question [SEP] context [SEP]
    output: start_index, end_index
  2. 分词
  3. 训练

参考及引用

Hugging Face 的 Transformers 库快速入门(九):抽取式问答

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容