NLP 任务 - Pipeline 方式 - 完形填空
1 课程概览
本课讲解 Pipeline 方式进行完形填空。完形填空也叫遮蔽语言建模任务(Masked Language Modeling),是 BERT 的子任务。使用 [MASK] 占位符,一次只能预测一个 [MASK]。如果要预测多个 [MASK],必须通过循环实现。使用 Chinese BERT WWM 模型。
2 核心概念与定义
- 完形填空(Fill-Mask):遮蔽语言建模任务,预测 [MASK] 位置的词。
- [MASK]:占位符,表示要预测的位置。
- 一次只能预测一个 [MASK]:多个 [MASK] 必须通过循环实现。
3 模型与算法详解
完形填空任务
也叫遮蔽语言建模任务,是 BERT 的子任务。
- 任务名:fill-mask
- 使用 [MASK] 占位符
- 预测 [MASK] 位置的词
一次只能预测一个 [MASK]
一次只能预测一个 [MASK],不是一个字,是一个 [MASK]。
- 一次只能预测一个 [MASK]
- 如果要多个 [MASK],必须通过循环实现
- 循环:基于前面的结果,预测下一个 [MASK]
模型选择
使用 Chinese BERT WWM 模型。
| 任务 | 模型 |
|---|---|
| 完形填空 | chinese-bert-wwm |
如何找模型
在 HuggingFace 或 ModelScope 网站上找模型。
- 看首页热门任务
- 选自然语言处理
- 找对应任务的模型
- 搜索 chinese
HuggingFace vs ModelScope
| 网站 | 库 | 说明 |
|---|---|---|
| HuggingFace | transformers | 国外,需要梯子 |
| ModelScope | modelscope | 国内,不需要梯子 |
示例
"我想明天去[MASK]家吃饭" 预测 [MASK] 位置的词。
| 预测结果 | 概率 |
|---|---|
| 他家 | 高 |
| 你家 | 高 |
| 我家 | 高 |
| 您家 | 中 |
4 数学原理与推导
完形填空
$$P(w_{\text{mask}} | w_1, ..., w_{i-1}, [\text{MASK}], w_{i+1}, ..., w_n)$$
其中:
- $w_{\text{mask}}$ 是要预测的词
- $[\text{MASK}]$ 是占位符
- 其他词是上下文
BERT 的完形填空
BERT 使用双向注意力,同时利用上下文预测 [MASK]。
$$P(w_{\text{mask}}) = \text{softmax}(\text{BERT}(w_1, ..., [\text{MASK}], ..., w_n))$$
5 代码示例
from transformers import pipeline
def dm03_fill_mask():
"""Pipeline 方式:完形填空"""
# 1. 创建 pipeline 对象
model_path = "C:/software/softwallg/chinese-bert-wwm"
fill_mask = pipeline(
"fill-mask", # 完形填空任务
model=model_path,
tokenizer=model_path
)
# 2. 输入文本(使用 [MASK] 占位符)
text = "我想明天去[MASK]家吃饭"
# 3. 预测
result = fill_mask(text)
print(f"输入文本: {text}")
print(f"\n预测结果:")
for item in result:
print(f" {item['token_str']}: {item['score']:.4f}")
return fill_mask
def dm04_multi_mask():
"""多个 [MASK] 的处理(通过循环)"""
model_path = "C:/software/softwallg/chinese-bert-wwm"
fill_mask = pipeline(
"fill-mask",
model=model_path,
tokenizer=model_path
)
# 多个 [MASK] 必须通过循环实现
text = "我想明天去[MASK]家[MASK]饭"
# 逐个预测 [MASK]
while "[MASK]" in text:
result = fill_mask(text)
# 取概率最高的
predicted_word = result[0]['token_str']
# 替换第一个 [MASK]
text = text.replace("[MASK]", predicted_word, 1)
print(f"预测: {predicted_word}, 当前文本: {text}")
print(f"\n最终结果: {text}")
return text
# 测试
if __name__ == "__main__":
print("=== Pipeline 方式:完形填空 ===")
fill_mask = dm03_fill_mask()
print("\n=== 多个 [MASK] 的处理 ===")
dm04_multi_mask()
代码说明
| 代码 | 说明 |
|---|---|
pipeline("fill-mask", ...) | 创建完形填空 pipeline |
chinese-bert-wwm | Chinese BERT WWM 模型 |
[MASK] | 占位符 |
fill_mask(text) | 预测 [MASK] 位置的词 |
result[0]['token_str'] | 概率最高的词 |
text.replace("[MASK]", word, 1) | 替换第一个 [MASK] |
6 重难点与易错提醒
- ❗重点:完形填空也叫遮蔽语言建模任务,是 BERT 的子任务。
- ❗重点:一次只能预测一个 [MASK]。
- ❗重点:多个 [MASK] 必须通过循环实现。
- ⚠️易错:[MASK] 区分大小写,必须大写。
- 💡技巧:代码都是三行,最后一行固定,中间换任务名和模型。
7 课堂问答精选
Q1:完形填空任务是什么?
A:完形填空也叫遮蔽语言建模任务(Masked Language Modeling),是 BERT 的子任务。使用 [MASK] 占位符,预测 [MASK] 位置的词。
Q2:一次能预测多个 [MASK] 吗?
A:不能。一次只能预测一个 [MASK]。如果要预测多个 [MASK],必须通过循环实现,基于前面的结果预测下一个 [MASK]。
Q3:完形填空使用什么模型?
A:使用 chinese-bert-wwm 模型。
Q4:如何找模型?
A:在 HuggingFace 或 ModelScope 网站上,看首页热门任务,选自然语言处理,找对应任务的模型,搜索 chinese。
8 本课小结
- 完形填空:遮蔽语言建模任务,BERT 的子任务。
- 使用 [MASK] 占位符。
- 一次只能预测一个 [MASK]。
- 多个 [MASK] 必须通过循环实现。
- 使用 chinese-bert-wwm 模型。
- 代码三行:创建 pipeline → 输入文本 → 输出结果。
9 延伸思考
- AutoModel 方式如何使用?
- AutoModel 和 Pipeline 有什么区别?