-
2020-12-10 06:22:39
本文实例讲述了python通过BF算法实现关键词匹配的方法。分享给大家供大家参考。具体实现方法如下:
#!/usr/bin/python
# -*- coding: UTF-8
# filename BF
import time
"""
t="this is a big apple,this is a big apple,this is a big apple,this is a big apple."
p="apple"
"""
t="为什么叫向量空间模型呢?其实我们可以把每个词给看成一个维度,而词的频率看成其值(有向),即向量,这样每篇文章的词及其频率就构成了一个i维空间图,两个文档的相似度就是两个空间图的接近度。假设文章只有两维的话,那么空间图就可以画在一个平面直角坐标系当中,读者可以假想两篇只有两个词的文章画图进行理解。"
p="读者"
i=0
count=0
start=time.time()
while (i <=len(t)-len(p)):
j=0
while (t[i]==p[j]):
i=i+1
j=j+1
if j==len(p):
break
elif (j==len(p)-1):
count=count+1
else:
i=i+1
j=0
print count
print time.time()-start
算法思想:目标串t与模式串p逐词比较,若对应位匹配,则进行下一位比较;若不相同,p右移1位,从p的第1位重新开始比较。
算法特点:整体移动方向:可认为在固定的情况下,p从左向右滑动;匹配比较时,从p的最左边位开始向右逐位与t串中对应位比较。p的滑动距离为1,这导致BF算法匹配效率低(相比其他算法,如:BM,KMP,滑动没有跳跃)。
该算法的时间复杂度为O(len(t)*len(p)),空间复杂度为O(len(t)+len(p))
更多相关内容 -
简单关键词匹配算法
2021-02-25 19:34:39针对微博的短篇博文,编写的简单分词和匹配算法。相对于一篇文档的复杂分词算法,能够在效率和可用性上得到较好的平衡。package com.sina.tblog.sentiment;import java.io.BufferedReader;import java.io.File;...针对微博的短篇博文,编写的简单分词和匹配算法。相对于一篇文档的复杂分词算法,能够在效率和可用性上得到较好的平衡。
package com.sina.tblog.sentiment;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Pattern;
import com.sina.tblog.sentiment.constant.Constant;
public class KeyWordFilter {
public static HashSet KeyWordsList = null;
public static HashSet letterKeyWordsList = null;
/**
* 初始化或重新导入关键词列表
* @throws IOException
*/
static{
try {
initKeyWords(Constant.KeyWordsFiles);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static int deleteNewWord(String word){
if(word.length()>10||word.length()<2)
return -1;
if(!KeyWordsList.contains(word))
return 0;
KeyWordsList.remove(word);
if(Pattern.compile("(?i)[a-z][A-Z]").matcher(word).find())
letterKeyWordsList.remove(word.toUpperCase());
FileOutputStream stream;
OutputStreamWriter writer;
try {
stream = new FileOutputStream(Constant.newWordsFile,true);
writer = new OutputStreamWriter(stream);
writer.write("\n"+word);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1;
}
return 1;
}
public static int addWord(String word){
if(word.length()>10)
return -1;
if(KeyWordsList.contains(word))
return 0;
KeyWordsList.add(word);
if(Pattern.compile("(?i)[a-z][A-Z]").matcher(word).find())
letterKeyWordsList.add(word.toUpperCase());
FileOutputStream stream;
OutputStreamWriter writer;
try {
stream = new FileOutputStream(Constant.newWordsFile,true);
writer = new OutputStreamWriter(stream);
writer.write("\n"+word);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1;
}
return 1;
}
private static void initKeyWords(String Files[]) throws IOException {
if(KeyWordsList!=null)
KeyWordsList.clear();
else
KeyWordsList = new HashSet();
if(letterKeyWordsList!=null)
letterKeyWordsList.clear();
else
letterKeyWordsList = new HashSet();
for(int i=0;i
File file = new File(Files[i]);
BufferedReader reader = null;
reader = new BufferedReader(new FileReader(file));
String tmp = reader.readLine();
while(tmp!=null){
KeyWordsList.add(tmp);
if(Pattern.compile("(?i)[a-z][A-Z]").matcher(tmp).find())
letterKeyWordsList.add(tmp.toUpperCase());
tmp = reader.readLine();
}
reader.close();
}
}
private static boolean findWord(String str,boolean ignoreCase){
if(ignoreCase == false)
return KeyWordsList.contains(str);
else{
boolean match = KeyWordsList.contains(str);
if(match == false){
match = letterKeyWordsList.contains(str.toUpperCase());
}
return match;
}
}
public static List segmentStrQuickMatch( String str_line,boolean ignoreCase)
{
String term = "";
boolean term_tag = false;
int str_size=0,left=0,len=0;
List list = new ArrayList();
str_size = str_line.length();
while(left
{
len = Constant.max_len;
while( len>=Constant.min_len )//gkm:每一词
{
term="";
int right = left+len;
int x = 0;
if(right>str_size){
x = right-str_size;
right = str_size;
}
term=str_line.substring(left,right);
term_tag=findWord(term,ignoreCase);
if(term_tag==true)
break;
if(x>0)
len-=x+1;
else
len-=1;
}
if(term_tag==false)//gkm:词典中没有term,后移一个字符(以一个字符的速度后移,使得可以分出中英混合的词,没有判断无效字符,有待改进!!! )
{
left+=1;
}
else//gkm:词典中有term,后移len个字符,term加入到terms_vct[term_tag]
{
left+=len;
list.add(term);
}
}//while(left
return list;
}
public static List segmentStrFullMatch( String str_line,boolean ignoreCase)
{
String term = "";
boolean term_tag = false;
int str_size=0,left=0,len=0;
List list = new ArrayList();
str_size = str_line.length();
while(left
{
len = Constant.max_len;
while( len>=Constant.min_len )//gkm:每一词
{
term="";
int right = left+len;
int x = 0;
if(right>str_size){
x = right-str_size;
right = str_size;
}
term=str_line.substring(left,right);
term_tag=findWord(term,ignoreCase);
if(term_tag==true)
list.add(term);
if(x>0)
len-=x+1;
else
len-=1;
}
left+=1;
}//while(left
return list;
}
public static void main(String[] args) throws IOException {
System.out.println(segmentStrFullMatch("中华人民共和国",true));
}
}
分享到:
2012-12-18 15:17
浏览 504
评论
-
文本中关键字匹配算法的实现
2016-06-16 09:28:28文本中关键字匹配算法的实现 -
一种基于Bloomfilter的高速浮动关键词匹配算法
2013-06-26 23:50:03一种基于Bloomfilter的高速浮动关键词匹配算法,作者贾明志,适合学习存储时参考设计算法。 -
php中最简单的字符串匹配算法
2020-12-18 05:49:44本文实例讲述了php中最简单的字符串匹配算法。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下:<?php /* 最简单字符串匹配算法php实现方式 T: ababcabc P: abc 0. 1. 2. ababcabc ... -
分析电子邮件的多关键词匹配算法
2009-03-25 22:49:14分 析 电 子 邮 件 的 多 关 键 词 匹 配 算 法 -
DFA 算法实现关键词匹配
2015-06-12 11:23:08起因: 从网页中爬去的页面,需要判断是否跟预设的关键词匹配(是否包含预设的关键词),并返回所有匹配到的关键词 。 目前pypi 上两个实现ahocorasick https://pypi.python.org/pypi/ahocorasick/0.9 esmre ...起因: 从网页中爬去的页面,需要判断是否跟预设的关键词匹配(是否包含预设的关键词),并返回所有匹配到的关键词 。
目前pypi 上两个实现ahocorasick
https://pypi.python.org/pypi/ahocorasick/0.9
esmre
https://pypi.python.org/pypi/esmre/0.3.1但是其实包都是基于DFA 实现的
这里提供源码如下:#!/usr/bin/python2.6 # -*- coding: utf-8 -*- import time class Node(object): def __init__(self): self.children = None # 标记匹配到了关键词 self.flag = False # The encode of word is UTF-8 def add_word(root,word): if len(word) <= 0: return node = root for i in range(len(word)): if node.children == None: node.children = {} node.children[word[i]] = Node() elif word[i] not in node.children: node.children[word[i]] = Node() node = node.children[word[i]] node.flag = True def init(word_list): root = Node() for line in word_list: add_word(root,line) return root # The encode of word is UTF-8 # The encode of message is UTF-8 def key_contain(message, root): res = set() for i in range(len(message)): p = root j = i while (j<len(message) and p.children!=None and message[j] in p.children): if p.flag == True: res.add(message[i:j]) p = p.children[message[j]] j = j + 1 if p.children==None: res.add(message[i:j]) #print '---word---',message[i:j] return res def dfa(): print '----------------dfa-----------' word_list = ['hello', '民警', '朋友','女儿','派出所', '派出所民警'] root = init(word_list) message = '四处乱咬乱吠,吓得家中11岁的女儿躲在屋里不敢出来,直到辖区派出所民警赶到后,才将孩子从屋中救出。最后在征得主人同意后,民警和村民合力将这只发疯的狗打死' x = key_contain(message, root) for item in x: print item if __name__ == '__main__': dfa()
请再阅读我的这篇文章
http://blog.csdn.net/woshiaotian/article/details/10047675 -
【c语言笔记】字符串关键字匹配算法
2021-04-14 22:40:24下面是C语言字符串关键字的匹配算法讲解笔记 一、主函数 这段代码块定义了一个全局变量pattern作为目标关键词,其中'\0'是字符串的结束标志。charline是从getline获取到的被匹配句子,while循环条件会一直进行字符...作者:小成Charles
商业工作,学习交流请添加Vx:Lcc-Triumph
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/115711676Github代码下载地址:https://github.com/xiaocheng99/c_project
引言
这是一个学习C语言的笔记开篇,做一些简单有趣的c小程序。下面是C语言字符串关键字的匹配算法讲解笔记
一、主函数
这段代码块定义了一个全局变量
pattern
作为目标关键词,其中'\0'
是字符串的结束标志。charline
是从getline
获取到的被匹配句子,while
循环条件会一直进行字符串的输入,直到出现一个完整的句子就会执行strIndex
函数来判断当前句子是否包含关键字,下面来讲解函数getLine
和函数strIndex
#include <stdio.h> #define MAXLINE 1000 char pattern[] = "charles\0"; int main() { char charLine[MAXLINE]; int found = 0; while (getLine(charLine, MAXLINE)>0) { //printf("keypress:%s", charLine); if (strIndex(charLine,pattern)>=0) { printf("\"loud\" postion:%s", charLine); found++; } } return found; }
二、getLine函数
这里其实是进行字符串的输入,当输入为换行时,缓冲区会判断到为换行符
'\n'
,这时候我们就判定为当前为一个句子,跳出循环,返回一个i,此时的i是大于零的,在主函数里面就是一个真值,如果当前为EOF(End Of File)
,即为结束(windows下按Ctrl+Z再回车),此时不返回值,在主函数里面就是假,不执行接下来的程序。int getLine(char line[],int max) { int c, i; i = 0; while (--max > 0 && (c=getchar())!=EOF && c!= '\n') { line[i++] = c; } if (c=='\n') { line[i++] = c; line[i] = '\0'; return i; } }
三、strIndex函数
这里是实现字符串匹配的主要算法逻辑,第一个
for
循环首先对字符串进行遍历,并且第二个for
循环一直在对字符串与关键词的第一个字符进行比较,如果发现字符串的某一个字符和关键词的第一个字符相等,那么第二个for
循环就会执行,去依次判断字符串后面几个和关键词的字符是否相同,由于关键词有一个‘\0’
结束符,当完全匹配的时候,关键词字符串数组下标将会累加到结束符的下标,所以当关键词下标指向的字符为'\0'
时,则找到所匹配的字符串,并且返回一个大于零的下标。主函数收到后,打印当前句子。int strIndex(char source[],char serachfor[]) { int i, j, k; for (i = 0; source[i] != '\0'; i++) { for (j = i, k = 0; serachfor[k] != '\0'&&source[j] == serachfor[k];j++,k++); if (k>0&&serachfor[k]=='\0') { return i; } } return -1; }
Github代码下载地址:https://github.com/xiaocheng99/c_project
作者:小成Charles
商业工作,学习交流请添加Vx:Lcc-Triumph
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/115711676 -
NLP之常见关键词提取算法运用
2018-12-01 15:08:31# 引入TextRank关键词抽取接口 textrank = analyse.textrank #原始文本 text = "央视网消息:全球首个以进口为主题的国家级博览会——中国国际进口博览会,11月5日将在上海举办,来自130多个国家和地区的2800多... -
一种改进的wu _manber 多关键词匹配算法
2010-09-21 10:30:21提出了对算法的两点改进方法:精确的不良字符转移和弱化良好后缀转移。对原始的wu_manber算法和改进的算法进行对比实验,改进算法在处理大规模数据时比wu_manber算法的所用时 间减少了8~15% -
基本于匹配树的多关键词过滤算法
2016-01-06 10:57:36关键词匹配的问题在防垃圾等安全项目中普遍存在,一般有一组数量较大的关键词列表,对某一输入串进行检定,以判定该串中是否含有列表中的任一关键词。在一些实时性很强的情况,如即时消息的传递中,对效率有较高的... -
文本中关键字匹配算法
2016-06-16 09:33:38这个文本处理需要一个算法, 普通的文本处理直接去遍历所有的关键字,但是这种算法太复杂,时间复杂度太高。 之前的文章中有说过,实际用到的算法,为了加快执行速度,都是在时间和空间上做的兑换。这里同样可以,... -
如何实现一个高效的关键词过滤功能?——DFA算法
2021-01-31 18:34:29DFA即Deterministic Finite Automaton,翻译过来就是确定性有限自动机。简单原理就是:在一个有限的集合,其中的元素都...2. DFA关键词过滤,是精准过滤,无法实现模糊过滤,如我是*人,*匹配单个字符,%匹配多个字符。 -
基于关键词的文本领域匹配
2022-01-25 23:28:07政府网站发布的文本信息,如何及时有效的推荐给相关企业,我们采用的是利用文本(项目文本)中的关键词与每个领域的概念描述(相关的关键词)进行匹配,得出结果,来判断文本与哪个领域关联性最强。 二、研究思路... -
KMP串匹配算法,并行计算
2020-05-06 11:21:19而且,串匹配是这些应用中最耗时的核心问题,好的串匹配算法能显著地提高应用的效率。因此,研究并设计快速的串匹配算法具有重要的理论价值和实际意义。 串匹配问题实际上就是一种模式匹配问题,即在给定的文本串中... -
网络安全态势感知中Trie树关键词高速匹配算法研究.pdf
2021-09-20 00:45:13网络安全态势感知中Trie树关键词高速匹配算法研究.pdf -
基于动态点阵匹配算法的二阶关键词识别 (2012年)
2021-05-10 15:34:03同时,采用动态点阵匹配算法(DMPLS)进行错误补偿,解决了由连续语音识别器产生的插入、删除和替换错误而导致识别准确率下降的问题,提高了系统的检出率和鲁棒性。实验结果表明,该模型不仅在较低误警率的条件下检出率... -
一条SQL语句完成对一列关键词的匹配
2022-01-06 17:14:49当我们需要对一个列做根据几十个或者更多关键词筛选时,因为是关键词匹配,没办法直接用 in 的方式,因为在 in 里面不支持识别%通配符,所以核心还是要回到like身上; 如果我只写like: select * -
多模式匹配算法(支持中文多关键字匹配)
2013-01-14 20:21:18经典的WM算法的源代码,原先就在csdn上下载的,但是不支持中文,而且不支持文件操作。经过改进之后,可以完美的支持中英文混合的多模式匹配,而且支持从文件中读取样本数据以及模式数据,经过测试相当的快。4MB的... -
AC算法结合双数组trie树优化关键词匹配与替换
2021-12-25 14:55:36AC算法结合双数组trie树优化关键词匹配与替换 参考文章和项目: Aho-Corasick算法的Java实现与分析 双数组Trie树(DoubleArrayTrie)Java实现 Aho Corasick自动机结合DoubleArrayTrie极速多模式匹配 github项目:... -
一种基于逆向匹配算法的中文文本分类技术
2021-02-22 17:38:09针对中文文本的自动分类问题,提出了一种逆向匹配算法。该算法的基本思路是构造一个带权值的分类主题词表,然后用词表中的关键词在待分类的文档中进行逆向匹配,并统计匹配成功的权值和,以权值和最大者作为分类结果。本... -
关键字过滤多模式匹配算法(支持中文)
2017-11-07 15:49:30关键字过滤多模式匹配算法(支持中文),支持从文件中读取样本数据以及字典数据,文件附带中英文测试文件和中英文关键字字典可供测试,亲测效率还行 -
关键词敏感字高效查找匹配算法
2019-01-04 15:21:30本算法对纯文本匹配执行效率已改进到:5000字5毫秒(2400敏感词库) 原理:基于多叉树的查找。 import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import... -
java关键字匹配
2019-03-25 14:13:27java关键字匹配 /** * 关键字匹配 * @param word * @param key * @return */ public boolean compileKeyWord(String word, String keyWord) { Pattern pn = Pattern.comp...