代码之家  ›  专栏  ›  技术社区  ›  methuselah

一种有效的多词词黑名单检查方法

  •  0
  • methuselah  · 技术社区  · 6 年前

    我目前正在使用Shutterstock的黑名单数据在我的应用程序中创建一个服务来处理不适当材料的审查。下面是我的基本实现。

      static checkAgainstBlacklist(blacklistTerms, term) {
        for (let i = 0; i < blacklistTerms.length; i++) {
          if (blacklistTerms[i].includes(term)) {
            return true;
          }
        }
        return false;
      }
    

    我具备以下条件:

    1. 如果黑名单术语在单词的子集中,checkAgainstBlacklist应该返回false

      const blacklistTerms = [
        'scat',
        'spic',
      ];
      
      const result = BlacklistService.checkAgainstBlacklist(blacklistTerms, 'scattered')
      
    2. 如果黑名单上的术语与word相同,则应返回true

      const blacklistTerms = [
        'scat',
        'spic',
      ];
      
      const result = BlacklistService.checkAgainstBlacklist(blacklistTerms, 'scat')
      

    但是,如果这个词有多个词,我该怎么办。 leather straight jacket . 用户可以这样写 leather-straight-jacket leather*straight*jacket . 如果黑名单上的术语不在单词的子集中,如何在不中断的情况下验证这些术语。

    1 回复  |  直到 6 年前
        1
  •  1
  •   epascarello    6 年前

    您可以使用具有世界边界的reg exp。

    "food-bar-baz".match(/\bar\b/)
    

    const blacklistTerms = [
      'foo',
      'baz',
    ].map(word => new RegExp(`\\b${word}\\b`,'i'));
    
    const checkBadWords = str => blacklistTerms.some(re => re.test(str))
    
    
    console.log(checkBadWords('This is food in a bazinga can.'))
    console.log(checkBadWords('This is foo in a bazinga can.'))
    console.log(checkBadWords('Baz is food in a bazinga can.'))

    将列表传递给方法

    const blacklistTerms = [
      'foo',
      'baz',
    ]
    
    
    function checkBadWords(blTerms, term) {
      return blTerms.some(word => 
        (new RegExp(`\\b${word}\\b`, 'i')).test(term)
      )
    }
    
      console.log(checkBadWords(blacklistTerms, 'This is food in a bazinga can.'))
      console.log(checkBadWords(blacklistTerms, 'This is foo in a bazinga can.'))
      console.log(checkBadWords(blacklistTerms, 'Baz is food in a bazinga can.'))