php算法-集思广益,有个几百万关键字的文本匹配的算法,大家进来看看

问题描述

集思广益,有个几百万关键字的文本匹配的算法,大家进来看看
关键字 都是放在一个数组中的,譬如$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;                }        }

解决方案

类似这种处理不建议正则,大量使用正则会消耗很高的CPU。
优化方法:
建议使用状态机的方式实现。其实你的需求简单理解为通过一批关键字匹配关键字然后处理后续的业务等。

我之前处理相似的业务
1. 写了一个StringToken处理类
http://blog.csdn.net/kevin_luan/article/details/26875341
2. 敏感词过滤
http://download.csdn.net/detail/kevin_luan/7322435

我使用JAVA写的,不过PHP同样可以实现相似的业务,希望对你有所启发。

时间: 2024-11-05 18:43:42

php算法-集思广益,有个几百万关键字的文本匹配的算法,大家进来看看的相关文章

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助"多关键字排序"的思想来实现"单关键字排序"的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键

有算法能够遍历无向图中所有连通顶点的组合的算法么

问题描述 有算法能够遍历无向连通图中所有子连通图的算法么 解决方案 http://topic.csdn.net/u/20080621/09/914e6abf-9d77-420e-a89b-9924f2d3fb8b.html

《Mahout算法解析与案例实战》一一1.2 Mahout算法库

1.2 Mahout算法库 Mahout自从2008年兴起以来,发展迅速,从最开始的只有推荐系统到现在的多个算法模块,涵盖了很多行业.这些模块有聚类算法.分类算法.协同过滤算法和频繁项集挖掘算法,每个模块都含有一个或者几个不同的实现算法,下面分别进行介绍.1.2.1 聚类算法 中国有句古谚语"物以类聚,人以群分".一个聚类即是一类物体的集合,集合中的个体是相似的,不同聚类中的个体是不相似的.聚类的二维图如图1-1所示. 图1-1 聚类二维图 针对上面的数据,我们可以很容易地把它们分为右

关键字的模糊匹配,数据量很大,在C#中有没有高效一点的办法,不用数据库,谢谢

问题描述 关键字的模糊匹配,数据量很大,在C#中有没有高效一点的办法,不用数据库,谢谢 关键字的模糊匹配,数据量很大,在C#中有没有高效一点的办法,不用数据库,谢谢 解决方案 分词,倒排索引,然后查询.总之要想速度快,需要多花一些存储空间. 解决方案二: C# 匹配

c++-扫除算法求逆矩阵是神马!!!!扫除算法求逆矩阵是神马?

问题描述 扫除算法求逆矩阵是神马!!!!扫除算法求逆矩阵是神马? 代码怎么写,扫除算法求逆矩阵怎么写!!!谢谢啦!!!哪位大神指导我一下!!! 解决方案 矩阵求逆的算法扫除算法(sweep)求逆矩阵矩阵求逆的快速算法---------------------- 解决方案二: lz可参考 : http://blog.csdn.net/zmazon/article/details/8241348

算法题:poj 3080 Blue Jeans(KMP匹配,枚举子串)

链接: http://poj.org/problem?id=3080 题目大意: 给出m(2<=m<=10)个DNA序列, 求出这m个序列中最长的公共字串.如果有多个相同长度的, 输出字典序最小的. 分析与总结: 依次枚举所有的子串, 然后再看是否在所有序列中都能够匹配.保存下长度最大且字典序最小的序 列. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace st

[算法系列之十二]字符串匹配之蛮力匹配

引言 字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配.一般来说我们有文本串和一个匹配串(通常匹配串短于文本串).我们需要做的就是回答这个匹配串是否出现在文本串中. 概述 字符串蛮力匹配法的原理非常简单.我们必须检查匹配串的第一个字符与文本

文本自动分割算法

1.需求 在数据清洗(ETL),日志文件分析,分隔符信息提取时,我们都会遇到如下常见的文本数据: 中楼层/14层,东西,西直门南大街 3号院,1985年建,板楼 中楼层/23层,南北,通惠南路6号,2003年建,板楼 中楼层/12层,南北,通惠南路6号 1号院,2003年建,塔楼- 一个常见的处理思路,是按照分隔符,对文本进行切割.对于上面的文本,可以采用/,两种符号来切割.变成如下的表格样式,之后进行数据处理便非常容易了. 所以我开玩笑的说,一门语言中split函数可能是用的最多的.在文本处理

字符串 匹配-一道算法问题字符串匹配的

问题描述 一道算法问题字符串匹配的 为了能有效地辅助对话系统完成限定领域完整对话流程,我们需要一个强大的匹配功能,现在要求你用编程来实现以下功能: 我们给出N个句子,作为语料库,语料库的句子分为以下三类: 1. 包含"_","_"可以匹配任意长度的字符串或者空串,例如,"早上好,店家!"能被语料库中的"_早上好_"匹配到,这类句子优先级最高. 2. 包含"*","*"可以匹配任意长度的字符串或者空串,例如,"早上好,店家!"能被语料库中的&quo