You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:39:18