JS自然语言解析程序如何实现多运算符顺序切换运算
实现自然语言多步数学运算顺序执行方案
现有代码问题
你当前的代码无法支持多运算符场景,核心问题有两个:
Array.shift()方法不接收任何回调参数,你写的运算符匹配逻辑完全无效,永远只会取分词后的第一个元素作为唯一运算符- 整体逻辑只适配单运算符场景:一次性提取句子中所有数字做单次归约计算,没有拆分多步运算、传递中间计算结果的能力
实现逻辑
不需要实现复杂的语法解析器,按从左到右的自然语言语序执行运算,按以下步骤处理即可:
- 先过滤掉句子中无意义的连接填充词(比如
and/together/then/the/result/by这类不参与运算的语义连接词),得到仅包含运算符、数字的有效token列表 - 遍历有效token列表,维护两个状态:当前累计计算结果、当前生效的运算符
- 遍历到运算符时,更新当前生效的运算规则;遍历到数字时,如果是第一个数字就直接作为初始累计值,否则用当前运算符对累计值和当前数字做计算,更新累计值
- 遍历完成后返回的累计值就是最终结果
修改后可直接运行的代码
source.js
// 语义填充词,解析时直接跳过 const FILLER_WORDS = new Set(['and', 'together', 'then', 'the', 'result', 'by']) // 运算符与计算逻辑映射 const OP_HANDLER = { add: (a, b) => a + b, subtract: (a, b) => a - b, multiply: (a, b) => a * b, divide: (a, b) => a / b } function output(res) { console.log(res) } function interpret(input) { const tokens = input.split(' ').filter(token => !FILLER_WORDS.has(token.toLowerCase())) let accumulated = null let currentOp = null for (const token of tokens) { // 匹配到运算符,更新当前运算规则 if (OP_HANDLER[token]) { currentOp = token continue } // 处理数字 const num = Number(token) if (!Number.isNaN(num)) { if (accumulated === null) { accumulated = num } else { accumulated = OP_HANDLER[currentOp](accumulated, num) } } } return accumulated } module.exports = {interpret, output}
扩展说明
- 针对你给出的测试用例
"add 4 and 4 together then multiply the result by 4",上述代码会按顺序计算(4 + 4) * 4 = 32,完全符合先算加法再用结果做乘法的顺序执行要求 - 如果你需要适配其他语义场景(比如你提到的输出64的特定表述、运算优先级、括号语义),只需要在现有分词、状态遍历的框架上补充对应规则即可,不需要重构核心逻辑
- 后续如果需要支持标准数学优先级运算,只需要在拿到有效token列表后,用调度场算法转后缀表达式计算即可
内容的提问来源于stack exchange,提问作者1BL1ZZARD
相关产品推荐
相关产品推荐

