You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何生成含同义词替换的所有句子排列?

解决同义词替换全排列的简便方法

嘿,我完全懂你现在的困扰——想生成所有同义词替换后的句子排列,却总是漏一些情况,还不想啃复杂的动态规划对吧?其实咱们可以用递归+笛卡尔积的思路来实现,比动态规划直观太多,代码也容易写!

核心思路拆解

我把整个过程分成3个简单的步骤,一步步来就不会乱:

1. 先做一个同义词映射表

首先把你的二维同义词数组转成一个键值对映射,让每个词都能直接查到它所在的整个同义词组(包括它自己)。这样句子里不管遇到哪个词,都能立刻拿到所有可替换的选项。

比如你的同义词数组是[["happy", "glad"], ["sad", "blue"]],映射表会变成这样:

{
  "happy": ["happy", "glad"],
  "glad": ["happy", "glad"],
  "sad": ["sad", "blue"],
  "blue": ["sad", "blue"]
}

2. 把句子拆成「可选单词列表」

把输入句子按空格拆成单词数组,然后给每个单词匹配对应的同义词列表——如果某个词没有同义词,就只保留它自己作为唯一选项。这样我们会得到一个二维数组,每个子数组对应原句中位置的所有可选词。

举个例子,原句是"I am happy and sad",处理后会变成:

[
  ["I"],
  ["am"],
  ["happy", "glad"],
  ["and"],
  ["sad", "blue"]
]

3. 计算笛卡尔积得到所有组合

最后一步就是计算这个二维数组的笛卡尔积——简单说就是把每个位置的选项和其他位置的所有选项做组合,这样就能得到所有可能的替换排列了。最后把每个组合的单词拼接成句子字符串就行。

完整代码实现(JavaScript)

function generateSynonymSentences(synonyms, sentence) {
  // 构建同义词映射表
  const synonymMap = {};
  for (const group of synonyms) {
    // 给组里的每个词都绑定整个同义词组
    for (const word of group) {
      synonymMap[word] = [...group];
    }
  }

  // 生成每个单词的可选替换列表
  const wordOptions = sentence.split(' ').map(word => {
    // 没有同义词就返回原词本身的数组
    return synonymMap[word] || [word];
  });

  // 实现笛卡尔积:把多个数组的所有组合列出来
  function cartesianProduct(arrays) {
    return arrays.reduce((accumulator, currentArray) => {
      // 把之前的所有组合和当前数组的每个元素配对
      return accumulator.flatMap(prevCombination => 
        currentArray.map(word => [...prevCombination, word])
      );
    }, [[]]); // 初始值是一个空数组的数组,用来启动配对
  }

  // 把每个组合转换成完整句子
  return cartesianProduct(wordOptions).map(wordCombination => wordCombination.join(' '));
}

// 示例测试
const testSynonyms = [["happy", "glad"], ["sad", "blue"], ["big", "large"]];
const testSentence = "The big happy dog is sad";
console.log(generateSynonymSentences(testSynonyms, testSentence));

为什么这个方法好用?

这个思路完全不需要复杂的动态规划状态转移,核心就是「把每个位置的选项列出来,然后做全组合」,逻辑非常直观,调试起来也容易。而且不管你的同义词组有多少个,句子有多长,只要笛卡尔积的计算逻辑没问题,就能覆盖所有可能的排列,不会漏情况。

要是你还遇到什么细节问题,比如同义词组有重复词、句子里有标点之类的,咱们再调整就行~

内容的提问来源于stack exchange,提问作者Namanyay Goel

火山引擎 最新活动