删除和替换多个同义词和短语(正则表达式)

时间:2017-08-01 10:19:41

标签: javascript regex

正如标题所示,我想用特定的同义词替换所有同义词(单词和短语)以清除一些基于文本的数据。例如,如果我有以下(无效)句子:

"我的狗狗讨厌cattos,作为一只金毛猎犬,他发现猫科动物令人不安"

我想用单词cat替换所有与狗相关的单词和所有与猫相关的单词。所以句子变成了以下

我的狗讨厌猫,就像狗一样,他发现猫会感到不安..."

假设狗狗和金毛猎犬是“狗狗”。单词和catto和feline是“猫”和“猫”。话。

我希望构建某种形式的字典/键,值映射对象有点像这样:

obj = {'dog':['doggo'||'doggy'||'golden\Sretriever']}

但是我似乎无法使用分配给单个密钥的多个值。

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是迭代字典中的所有键并为该特定键创建一个正则表达式。然后,您只需将 .replace()同义词正则表达式和要替换它的键一起提供给正则表达式。

let sentence = "my doggo hates cattos, as a golden retriever he finds felines unnerving";

const synonyms = {
  "dog": ['doggo','doggy', 'golden retriever'],
  "cat": ['catto', 'feline']
};

function fileAndReplace(sentence, synonyms) {
  let newSentence = sentence;
    
  Object.keys(synonyms).forEach(key => {
      const checkSynonyms = new RegExp(synonyms[key].join('|'),'gi');
      newSentence = newSentence.replace(checkSynonyms, key);
  })
     
  return newSentence;
}

console.log(fileAndReplace(sentence, synonyms))

您甚至可以进一步使用预先计算的同义词正则表达式创建第二个数据结构,这样您就可以避免为每个句子/ text / doc计算它并将循环内的计算减少到查找和搜索。

这可能会提高性能。但话又说明这可能与问题范围有关。

答案 1 :(得分:0)

使用RegExp并加入

var dogs = {'dog':['doggo','doggy','golden retriever']};
var sentence = "my doggo hates cattos, as a golden retriever he finds felines unnerving";
sentence.replace(new RegExp(dogs.dog.join("|"), "gmi"), "dog");
// "my dog hates cattos, as a dog he finds felines unnerving"