【问题标题】:Use Regex string to find 2 or more word by group or other means使用正则表达式字符串按组或其他方式查找 2 个或更多单词
【发布时间】:2021-07-07 09:18:03
【问题描述】:

从问题库中查找可以优化搜索结果的正则表达式字符串。 例子: 问题:如何与朋友开始对话?

使用 -> 正则表达式字符串

题库-

  1. 与朋友开始对话
  2. 与我的朋友建立对话
  3. 开始与我的朋友对话
  4. 开始游戏
  5. 对话从说你好,人名开始

回答 - 1, 2, 3. - 是答案 4,5 - 不相关

目前,我使用 WordNet 来获取名词和动词,然后查询以找到结果。 是否可以搜索找到至少 2 个单词的问题? 当前正则表达式:/(?=.*\bstart\b)(?=.*\bconversation\b)(?=.*\bfriend\b).*/gi 仅在找到所有单词时返回。

【问题讨论】:

  • 你能准备一个简单的代码示例吗?我的意思是,你有这个列表在一个数组等中。
  • Regex: /(?=.*\bstart\b)(?=.*\bconversation\b)(?=.*\bfriend\b).*/gi ------------ 答: 1. 我应该如何开始关于朋友的对话 2. 我应该如何开始关于朋友的对话 --- ------ 来自列表: 1. 我应该如何开始关于朋友的对话 2. 我应该如何开始关于朋友的对话 3. 当谈到朋友时我应该告诉我的孩子什么 4. 女孩会阅读别人的对话? 5. asdakjsnjkd asnjkansk kans 6. 你知道我的朋友吗

标签: javascript node.js regex wordnet


【解决方案1】:

使用简单的indexOf 会更容易。我认为它也会更快。

const words = [...];
let matchedWord = 0;
for(let word of words){
  if(questionSentence.indexOf(word) > -1) matchedWord+=1
  if(matchedWord > 1) {
    return questionSentence;
  }
}

之所以会出现复杂性,是因为您需要知道一个词在过去是否匹配。我真的不会为此使用正则表达式。你甚至可以将它包装成这样的函数:

function matchWords(sentence, words, threshold){
    const lowercaseSentence = sentence.toLowerCase();
    let matchedWord = 0;
    for(let word of words){
      if(lowercaseSentence.indexOf(word.toLowerCase()) > -1) {
          matchedWord+=1
      }
      if(matchedWord >= threshold) {
        return true;
      }
    }
    return false;
}

【讨论】:

  • 甜蜜的第二个代码就像魔术一样工作。但问题是我需要一个正则表达式代码才能从 Mongo DB 中搜索。
【解决方案2】:

花了一些时间,但我找到了一个答案。 正则表达式字符串从句子列表中搜索单词列表: 请注意,需要 N 个阈值(意味着生成的句子中应包含 N 个或更多单词。)

正则表达式字符串: //对于 N = 2 /(word1|word2|word3|)([ -z]*)?(word1|word2|word3)/gi

//对于 N = 3 /(word1|word2|word3|)([ -z]*)?(word1|word2|word3)([ -z]*)(word1|word2|word3)/gi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多