精华内容
下载资源
问答
  • 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));

    }

    }

    分享到:

    18e900b8666ce6f233d25ec02f95ee59.png

    72dd548719f0ace4d5f9bca64e1d7715.png

    2012-12-18 15:17

    浏览 504

    评论

    展开全文
  • 文本中关键字匹配算法的实现
  • 一种基于Bloomfilter的高速浮动关键词匹配算法,作者贾明志,适合学习存储时参考设计算法。
  • 本文实例讲述了php中最简单的字符串匹配算法。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下:<?php /* 最简单字符串匹配算法php实现方式   T: ababcabc P: abc   0. 1. 2. ababcabc ...
  • 分 析 电 子 邮 件 的 多 关 键 词 匹 配 算 法
  • 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语言字符串关键字的匹配算法讲解笔记 一、主函数 这段代码块定义了一个全局变量pattern作为目标关键词,其中'\0'是字符串的结束标志。charline是从getline获取到的被匹配句子,while循环条件会一直进行字符...

    作者:小成Charles
    商业工作,学习交流请添加Vx:Lcc-Triumph
    原创作品
    转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/115711676

    Github代码下载地址: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算法和改进的算法进行对比实验,改进算法在处理大规模数据时比wu_manber算法的所用时 间减少了8~15%
  • 关键词匹配的问题在防垃圾等安全项目中普遍存在,一般有一组数量较大的关键词列表,对某一输入串进行检定,以判定该串中是否含有列表中的任一关键词。在一些实时性很强的情况,如即时消息的传递中,对效率有较高的...
  • 文本中关键字匹配算法

    万次阅读 2016-06-16 09:33:38
    这个文本处理需要一个算法, 普通的文本处理直接去遍历所有的关键字,但是这种算法太复杂,时间复杂度太高。 之前的文章中有说过,实际用到的算法,为了加快执行速度,都是在时间和空间上做的兑换。这里同样可以,...
  • DFA即Deterministic Finite Automaton,翻译过来就是确定性有限自动机。简单原理就是:在一个有限的集合,其中的元素都...2. DFA关键词过滤,是精准过滤,无法实现模糊过滤,如我是*人,*匹配单个字符,%匹配多个字符。
  • 政府网站发布的文本信息,如何及时有效的推荐给相关企业,我们采用的是利用文本(项目文本)中的关键词与每个领域的概念描述(相关的关键词)进行匹配,得出结果,来判断文本与哪个领域关联性最强。 二、研究思路...
  • 而且,串匹配是这些应用中最耗时的核心问题,好的串匹配算法能显著地提高应用的效率。因此,研究并设计快速的串匹配算法具有重要的理论价值和实际意义。 串匹配问题实际上就是一种模式匹配问题,即在给定的文本串中...
  • 网络安全态势感知中Trie树关键词高速匹配算法研究.pdf
  • 同时,采用动态点阵匹配算法(DMPLS)进行错误补偿,解决了由连续语音识别器产生的插入、删除和替换错误而导致识别准确率下降的问题,提高了系统的检出率和鲁棒性。实验结果表明,该模型不仅在较低误警率的条件下检出率...
  • 当我们需要对一个列做根据几十个或者更多关键词筛选时,因为是关键词匹配,没办法直接用 in 的方式,因为在 in 里面不支持识别%通配符,所以核心还是要回到like身上; 如果我只写like: select *
  • 经典的WM算法的源代码,原先就在csdn上下载的,但是不支持中文,而且不支持文件操作。经过改进之后,可以完美的支持中英文混合的多模式匹配,而且支持从文件中读取样本数据以及模式数据,经过测试相当的快。4MB的...
  • AC算法结合双数组trie树优化关键词匹配与替换 参考文章和项目: Aho-Corasick算法的Java实现与分析 双数组Trie树(DoubleArrayTrie)Java实现 Aho Corasick自动机结合DoubleArrayTrie极速多模式匹配 github项目:...
  • 针对中文文本的自动分类问题,提出了一种逆向匹配算法。该算法的基本思路是构造一个带权值的分类主题词表,然后用词表中的关键词在待分类的文档中进行逆向匹配,并统计匹配成功的权值和,以权值和最大者作为分类结果。本...
  • 关键字过滤多模式匹配算法(支持中文),支持从文件中读取样本数据以及字典数据,文件附带中英文测试文件和中英文关键字字典可供测试,亲测效率还行
  • 关键词敏感字高效查找匹配算法

    千次阅读 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:27
    java关键字匹配 /** * 关键字匹配 * @param word * @param key * @return */ public boolean compileKeyWord(String word, String keyWord) { Pattern pn = Pattern.comp...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,625
精华内容 14,650
关键字:

关键词匹配算法