集思广益,有个几百万关键字的数组的文本匹配的算法

关键字
都是放在一个数组中的,譬如$keyword_arr=["key1","key2","example",......],大约有几百万甚至上千万的关键字,这些关键字已经按照优先级从前到后排列了,越靠前的关键字优先匹配,匹配的最多次数是$max次;目前采用for循环$keyword_arr数组,然后将关键字组装成‘/\\b(?:‘.$value.‘)\\b/i‘;正则来匹配文本内容$text;如果已经匹配了$max次了,就停止匹配。

这个算法肯定是最低效的,大家有好的建议可以提出来,主要问题是关键字优先级有点麻烦

php: 目前采用正则匹配:

foreach
($keyword_arr as $key=>$value) {
      
         $pattern =
‘/\\b(?:‘.$value.‘)\\b/i‘;
          
     preg_match($pattern, $text, $match,
PREG_OFFSET_CAPTURE);
          
     if ($match && trim($match[0][0]) != ‘‘
&& !in_array(strtolower($match[0][0]), $match_keyword_arr))
{
              
     $match_keyword_arr[] =
strtolower($match[0][0]);
          
         $count ++;
  
               
 if ($count >= $max) {
      
               
 break;
          
         }
      
     }

集思广益,有个几百万关键字的数组的文本匹配的算法,布布扣,bubuko.com

时间: 2024-08-06 19:42:23

集思广益,有个几百万关键字的数组的文本匹配的算法的相关文章

使用new关键字创建对象数组(C#,C++,Java)

今天遇到一个题目 分析下面的代码,判断代码是否有误. 1 using System; 2 3 namespace Test1 4 { 5 class Point 6 { 7 public int x; 8 public int y; 9 } 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 Point[] pointArr = new Point[3]; 15 pointArr[0].x = 5; 16 pointA

第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)

/** * 最大子数组的暴力求解算法,复杂度为o(n2) * @param n * @return */ static MaxSubarray findMaxSubarraySlower(int[] n) { long tempSum = 0; int left = 0; int right = 0; long sum = Long.MIN_VALUE; for (int i = 0; i < n.length; i++) { for (int j = i; j < n.length; j++

有序数组去重的几种算法

最差的算法: 最差的算法: 去重,与数组是否有序无关 public void noDups(){ //从0开始遍历 for(int i=0; i<nElems-1; i++){ //与后面每一个比较 for(j=i+1; j<nElems; j++){ //如果相等,后面的所有的项向前移动,总数-1 if(a[i]==a[j]){ for(k=j+1; k<nElems; k++){ a[j] = a[j+1]; nElems--; } } } } } 把后面不同的往前 public v

结合双数组Trie的AC自动机算法

结合双数组Trie的AC自动机算法是一种相对比较快的词匹配算法,常见于分词系统用于分词,本文准备用伪代码结合实例的形式来讲解一下该匹配算法的实现原理 构建步骤: 1.Trie树的构建 首先直观感受一下Trie树: 插入模式串 ball.bat.doll.dork.dorm.do.send.sense之后形成的trie树 trie树分三步:插入(构建).查找.删除 插入: 1.输入一个模式串 String 2.如果该模式串已经存在于树中,则跳转 8.如果不存在,跳转3 3.设置当前节点为根节点 4

JAVA笔记4__static关键字/对象数组/foreach/方法的可变参数

/** * static关键字:修饰属性(实质就是全局变量).方法(无需本类的对象即可调用此方法).类. * 1.static方法只能调用static方法 * 2.static方法只能访问static数据 * 3.static方法不能以任何方式引用this或super */ public class Main { public static void main(String[] args) { A a = new A(); a.val = 2; A a1 = new A(); a1.val =

const关键字与数组、指针

目录 const关键字 const修饰数组 const修饰指针 用两个const修饰指针 @ 开始回顾C基础知识.C中使用指针是很危险的事情,一个不慎就会造成程序崩溃,因此对于传入函数的参数进行保护就是必须的了,特别是针对数组. const关键字 const关键字用于将一个变量声明为只读,也就是常量,无法被修改. const int constant = 10;//声明constant为常量的同时对它进行初始化赋值 int const constant = 10;//也可以将const放在int

第二章 Vue快速入门-- 23 品牌案例-根据关键字实现数组的过滤

1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width,initial-scale=1.0"> 7 <title>Document</title> 8

final关键字及数组初识

final关键字的作用: 数组使用 package shu; public class Shuzu { public static void main(String args[]) { int[] a; int i; String b[]=new String[15]; a=new int[10]; for(i=0;i<a.length;i++) { a[i]=2*i; System.out.println(a[i]); } User arr1[]=new User[3]; //存放的是引用类型

数组拷贝、数组函数、通过数组函数来模拟数据结构的栈和队列、回调的意义、数组函数的排序问题、算法以及寻找素数的筛选法

1.数组的拷贝数组拷贝时指针的指向问题. 数组在拷贝时,指针的位置随之复制[这一点拷贝是完全一样]但是如果拷贝的数组的指针是非法的,那么拷贝出新指针的位置进行初始化<?php$arr1=array('123');end($arr1);next($arr1);//这个指针非法$arr2 = $arr1;//这里进行数组的拷贝var_dump(current($arr2));//得到指向‘123’元素的指针var_dump(current($arr1));//此时这个数组的指针有问题?> 但是拷贝