1秒50万字!js实现关键词匹配

本文介绍了在大量文本中高效匹配关键词的JavaScript实现,利用哈希表和预先构建的树结构,实现对50万字文本匹配300个成语仅耗时1秒。通过对关键词的最小长度进行匹配优化,减少了不必要的比较次数,提高了性能。算法核心利用了JS对象的哈希表特性,实现了快速查找。
摘要由CSDN通过智能技术生成

在论坛和聊天室这样的场景里,为了保证用户体验,我们经常需要屏蔽很多不良词语。对于单个关键词查找,自然是indexOf、正则那样的方式效率比较高。但对于关键词较多的情况下,多次重复调用indexOf、正则的话去匹配全文的话,性能消耗非常大。由于目标字符串通常来说体积都比较大,所以必须要保证一次遍历就得到结果。根据这样的需求,很容易就想到对全文每个字符依次匹配的方式。比如对于这段文字:“Mike Jordan had said "Just do IT", so Mark has been a coder.”,假如我们的关键词是“Mike”“Mark”,那么可以遍历整句话,当找到“M”就接着看能不能匹配到“i”或者“a”,能一直匹配到最后则成功找到一个关键词,否则继续遍历。那么关键词的结构就应该是这样的:

var keywords = {
  M: {
    i: {
      k: {
        e: {end: true}
      }
    },
    a: {
      r: {
        k: {end: true}
      }
    }
  }
}

由上文可以看出这个数据就是一个树结构,而根据关键词组来创建树结构还是比较耗时的,而关键词却又是我们早已给定的,所以可以在匹配前预先创建这样的数据结构。代码如下:

function buildTree(keywords) {
  var tblCur = {},
    key, str_key, Length, j, i;
  var tblRoot = tblCur;

  for(j = keywords.length - 1; j >= 0; j -= 1) {
    str_key = keywords[j];
    Length = str_key.length;
    for(i = 0; i < Length; i += 1) {
      key = str_key.charAt(i);
      if(tblCur.hasOwnProperty(key)) {
        tblCur = tblCur[key];
      } else {
        tblCur = tblCur[key] = {};
      }
    }
    tblCur.end = true; //最后一个关键字
    tblCur = tblRoot;
  }
  return tblRoot;
}

这段代码中用了一个连等语句:tblCur = tblCur[key] = {},这里要注意的是语句的执行顺序,由于[]的运算级比=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值