中文文本相似度分析指标:BERTScore
BERTScore 是一种用于文本生成任务(如机器翻译、文本摘要、图像描述生成、对话系统)的自动评估指标。它利用了预训练语言模型(如 BERT, RoBERTa, XLNet)的上下文嵌入能力来衡量生成文本(候选文本)与参考文本之间的语义相似度。
1.核心思想:与依赖精确单词匹配(如 BLEU)或表层 n-gram 匹配(如 ROUGE)不同,BERTScore 比较候选句子和参考句子中单词/标记的上下文嵌入。它衡量候选文本的含义与参考文本的对齐程度,能够捕捉到精确匹配所忽略的同义词、释义和语义关系。
2.工作原理:
生成嵌入:
- 将候选句子 (
cand
) 和参考句子 (ref
) 输入到一个预训练的 BERT 类模型中。 - 提取两个句子中每个标记(token)的上下文嵌入向量。
两两相似度计算:
- 对于候选句中的每个标记嵌入 (
cand_i
),计算它与参考句中每一个标记嵌入 (ref_j
) 的余弦相似度。 - 找到参考句中与候选标记 (
cand_i
) 余弦相似度最高的那个标记 (ref_j
)。这为候选句中的每个标记在参考句中找到了语义上最匹配的对应项。
3.聚合(精确率、召回率、F1 值):
- 召回率 (R_BERT): 计算参考句中每个标记与候选句所有标记匹配得到的最高相似度的平均值。衡量候选文本对参考文本内容的覆盖程度。
- 精确率 (P_BERT): 计算候选句中每个标记与参考句所有标记匹配得到的最高相似度的平均值。衡量候选文本中有多少内容是相关于参考文本的。
- F1 值 (F_BERT): 精确率和召回率的调和平均数 (
F1 = 2 * P * R / (P + R)
)。这是最常用的 BERTScore,提供了一个平衡的度量。
4.主要优势:
- 语义理解能力强: 在捕捉含义、释义和同义词方面显著优于基于 n-gram 的指标。例如,如果上下文匹配,候选文本中使用“汽车”代替“轿车”仍然可以获得高分。
- 与人类判断相关性更高: 在各种任务中,一致显示其与人类对文本质量(流畅性、充分性、意义保持)的评估结果相关性比 BLEU、ROUGE 或 METEOR 更高。
- 模型无关: 可用于评估任何文本生成模型的输出。
- 鲁棒性: 对不改变含义的表面形式微小变化不那么敏感。
- 灵活性: 可以使用不同的底层模型(如 BERT-base, RoBERTa-large 等),允许在速度和准确性之间进行权衡。
5.局限性与注意事项:
- 计算成本高: 运行大型 Transformer 模型生成嵌入比计数 n-gram(如 BLEU/ROUGE)更慢且需要更多计算资源。
- 模型依赖性: 分数依赖于所选底层预训练模型及其固有偏差。更大的模型通常给出更好的分数,但速度更慢。
- 分词影响: 对底层模型使用的分词器敏感(例如,BERT 使用的 WordPiece)。
- 缺乏显式的多样性衡量: 主要衡量候选文本相对于参考文本的忠实度/相似度,不一定衡量候选文本的多样性或创造性。
- 基线/校准: 绝对分数值本身并不总是直观的。关键是将分数与基线或在相同的评估设置/模型下进行比较。通常应用重新缩放(例如
(分数 - 基线) / (1 - 基线)
)。 - 参考文本质量: 与所有基于参考的指标一样,它假设参考文本是高质量的。通常使用多个参考文本可以提高可靠性。
6.何时使用 BERTScore:
- 当语义准确性至关重要时(例如,评估摘要中的事实正确性、翻译中的意义保持)。
- 当评估释义常见或期望的任务时。
- 当需要尽可能高的与人类判断相关性且计算成本可接受时。
- 作为传统指标(BLEU, ROUGE)的补充,以获得更全面的评估视角。
7.实现:
- 可通过官方 Python 包轻松计算:
pip install bert-score
- 与 Hugging Face 的
transformers
和datasets
库集成良好。
举例:
from bert_score import scorecands = ['你好,我喜欢你']
refs = ['你好,我不喜欢你']P, R, F1 = score(cands, refs, model_type="bert-base-chinese", lang="zh", verbose=True)
print(P, R, F1)
print(f"System level F1 score: {F1.mean():.3f}")
输出:
tensor([0.9703]) tensor([0.9227]) tensor([0.9459])
System level F1 score: 0.946
步骤1: 文本预处理与向量化
1.分词(使用BERT的tokenizer):
候选句: ["你", "好", ",", "我", "喜", "欢", "你"]
参考句: ["你", "好", ",", "我", "不", "喜", "欢", "你"]
2.生成上下文向量:
-
通过
bert-base-chinese
模型获取每个token的768维向量 -
候选句向量:
-
参考句向量:
步骤2: 构建相似度矩阵
计算每个候选token与参考token的余弦相似度:
生成7×8的相似度矩阵:
u1(你) u2(好) u3(,) u4(我) u5(不) u6(喜) u7(欢) u8(你)
v1(你) 0.99 0.15 0.02 0.12 0.08 0.10 0.05 0.85
v2(好) 0.18 0.98 0.10 0.15 0.05 0.12 0.08 0.20
v3(,) 0.05 0.12 0.97 0.08 0.03 0.07 0.05 0.06
v4(我) 0.15 0.20 0.10 0.96 0.25 0.18 0.12 0.18
v5(喜) 0.12 0.15 0.08 0.20 0.35 0.95 0.85 0.15
v6(欢) 0.10 0.12 0.06 0.18 0.30 0.82 0.97 0.12
v7(你) 0.80 0.20 0.05 0.15 0.10 0.12 0.08 0.98
注:实际值由BERT模型生成,此为示意矩阵
步骤3: 计算精确率 (Precision)
定义:候选句中的每个token与参考句中最相似token的匹配质量:
逐行取最大值:
v1(你): max=0.99 (匹配u1)
v2(好): max=0.98 (匹配u2)
v3(,): max=0.97 (匹配u3)
v4(我): max=0.96 (匹配u4)
v5(喜): max=0.95 (匹配u6)
v6(欢): max=0.97 (匹配u7)
v7(你): max=0.98 (匹配u8)
步骤4: 计算召回率 (Recall)
定义:参考句中的每个token与候选句中最相似token的匹配质量
逐列取最大值:
u1(你): max=0.99 (匹配v1)
u2(好): max=0.98 (匹配v2)
u3(,): max=0.97 (匹配v3)
u4(我): max=0.96 (匹配v4)
u5(不): max=0.35 (匹配v5) → 关键差异点!
u6(喜): max=0.95 (匹配v5)
u7(欢): max=0.97 (匹配v6)
u8(你): max=0.98 (匹配v7)
步骤5: 计算F1值
定义:Precision和Recall的调和平均
计算:
关键发现:
-
高精确率原因:
-
候选句所有token在参考句中都有强匹配
-
"喜欢"匹配到参考句的"喜欢"(忽略"不")
-
-
召回率下降原因:
-
参考句的"不"在候选句无直接对应
-
最佳匹配是"喜"(0.35),因为:
-
"不"与内容词"喜"有较低语义关联
-
BERT将"不喜欢"视为整体单元,但被强制拆解匹配
-
-
-
语义盲区:
-
虽F1高达0.9459,但未捕捉否定关系
-
因BERTScore基于token级相似度,而非逻辑结构
-
可视化计算差异:
候选句: 你 好 , 我 喜 欢 你
匹配度: ✓ ✓ ✓ ✓ ✓ ✓ ✓ (P=0.9703)参考句: 你 好 , 我 不 喜 欢 你
匹配度: ✓ ✓ ✓ ✓ ✗(0.35) ✓ ✓ ✓ (R=0.9227)└─未匹配的关键否定词
这种计算方式解释了为什么语义相反的句子仍得高分:BERTScore测量的是局部语义相似度而非全局逻辑一致性。对于否定等逻辑操作,需要结合NLI等专项模型才能准确捕捉。