当前位置: 首页 > article >正文

LLM学习笔记(9)Transformers 库与 pipeline() 函数(中)

遮盖词填充

遮盖词填充是一种自然语言处理任务,目标是根据上下文预测被遮盖(<mask>)的单词。模型需要利用句子中其他已知的单词,填补未知的词位置。

应用场景:

  • 预训练阶段: 许多 Transformer 模型(如 BERT、RoBERTa)使用这种任务进行预训练,帮助模型学习上下文语义。
  • 填空测试: 在给定部分文本的情况下,预测某些缺失的词。
  • 信息补全: 自动完成部分缺失的句子。

工作原理:

  1. 在输入文本中,用特殊标记(如 <mask>)替换某些单词。
  2. 模型根据上下文预测被遮盖的位置最可能的单词。
  3. 输出是填补后的文本以及预测概率。

unmasker = pipeline("fill-mask")

功能:

  • 创建一个用于遮盖词填充任务的 pipeline,任务类型为 "fill-mask"
  • 默认模型: 如果没有指定模型名称,pipeline 会自动加载预训练模型 distilroberta-base

distilroberta-base 模型特点:

  • RoBERTa 模型的轻量级版本。
  • 专为遮盖词填充任务设计,能够根据上下文预测最可能的词。

results = unmasker("This course will teach you all about <mask> models.", top_k=2)

功能:

  1. 输入文本中包含特殊标记 <mask>,模型需要预测该位置的单词。
  2. 参数说明:
    • top_k=2:指定模型返回最有可能的前 2 个预测结果。
  3. 工作流程:
    • 模型对 <mask> 位置进行预测。
    • 按概率从高到低排序,返回前 2 个可能的词及其概率。

命名实体识别

什么是命名实体识别(NER)?

命名实体识别(Named Entity Recognition, NER) 是一种自然语言处理任务,用于从文本中识别并分类特定类型的实体,例如:

  • 人物(PER): 识别人名,例如 Sylvain
  • 组织(ORG): 识别组织名称,例如 Hugging Face
  • 地点(LOC): 识别地名,例如 Brooklyn

应用场景:

  • 信息抽取: 提取新闻中的关键实体。
  • 问答系统: 理解问题中的具体对象。
  • 情报分析: 分析文本中的实体及其关系。

ner = pipeline("ner", grouped_entities=True)

功能:

  • 创建一个命名实体识别(NER)任务的 pipeline。
  • "ner" 指定任务为命名实体识别。
  • grouped_entities=True 自动将同一实体的多个子词(tokens)合并为一个完整的实体。
    • 例如,将 HuggingFace 合并为 Hugging Face

默认模型:

  • 如果没有显式指定模型,pipeline 会加载默认模型 dbmdz/bert-large-cased-finetuned-conll03-english
  • 该模型基于 BERT,并在 CoNLL-2003 数据集上进行了微调。

ner = pipeline("ner", grouped_entities=True)

功能:

  • 创建一个命名实体识别(NER)任务的 pipeline。
  • "ner" 指定任务为命名实体识别。
  • grouped_entities=True 自动将同一实体的多个子词(tokens)合并为一个完整的实体。
    • 例如,将 HuggingFace 合并为 Hugging Face

默认模型:

  • 如果没有显式指定模型,pipeline 会加载默认模型 dbmdz/bert-large-cased-finetuned-conll03-english
  • 该模型基于 BERT,并在 CoNLL-2003 数据集上进行了微调。

为什么要将子词合并?

将子词(tokens)合并为完整实体(grouped_entities=True)的原因主要是为了提高结果的可读性实用性。以下是具体原因和详细解释:

子词(tokens)分裂的原因

  • 模型的分词器工作机制:
    • NLP 模型通常使用子词级别的分词器(如 BERT 的 WordPiece 或 RoBERTa 的 Byte-Pair Encoding)。
    • 一些词(特别是多音节词或非英语词汇)可能会被分解成多个子词(tokens)。例如:
      • Hugging Face 被分为 ["Hugging", "Face"]
      • Sylvain 被分为 ["S", "##ylvain"](BERT 中 ## 表示子词)。
    • 这种分词方法虽然优化了模型的处理能力,但输出结果可能不直观。

为什么需要合并子词?

1. 提高可读性

如果子词不合并,输出结果会像这样:

[{'entity': 'B-ORG', 'score': 0.97, 'word': 'Hugging'},
 {'entity': 'I-ORG', 'score': 0.97, 'word': 'Face'}]

  • B-ORG 表示实体的开始(Begin),I-ORG 表示实体的延续(Inside)。
  • 对普通用户来说,这种表示方式不够直观,难以理解。

合并后的输出变得更清晰易读:

[{'entity_group': 'ORG', 'score': 0.97, 'word': 'Hugging Face'}]

2. 简化后续处理

  • 在许多实际应用中,我们需要直接获取完整的实体(如人名、地点名、组织名)以便后续处理。
  • 如果没有合并子词,开发者需要自己编写额外的逻辑来拼接子词,这会增加开发复杂度。

避免多余细节

  • 对绝大多数用户来说,关心的是完整的实体,而不是模型如何将其拆分为子词。
  • 合并子词可以隐藏这种底层实现细节,让用户专注于高层语义结果。

示例对比

示例文本:

text = "My name is Sylvain and I work at Hugging Face in Brooklyn."

(1) 使用 grouped_entities=True

ner = pipeline("ner", grouped_entities=True)
results = ner(text)
print(results)

输出:

[
    {'entity_group': 'PER', 'score': 0.998, 'word': 'Sylvain'},
    {'entity_group': 'ORG', 'score': 0.979, 'word': 'Hugging Face'},
    {'entity_group': 'LOC', 'score': 0.993, 'word': 'Brooklyn'}
]

清晰地显示了每个实体及其类别。

(2) 使用 grouped_entities=False

ner = pipeline("ner", grouped_entities=False)
results = ner(text)
print(results)

输出:

[
    {'entity': 'B-PER', 'score': 0.998, 'word': 'S', 'start': 11, 'end': 12},
    {'entity': 'I-PER', 'score': 0.998, 'word': '##ylvain', 'start': 12, 'end': 18},
    {'entity': 'B-ORG', 'score': 0.979, 'word': 'Hugging', 'start': 33, 'end': 40},
    {'entity': 'I-ORG', 'score': 0.979, 'word': 'Face', 'start': 40, 'end': 45},
    {'entity': 'B-LOC', 'score': 0.993, 'word': 'Brooklyn', 'start': 49, 'end': 57}
]

  • 显示了每个子词的标签,适合需要逐步分析实体的情况。
总结:为什么选择 grouped_entities=True

主要优点:

  1. 提高输出的可读性,直接提供完整实体,便于理解和使用。
  2. 简化开发者工作量,避免手动拼接子词。
  3. 对大多数实际应用(如信息抽取、实体匹配等)更加适合。

适用场景:

  • grouped_entities=True
    • 需要直接获取完整实体,适合大多数高层任务。
  • grouped_entities=False
    • 需要精确分析子词或调试模型行为。

通过这种设置,可以根据任务需求灵活调整命名实体识别的粒度。

运行结果

[{'entity_group': 'PER', 'score': 0.9981694, 'word': 'Sylvain', 'start': 11, 'end': 18},

{'entity_group': 'ORG', 'score': 0.9796019, 'word': 'Hugging Face', 'start': 33, 'end': 45},

{'entity_group': 'LOC', 'score': 0.9932106, 'word': 'Brooklyn', 'start': 49, 'end': 57}]

字段解析

  1. Sylvain

    • entity_group PER,表示这是一个人名。
    • score 0.9981,表示模型非常自信 Sylvain 是一个人名。
    • word Sylvain,实际提取的实体文本。
    • startend 表示 Sylvain 在输入文本中的起始和结束位置(索引)。
  2. Hugging Face

    • entity_group ORG,表示这是一个组织名称。
    • score 0.9796,表示模型高度自信 Hugging Face 是一个组织。
    • word Hugging Face,自动将 HuggingFace 合并。
  3. Brooklyn

    • entity_group LOC,表示这是一个地点。
    • score 0.9932,表示模型非常自信 Brooklyn 是一个地点。
    • word Brooklyn,提取的实体文本。

命名实体识别中的常见实体类型

NER 模型通常需要识别以下几种实体类型:

标签含义示例
PER人名(Person)John, Sylvain
ORG组织(Organization)Google, Hugging Face
LOC地点(Location)Paris, Brooklyn
MISC其他(Miscellaneous)Python(编程语言)

这些标签源于 CoNLL-2003 数据集,这是命名实体识别任务的一个著名基准数据集,定义了以上四种实体类型。


http://www.kler.cn/a/417819.html

相关文章:

  • 数据结构 (16)特殊矩阵的压缩存储
  • Xilinx FPGA内部资源组成和说明汇总
  • 蓝桥杯第 23 场 小白入门赛
  • 利用Python爬虫精准获取淘宝商品详情的深度解析
  • Linux设置开启启动脚本
  • 【Linux-多线程】重谈地址空间+内存管理方式
  • 开源用户体验调查管理平台Formbricks
  • Easyexcel(7-自定义样式)
  • Linux高阶——1124—
  • 基于树莓派的安保巡逻机器人--项目介绍
  • JVM之Synthetic
  • 算法编程题-合并石头的最低成本
  • 七、传统循环神经网络(RNN)
  • PAT甲级-1143 Lowest Common Ancestor
  • 世界灌溉科技大会全球推广之旅,邀约美国、澳大利亚、土耳其等30余国采购商携千万资金到场采购
  • day21 链表
  • 免费搭建一个属于自己的个性化博客(Hexo+Fluid+Github)
  • Rk3588 onnx转rknn,出现 No module named ‘rknn‘
  • 【大数据学习 | 面经】HDFS的三副本机制和编码机制
  • Microsoft Excel如何插入多行
  • 【阿来来gis规划师工具箱说明书】h07四分标注
  • 管家婆工贸ERP BR044.当前库存余额表
  • 【kafka04】消息队列与微服务之Kafka 图形工具
  • Vue 2.0->3.0学习笔记(Vue 3 (三)- 其它 Composition API)
  • 【Pytorch】优化器(Optimizer)模块‘torch.optim’
  • QUICK 调试camera-xml解析