LLM学习笔记(9)Transformers 库与 pipeline() 函数(中)
遮盖词填充
遮盖词填充是一种自然语言处理任务,目标是根据上下文预测被遮盖(<mask>
)的单词。模型需要利用句子中其他已知的单词,填补未知的词位置。
应用场景:
- 预训练阶段: 许多 Transformer 模型(如 BERT、RoBERTa)使用这种任务进行预训练,帮助模型学习上下文语义。
- 填空测试: 在给定部分文本的情况下,预测某些缺失的词。
- 信息补全: 自动完成部分缺失的句子。
工作原理:
- 在输入文本中,用特殊标记(如
<mask>
)替换某些单词。 - 模型根据上下文预测被遮盖的位置最可能的单词。
- 输出是填补后的文本以及预测概率。
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)
功能:
- 输入文本中包含特殊标记
<mask>
,模型需要预测该位置的单词。 - 参数说明:
top_k=2
:指定模型返回最有可能的前 2 个预测结果。
- 工作流程:
- 模型对
<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)合并为一个完整的实体。- 例如,将
Hugging
和Face
合并为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)合并为一个完整的实体。- 例如,将
Hugging
和Face
合并为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
主要优点:
- 提高输出的可读性,直接提供完整实体,便于理解和使用。
- 简化开发者工作量,避免手动拼接子词。
- 对大多数实际应用(如信息抽取、实体匹配等)更加适合。
适用场景:
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}]
字段解析
-
Sylvain
:entity_group
:PER
,表示这是一个人名。score
:0.9981
,表示模型非常自信 Sylvain 是一个人名。word
:Sylvain
,实际提取的实体文本。start
和end
: 表示 Sylvain 在输入文本中的起始和结束位置(索引)。
-
Hugging Face
:entity_group
:ORG
,表示这是一个组织名称。score
:0.9796
,表示模型高度自信 Hugging Face 是一个组织。word
:Hugging Face
,自动将Hugging
和Face
合并。
-
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 数据集,这是命名实体识别任务的一个著名基准数据集,定义了以上四种实体类型。