feat: 汉字介绍待续

This commit is contained in:
R524809
2026-02-09 13:30:43 +08:00
parent b13ab6f9fb
commit 3569961115
10 changed files with 36260 additions and 16 deletions
@@ -0,0 +1,33 @@
const fs = require('fs');
// Read char_common_base.json (each line is a JSON object)
const basePath = '/Users/joey-xd/sites/pipi-learn/platform-pipi/apps/api/src/data/char_common_base.json';
const baseText = fs.readFileSync(basePath, 'utf8').trim();
const baseLines = baseText.split('\n').filter(l => l.trim());
const chars = baseLines.map(l => {
let cleaned = l.trim().replace(/,$/, '');
return JSON.parse(cleaned);
});
console.log(`总字数: ${chars.length}`);
const singlePinyin = chars.filter(c => c.pinyin.length === 1);
const multiPinyin = chars.filter(c => c.pinyin.length > 1);
console.log(`单音字: ${singlePinyin.length}`);
console.log(`多音字: ${multiPinyin.length}`);
// Count by number of pinyins
const byCount = {};
multiPinyin.forEach(c => {
const n = c.pinyin.length;
if (!byCount[n]) byCount[n] = [];
byCount[n].push(c);
});
Object.keys(byCount).sort().forEach(n => {
console.log(`\n=== ${n} 个读音 (${byCount[n].length} 字) ===`);
byCount[n].forEach(c => {
console.log(` ${c.char}: [${c.pinyin.join(', ')}]`);
});
});
@@ -0,0 +1,420 @@
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}`);
File diff suppressed because it is too large Load Diff