非英语语言下ROUGE分数异常问题:马拉地语案例分析
问题
使用rouge_scorer计算ROUGE-1分数时,英文文本结果正常,但马拉地语文本出现异常全0分情况:
Case 1(英文文本,结果正常)
t1='match is needed' t2='match is perfect' scorer = rouge_scorer.RougeScorer(['rouge1'], use_stemmer=True) scores = scorer.score(t1,t2) print(scores)
输出:
{'rouge1': Score(precision=0.6666666666666666, recall=0.6666666666666666, fmeasure=0.6666666666666666)}
Case 2(马拉地语文本,结果正常)
t1='नवी दिल्ली: जगभरातील उद्योजक, सत्ताधीशांच्या काळ्या पैशासंदर्भातील उघड झालेला गोपनीय दस्ताऐवज ‘पनामा पेपर्स‘मुळे खळबळ माजलेली असताना, परदेशात मालमत्ता लपवणाऱ्या भारतीयांना ही कृती महागात पडू शकते असा कडक इशारा केंद्रीय अर्थमंत्री अरुण जेटली यांनी दिला आहे. काळ्या पैशाच्या समस्येवरील उपाययोजनेअंतर्गत गेल्या वर्षी (2015) कराश्रय सुविधा देणाऱ्या देशांमध्ये अघोषित मालमत्ता असलेल्यांना माहिती सरकारकडे उघड करण्याचा आदेश देण्यात आला होता. त्यावेळी 4,147 कोटी रुपयांच्या मालमत्ता घोषित करण्यात आली होती. भारतासह सुमारे 500 उद्योजक, सत्ताधीश आणि ' t2='नवी दिल्ली: जगभरातील उद्योजक, सत्ताधीशांच्या काळ्या पैशासंदर्भातील उघड झालेला गोपनीय दस्ताऐवज ‘पनामा पेपर्स‘मुळे खळबळ माजलेली असताना, परदेशात मालमत्ता लपवणाऱ्या भारतीयांना ही कृती महागात पडू शकते असा कडक इशारा केंद्रीय अर्थमंत्री अरुण जेटली यांनी दिला आहे. तरीही परदेशात मालमत्ता लपवून धोका पत्करणाऱ्यांना हा खेळ अत्यंत महागात पडू शकतो. काळ्या पैशाच्या समस्येवरील उपाययोजनेअंतर्गत गेल्या वर्षी (2015) कराश्रय सुविधा देणाऱ्या देशांमध्ये अघोषित मालमत्ता असलेल्यांना माहिती सरकारकडे उघड करण्याचा आदेश देण्यात आला होता. "त्यावेळी बऱ्याच जणांनी सरकारने ' scorer = rouge_scorer.RougeScorer(['rouge1'], use_stemmer=True) scores = scorer.score(t1,t2) print(scores)
输出:
{'rouge1': Score(precision=1.0, recall=0.25, fmeasure=0.4)}
Case 3(马拉地语文本,结果异常)
两段文本存在大量重叠内容,但输出全0分:
t1='नवी दिल्ली: जगभरातील उद्योजक, सत्ताधीशांच्या काळ्या पैशासंदर्भातील उघड झालेला गोपनीय दस्ताऐवज ‘पनामा पेपर्स‘मुळे खळबळ माजलेली असताना, परदेशात मालमत्ता लपवणाऱ्या भारतीयांना ही कृती महागात पडू शकते असा कडक इशारा केंद्रीय अर्थमंत्री अरुण जेटली यांनी दिला आहे. काळ्या पैशाच्या ' t2='नवी दिल्ली: जगभरातील उद्योजक, सत्ताधीशांच्या काळ्या पैशासंदर्भातील उघड झालेला गोपनीय दस्ताऐवज ‘पनामा पेपर्स‘मुळे खळबळ माजलेली असताना, परदेशात मालमत्ता लपवणाऱ्या भारतीयांना ही कृती महागात पडू शकते असा कडक इशारा केंद्रीय अर्थमंत्री अरुण जेटली यांनी दिला आहे. तरीही परदेशात ' scorer = rouge_scorer.RougeScorer(['rouge1'], use_stemmer=True) scores = scorer.score(t1,t2) print(scores)
输出:
{'rouge1': Score(precision=0.0, recall=0.0, fmeasure=0.0)}
疑问:为何非英语语言(如马拉地语)会出现此类ROUGE分数异常,而英文文本无此问题?
原因与解决方案
核心原因
- 词干提取不支持非英语:
rouge_scorer默认使用的Porter词干提取器仅适配英语,当设置use_stemmer=True时,马拉地语词汇会被错误处理,转换后变成无意义字符串或空值,无法匹配原文本中的词汇。 - 分词+词干处理的连锁问题:默认分词逻辑基于英语空格分隔规则,虽马拉地语也用空格分词,但结合错误的词干处理后,ROUGE-1计算依赖的unigram(单字词)匹配数量直接降为0,最终导致三项分数全为0。
Case 2能得到正常结果是因为文本中存在未被词干处理破坏的长匹配片段,而Case 3的文本截断后,剩余部分的词汇被词干器完全破坏,无有效匹配项。
解决方案
- 关闭词干提取:直接将
use_stemmer设为False,避免错误处理影响匹配:
scorer = rouge_scorer.RougeScorer(['rouge1'], use_stemmer=False)
此方法简单直接,能保留马拉地语词汇原始形态,正常计算重叠内容的ROUGE分数。
- 替换为支持马拉地语的词干提取器:若需要词干提取提升鲁棒性,可使用印度语言专属NLP工具(如NLTK的印度语言模块),自定义分词和词干处理逻辑:
from nltk.tokenize import word_tokenize from nltk.stem import SnowballStemmer # 初始化马拉地语词干器 mr_stemmer = SnowballStemmer('marathi') # 自定义预处理函数 def marathi_preprocess(text): tokens = word_tokenize(text, language='marathi') return [mr_stemmer.stem(token) for token in tokens] # 传入自定义tokenizer初始化scorer scorer = rouge_scorer.RougeScorer(['rouge1'], use_stemmer=False, tokenizer=marathi_preprocess)
内容的提问来源于stack exchange,提问作者Sonali Mhatre
相关产品推荐
相关产品推荐

