Evaluate库METEOR返回0分,如何与NLTK计算结果一致?
解决方案
问题核心是Evaluate的METEOR默认使用英文分词器(NLTK的word_tokenize)处理中文,导致中文句子被错误拆分,无法匹配参考句,最终得分0.0。要对齐NLTK版本结果,需替换分词逻辑为中文Tokenizer,有两种实现方式:
方式1:修改Evaluate库的METEOR源码
找到Evaluate库中meteor.py的实现文件,替换默认的英文分词逻辑:
- 引入中文Tokenizer
- 重写分词函数
修改后的核心代码片段:
# 替换原有的英文分词导入与函数 from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained('fnlp/bart-base-chinese') def _tokenize(text): # 使用中文Tokenizer分词,去除特殊token后返回token id列表 return tokenizer(text, add_special_tokens=False)["input_ids"]
修改后重新运行原Evaluate代码,即可得到与NLTK一致的得分。
方式2:不修改源码,手动传入分词结果
如果不想改动库源码,可在调用时提前完成中文分词,再传入Evaluate的compute方法:
import evaluate from transformers import AutoTokenizer # 初始化中文Tokenizer tokenizer = AutoTokenizer.from_pretrained('fnlp/bart-base-chinese') def cn_tokenize(text): return tokenizer(text, add_special_tokens=False)["input_ids"] # 准备数据 reference1 = "犯人受到了嚴密的監控。" hypothesis1 = "犯人受到嚴密監視。" # 手动分词(注意references需为二维列表) tokenized_preds = [cn_tokenize(hypothesis1)] tokenized_refs = [[cn_tokenize(reference1)]] # 加载METEOR指标,关闭自动分词 metric_meteor = evaluate.load("meteor") meteor = metric_meteor.compute( predictions=tokenized_preds, references=tokenized_refs, tokenize=False # 禁用内置分词,使用手动传入的结果 ) print("METEOR:", meteor["meteor"] * 100) # 输出约98.15
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

