Files
platform-pipi/packages/voice-production/scripts/fix_introduces.js
T
2026-02-09 13:30:43 +08:00

421 lines
8.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fs = require('fs');
const inputPath =
'/Users/joey-xd/sites/pipi-learn/platform-pipi/packages/voice-production/data/char/char_introduce_v2.json';
const data = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
// ========== 修复词典 ==========
// 格式: char → 常用词/短语,用于生成 "charword的char"
// 覆盖 "X字的X" 和 "X的X" 两类问题
const wordFixes = {
// --- "X字的X" 类 (294个) ---
: '迟到',
: '局面',
: '改变',
: '张开',
: '禁忌',
: '国际',
: '陆地',
: '阿谀',
: '陈列',
: '阻止',
: '附近',
: '坠落',
: '歌妓',
: '美妙',
: '妖怪',
: '姊妹',
: '妨碍',
: '嫉妒',
: '努力',
: '忍耐',
: '抽屉',
: '拐弯',
: '拖延',
: '读者',
: '拍手',
: '头顶',
: '拆除',
: '拎包',
: '拥抱',
: '抵达',
: '拘留',
: '势力',
: '拥抱',
: '拄杖',
: '垃圾',
: '拉开',
: '拦截',
: '幸福',
: '搅拌',
: '拧开',
: '分歧',
: '肯定',
齿: '牙齿',
: '一些',
: '卓越',
: '老虎',
: '俘虏',
: '肾脏',
: '贤明',
: '高尚',
: '兴旺',
: '工具',
: '味道',
: '水果',
: '昆虫',
: '国家',
: '哎呀',
: '咕噜',
: '昌盛',
: '呵护',
: '疙瘩',
: '柑橘',
: '枯萎',
: '把柄',
: '栋梁',
: '互相',
: '检查',
: '柏树',
: '栅栏',
: '柳树',
: '柱子',
: '柿子',
: '栏杆',
: '柠檬',
: '大树',
: '蓬勃',
: '需要',
: '请柬',
: '咸淡',
: '威力',
: '歪斜',
: '韭菜',
: '背后',
: '战争',
: '点头',
: '虐待',
: '临时',
: '浏览',
: '竖立',
: '省份',
: '削苹果',
: '品尝',
: '愚昧',
: '打盹',
: '是非',
: '盼望',
: '眨眼',
: '哇塞',
: '哄堂大笑',
: '哑巴',
: '显然',
: '很好',
: '打猎',
: '猫咪',
: '凤凰',
: '猖狂',
: '猛烈',
: '祭祀',
: '馅饼',
: '博物馆',
: '凑合',
: '减少',
: '毫米',
: '烹饪',
: '庶民',
: '麻烦',
: '尼姑庵',
: '痊愈',
: '发痒',
: '痕迹',
: '走廊',
: '健康',
: '所谓',
: '谚语',
: '谜语',
: '逮捕',
: '勇敢',
: '上尉',
: '屠宰',
: '子弹',
: '隋朝',
: '堕落',
: '随便',
: '鸡蛋',
: '角隅',
: '隆重',
: '隐藏',
: '结婚',
: '婶婶',
: '婉转',
: '颇多',
: '颈椎',
: '替代',
: '揍人',
: '款式',
: '堪称',
: '宝塔',
: '搭建',
: '堤堰',
: '揩油',
: '超越',
: '趁机',
: '趋势',
: '超级',
: '包揽',
: '堤坝',
: '提高',
: '博学',
: '揭开',
: '欢喜',
: '彭姓',
: '揣测',
: '装扮',
: '野蛮',
: '成就',
: '敦厚',
: '文武双全',
: '痘痘',
: '痢疾',
: '瘫痪',
: '痛苦',
: '儿童',
: '竣工',
: '辽阔',
: '善良',
: '飞翔',
: '羡慕',
: '普通',
: '粪便',
: '尊重',
: '奠基',
: '道路',
: '橄榄',
: '想象',
: '槐树',
: '榆树',
: '楼房',
: '大概',
: '依赖',
: '报酬',
: '感觉',
: '阻碍',
: '尴尬',
: '矮小',
: '辞职',
: '幼稚',
: '稠密',
: '颓废',
: '忧愁',
: '筹划',
: '简单',
: '筷子',
: '毁灭',
: '舅舅',
: '老鼠',
: '催促',
: '傻瓜',
: '好像',
: '躲藏',
: '魁梧',
: '衙门',
: '微小',
: '馍馍',
: '重叠',
: '缠绕',
: '缤纷',
: '围剿',
: '安静',
: '碧绿',
: '玻璃',
: '累赘',
: '熬夜',
: '围墙',
: '废墟',
: '嘉奖',
: '摧毁',
: '显赫',
: '截断',
: '发誓',
: '环境',
: '采摘',
: '摔倒',
: '撇开',
: '聚集',
: '蜡烛',
: '苍蝇',
: '蜘蛛',
: '蝉鸣',
: '干嘛',
: '嘀咕',
: '赚钱',
: '铁锹',
: '锻炼',
: '镀金',
: '跳舞',
: '舔嘴',
: '稳定',
: '熏陶',
: '簸箕',
: '计算',
: '箩筐',
: '管理',
: '洞箫',
: '舆论',
: '薄饼',
: '颠倒',
: '翰墨',
: '噩梦',
: '橱柜',
: '橙子',
: '橘子',
: '整齐',
: '融化',
: '瓢虫',
: '清醒',
: '霍然',
: '霎时',
: '车辙',
: '希冀',
: '餐厅',
: '嘴巴',
: '踱步',
: '马蹄',
: '蹂躏',
: '奢靡',
: '皮癣',
: '花瓣',
: '肉羹',
: '甲鳖',
: '爆炸',
: '边疆',
: '鬓角',
: '土壤',
: '温馨',
耀: '闪耀',
: '急躁',
: '蠕动',
: '咀嚼',
: '叫嚷',
: '巍峨',
: '书籍',
: '鱼鳞',
: '魔法',
: '糯米',
// --- "X的X" 类 (47个) ---
: '你好',
: '关系',
: '茎叶',
: '画画',
: '鲤鱼',
: '小狗',
: '底部',
: '石油',
: '泡泡',
: '天空',
: '钠元素',
: '看见',
: '宝剑',
: '总是',
: '给予',
: '起来',
: '树根',
: '党员',
: '哦哦',
: '圆形',
: '钾元素',
: '铁路',
: '铅笔',
: '秤杆',
: '一般',
: '爱心',
: '灰狼',
: '谁人',
: '足球',
: '硅谷',
: '做事',
: '您好',
: '真假',
: '效率',
: '铁锅',
: '锌元素',
: '白鹅',
: '自然',
: '稀粥',
: '打鼓',
: '搬家',
: '摇晃',
: '搞笑',
: '池塘',
: '摊贩',
: '聘请',
: '慢慢',
};
// ========== 修复逻辑 ==========
let fixCount = 0;
function fixIntroduce(ch, intro) {
// 检测 "XX字的X" 模式
const m1 = intro.match(/^(.)(.)字的\1$/);
if (m1 && m1[1] === m1[2]) {
const okPairs = ['文字', '写字', '名字', '签字', '数字'];
if (!okPairs.includes(m1[2] + '字')) {
if (wordFixes[ch]) {
fixCount++;
return `${ch}${wordFixes[ch]}${ch}`;
}
}
}
// 检测 "XX的X" 自引用模式
const m2 = intro.match(/^(.)\1的\1$/);
if (m2) {
if (wordFixes[ch]) {
fixCount++;
return `${ch}${wordFixes[ch]}${ch}`;
}
}
return intro;
}
Object.entries(data).forEach(([ch, val]) => {
if (ch.startsWith('_')) return;
if (typeof val[0] === 'string') {
// 单音字: [pinyin, meaning, introduce]
val[2] = fixIntroduce(ch, val[2]);
} else {
// 多音字: [[pinyin, meaning, introduce], ...]
val.forEach((r) => {
r[2] = fixIntroduce(ch, r[2]);
});
}
});
// ========== 写入 ==========
fs.writeFileSync(inputPath, JSON.stringify(data, null, 2), 'utf8');
console.log(`修复完成: ${fixCount} 个 introduce 已更新`);
// ========== 验证 ==========
const dataCheck = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
let remaining = 0;
Object.entries(dataCheck).forEach(([ch, val]) => {
if (ch.startsWith('_')) return;
function check(intro) {
const m1 = intro.match(/^(.)(.)字的\1$/);
if (
m1 &&
m1[1] === m1[2] &&
!['文字', '写字', '名字', '签字', '数字'].includes(m1[2] + '字')
)
remaining++;
const m2 = intro.match(/^(.)\1的\1$/);
if (m2) remaining++;
}
if (typeof val[0] === 'string') check(val[2]);
else val.forEach((r) => check(r[2]));
});
console.log(`剩余问题: ${remaining}`);