如何高效实现支持大规模词汇的英语形容词转名词Node.js模块
英语形容词转名词Node.js模块实现方案
最优实现方式
目前比纯硬编码全量元组更高效的方案是通用规则匹配+特殊例外映射的组合架构:
- 90%以上的英语形容词转名词都符合通用后缀规则,只需用正则匹配完成替换即可,无需单独存储每个词的映射关系,内存占用极低
- 仅将不符合通用规则的特殊转换存入映射表,数据维护成本远低于全量硬编码
通用转换规则参考(按匹配优先级排序)
- 以
-ble结尾的词,替换后缀为-bility,例:possible→possibility - 以
-y结尾的词,替换后缀为-iness,例:happy→happiness - 以
-ous结尾的词,替换后缀为-ousness,例:voracious→voraciousness - 以
-al/-ar/-ic结尾的词,后缀加-ity,例:universal→universality - 以
-ful结尾的词,替换后缀为-fulness,例:helpful→helpfulness - 以
-less结尾的词,替换后缀为-lessness,例:useless→uselessness - 以
-ant结尾的词,替换后缀为-ance,例:important→importance - 以
-ent结尾的词,替换后缀为-ence,例:different→difference - 无匹配规则的词默认返回原词,覆盖同形形容词/名词的场景,例:
order→order
示例代码实现
// 特殊例外映射表,仅存储不符合通用规则的转换 const exceptionMap = new Map([ ['good', 'goodness'], ['bad', 'badness'], ['warm', 'warmth'], ['true', 'truth'], ['dead', 'death'] ]); // 按优先级排序的转换规则 const conversionRules = [ [/ble$/, 'bility'], [/y$/, 'iness'], [/ous$/, 'ousness'], [/(al|ar|ic)$/, '$1ity'], [/ful$/, 'fulness'], [/less$/, 'lessness'], [/ant$/, 'ance'], [/ent$/, 'ence'] ]; function getNounConversionOf(adjective) { // 优先匹配例外 if (exceptionMap.has(adjective)) { return exceptionMap.get(adjective); } // 匹配通用规则 for (const [pattern, replacement] of conversionRules) { if (pattern.test(adjective)) { return adjective.replace(pattern, replacement); } } // 无匹配返回原词 return adjective; } // 效果测试 console.log(getNounConversionOf('universal')); // 输出:universality console.log(getNounConversionOf('order')); // 输出:order console.log(getNounConversionOf('voracious')); // 输出:voraciousness
全量转换数据获取
如果需要补全所有特殊例外的映射关系,可以使用公开的英语词法数据集WordNet,其中包含了完整的形容词到名词的派生关系,可直接批量提取生成所需的映射元组,数据权威度高。
内容的提问来源于stack exchange,提问作者james_womack
相关产品推荐
相关产品推荐

