一句中文缺了一个字时,BERT 的掩码语言模型可以根据左右文给出候选。它适合观察单个缺失 token 的补全,而不是像聊天模型那样续写一篇文章。下面用“北京是中国的□都”演示如何打印候选、分数和补全句,再由人工确认。
模型与环境
google-bert/bert-base-chinese 的模型资料标明中文、Fill-Mask 任务和 Apache-2.0 许可。示例固定 Transformers 4.57.1,CPU 推理,首次需要联网下载权重与分词器。Windows 可创建以下环境;macOS/Linux 使用 python3,并把后续解释器替换为 .venv/bin/python。

py -m venv .venv
.venv\Scripts\python -m pip install "torch>=2.6" "transformers==4.57.1" safetensors
用模型自身的掩码标记
保存下面代码为 fill_mask_demo.py,执行 .venv\Scripts\python fill_mask_demo.py。使用 tokenizer.mask_token 构造输入,避免换模型后仍写错特殊标记;本例明确只接受一个掩码位置。
from transformers import AutoTokenizer, pipeline
model_id = "google-bert/bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_id)
text = f"北京是中国的{tokenizer.mask_token}都。"
if text.count(tokenizer.mask_token) != 1:
raise ValueError("This demo requires exactly one mask token")
fill = pipeline("fill-mask", model=model_id, tokenizer=tokenizer, device=-1)
results = fill(text, top_k=5)
for number, item in enumerate(results, start=1):
print(number, {"candidate": item["token_str"], "token_id": int(item["token"]),
"score": float(item["score"]), "sequence": item["sequence"]})
assert len(results) == 5
assert all(tokenizer.mask_token not in item["sequence"] for item in results)
核对候选字和实际句子
程序应返回 5 个候选,每个都含 token_str、token ID、score 和补全后的 sequence。人工检查候选能否填回缺字位置;在这条人为示例中,“首”符合原句含义,但本文没有实跑并保证它排在第一位。分词后的 sequence 可能带空格,先看候选字与语义,不要求输出字符串逐字符等于原句。
分数与缺字长度的边界
score 表示模型对该位置词表候选的得分,不等于现实事实正确率。top_k 只展示其中一部分候选,其分数总和不必为 1。一个掩码对应一个模型 token;该中文模型经常按字处理,但不能把一个掩码当成任意长度的整词或整段占位。多字缺失、多个掩码及长文改写不属于这个最小例子。
把例子换成自己的短句
先选一条自己知道答案的短句,用模型掩码替掉其中一处,再确认正确候选是否出现。换成另一个上下文观察候选变化,能帮助理解模型如何利用左右文。若没有候选、输入没有掩码或句子超过窗口,先核对 tokenizer、任务名和分词长度;不能为了消除报错直接把模型换成普通 text-generation。
补全可给文本修订提供候选,但涉及姓名、金额、日期或专业术语时应回查原始材料,不让模型凭概率补造事实。对业务文本应保留原句、缺失位置、候选与最终人工选择;仅有一个看似合理的字不能证明原文就是这个字。
本文已核对官方接口与模型资料,示例输入为人为构造;未在本文环境下载并实跑所列公开模型,未测速度或任务准确率。验收需由你在自己的机器上执行,不能把示例程序当成真实任务效果评测。
官方资料
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31356.html