cefr-analyzer
Version:
分析英文文本中各CEFR级别(A1-C2)单词的数量
111 lines (110 loc) • 4.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateSimpleVisualization = exports.getComplexityLevel = exports.calculateComplexityScore = exports.formatAnalysisResult = void 0;
/**
* 格式化CEFR分析结果为可读文本
* @param result CEFR分析结果
* @returns 格式化后的文本
*/
function formatAnalysisResult(result) {
const { totalWords, levelCounts, levelPercentages, unknownWords } = result;
// 构建结果字符串
let formattedResult = '## CEFR 词汇分析结果\n\n';
// 添加总览信息
formattedResult += `总单词数: ${totalWords}\n`;
formattedResult += `已识别单词: ${totalWords - unknownWords} (${(((totalWords - unknownWords) / totalWords) *
100).toFixed(2)}%)\n`;
formattedResult += `未识别单词: ${unknownWords} (${((unknownWords / totalWords) * 100).toFixed(2)}%)\n\n`;
// 添加各级别统计
formattedResult += '### 各CEFR级别单词分布\n\n';
formattedResult += '| 级别 | 单词数 | 百分比 |\n';
formattedResult += '|------|--------|--------|\n';
const levels = ['a1', 'a2', 'b1', 'b2', 'c1', 'c2'];
levels.forEach(level => {
const count = levelCounts[level];
const percentage = levelPercentages[level].toFixed(2);
formattedResult += `| ${level.toUpperCase()} | ${count} | ${percentage}% |\n`;
});
return formattedResult;
}
exports.formatAnalysisResult = formatAnalysisResult;
/**
* 计算文本的CEFR复杂度得分
* 基于各级别单词的加权平均值
* @param result CEFR分析结果
* @returns ICEFRAnalysisResult score得分1~6,level对应等级
*/
function calculateComplexityScore(result) {
const { totalWords, levelPercentages } = result;
// ✅ 1. 权重设定
const weights = {
a1: 1.0,
a2: 2.0,
b1: 3.5,
b2: 5.0,
c1: 7.0,
c2: 9.5,
};
// ✅ 2. 基础难度得分(加权平均)
let baseScore = 0;
for (const level of Object.keys(weights)) {
baseScore += (levelPercentages[level] || 0) * weights[level];
}
baseScore /= 100;
const shortPenalty = totalWords < 30 ? ((30 - totalWords) / 30) * 0.5 : 0;
// ✅ 3. 超短文本特殊处理
if (totalWords < 10) {
const adjustedScore = Math.max(0, baseScore - shortPenalty);
return {
score: parseFloat(adjustedScore.toFixed(2)),
level: getComplexityLevel(adjustedScore),
note: 'Too short to evaluate CEFR level reliably.',
};
}
// ✅ 4. 奖励长文本
// 奖励长文本,(上限1.0分)
const longBonus = Math.min(1.0, Math.log(Math.max(1, totalWords - 50)) / 10);
const adjustedScore = Math.max(0, baseScore + longBonus - shortPenalty);
return {
score: parseFloat(adjustedScore.toFixed(2)),
level: getComplexityLevel(adjustedScore),
};
}
exports.calculateComplexityScore = calculateComplexityScore;
/**
* 根据复杂度得分获取对应的CEFR级别
* @param score 复杂度得分(1-6)
* @returns 对应的CEFR级别
*/
function getComplexityLevel(score) {
if (score < 1.2)
return 'a1';
if (score < 1.7)
return 'a2';
if (score < 2.2)
return 'b1';
if (score < 2.8)
return 'b2';
if (score < 3.5)
return 'c1';
return 'c2';
}
exports.getComplexityLevel = getComplexityLevel;
/**
* 生成CEFR级别分布的简单可视化
* @param result CEFR分析结果
* @returns ASCII图表字符串
*/
function generateSimpleVisualization(result) {
const { levelPercentages } = result;
const levels = ['a1', 'a2', 'b1', 'b2', 'c1', 'c2'];
let visualization = '### CEFR级别分布可视化\n\n';
levels.forEach(level => {
const percentage = levelPercentages[level];
const barLength = Math.floor(percentage / 2); // 每2%对应1个字符
const bar = '█'.repeat(barLength);
visualization += `${level.toUpperCase()}: ${bar} ${percentage.toFixed(2)}%\n`;
});
return visualization;
}
exports.generateSimpleVisualization = generateSimpleVisualization;