`
san_yun
  • 浏览: 2663324 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

通过Trie实现违禁词过滤

    博客分类:
  • nltk
 
阅读更多

敏感词过滤

生活在天朝的网站,必须要有保持和谐的工具。根据网站的规模不同选择不同的技术方案:
1.前期上一个敏感词过滤系统,发的文章只要命中敏感词就不让发。
2.后期可以通过机器学习来自动识别一篇简历是否是正常简历,一篇正常简历的特征还是很明显的,通过训练机器识别正常简历的语料,能让机器自动判断是否是违规信息。


敏感词过滤系统
比如检测用户输入的一篇文章中是否含有网安给的违禁词列表。现在正常的做法都是通过Trie 树来实现。Trie 树的基本原理基于这样一个事实:假设我从文本中查询的单词是abcd,那么在他前面的单词中,以b,c,d,f之类开头的我显然不必考虑。

以“中华人民”为例显示在Trie树中字典的存储结构:


上图中每一个节点都表示一个TrieNode,每个TrieNode有一个dict和val,root是一个打平的dict,包含违禁词中所有开头的第一个字。

比如词典在文本中保存格式是:

中华
中华书局
中华书库
中华人民
国家
国家专利
国家专利局

 那么root这个节点中dict的key包含['中','国']。

 

python的实现:

#!/usr/bin/python 
# -*- encoding: UTF-8 -*-

import codecs
import time

class TrieNode:
    
    def __init__ (self):
        self.val = 0
        self.trans = {}

class Trie (object):
    def __init__ (self):
        self.root = TrieNode()
        
    def __walk (self, trienode, ch):
        if ch in trienode.trans:
            trienode = trienode.trans[ch]
            return trienode, trienode.val
        else:
            return None, 0
    
    def add (self, word, value=1):
        curr_node = self.root
        for ch in word:
            try: 
                curr_node = curr_node.trans[ch]
            except:
                curr_node.trans[ch] = TrieNode()
                curr_node = curr_node.trans[ch]

        curr_node.val = value
     
     
    def _find_ch(self,curr_node,ch,word,start,limit):
           curr_node, val = self.__walk (curr_node, ch)
           if val:
               return val
           while curr_node is not None and start<(limit-1):
               start= start+1
               ch = word[start]
               curr_node, val = self.__walk (curr_node, ch)
               if val:
                   return val
           
    def match_all (self, word):
        ret = []
        curr_node = self.root
        index = 0
        size = len(word)
        while index<size:
            val = self._find_ch(curr_node,word[index], word, index, size)
            if val:
                ret.append(val)
            index=index+1
        return ret

class Dict (Trie):
    def __init__(self, fname):
        super (Dict, self).__init__()
        self.load(fname)

    def load(self, fname):
        file = codecs.open(fname, 'r', 'utf-8')
        for line in file:
            word = line.strip()
            self.add(word, word)
        file.close()
            
if __name__ == "__main__":
        dic = Dict("/home/yunpeng/test3/data/words-forbidden-1_.dic")

        for x in range(100):
            starttime = time.time()
            test_str = u"大庆让胡路喇嘛甸哪里有找小姐服务186-5555-2557娜娜【QQ1968454688空间选小姐】哪里有小姐服务186-5555-2557【QQ1968454688空间选小姐】哪里有小姐服务186-5555-2557娜娜【QQ1968454688空间看照片】无论朋友你常住本市。。 哪里找小姐服务娜娜【186-5555-2557娜娜】还是阁下才来我市。这些都不重要。。哪里找小姐服务186-5555-2557娜娜因为找我们在寂寞的深夜你不在感到孤单和寂寞。。"
            ret = dic.match_all(test_str)
            endtime = time.time()
            exe_time = (endtime - starttime)*1000
            print  "find forbidden %s  cost:%s" %(" ".join(ret),exe_time)  

 

  • 大小: 33.4 KB
分享到:
评论

相关推荐

    java违禁词过滤 .rar

    本项目提供的"java违禁词过滤 .rar"是一个Java实现的违禁词过滤工具,其中包含了一个名为"BannedWordUtil.java"的核心类。下面将详细介绍这个工具的工作原理和相关知识点。 1. **字符串匹配算法**: - 该工具的...

    Java 实现文章汉字关键词(违禁词)识别

    总结来说,Java实现文章汉字关键词(违禁词)识别需要结合多种数据结构和算法,如哈希表、Trie树、分词库和过滤算法。通过合理的设计和优化,我们可以构建出高效、准确的违禁词检测系统,满足内容审核的需求。

    违禁词功能匹配规则过滤处理

    本文将深入探讨“违禁词功能匹配规则过滤处理”这一主题,主要关注PHP语言实现违禁词过滤的方法。我们将围绕标题和描述中的知识点展开讨论,并结合提供的文件“Prohibited.php”和“Prohibited.txt”来解析实现过程...

    基于C++实现中文敏感词过滤,支持特殊符号,半角全角,停顿词,重复词等等,基于trie树算法实现

    【作品名称】:基于C++实现中文敏感词过滤,支持特殊符号,半角全角,停顿词,重复词等等,基于trie树算法实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、...

    Go-go-wordsfilter是一个高性能的Go敏感词过滤器

    当需要检测一段文本时,程序会遍历该树结构,快速定位并识别出其中的敏感词汇,实现高效的过滤功能。 首先,让我们深入了解Trie树。Trie树是一种字符串检索的数据结构,它通过节点之间的链接来表示前缀关系。每个...

    hat-trie, 一种有效的trie实现.zip

    hat-trie, 一种有效的trie实现 hat 这是Askitis和Sinha的hat trie数据结构的ANSI实现,它是一个非常高效的( 空间和时间) 现代变体。这里实现的版本将字节数组映射到单词( 。例如,无符号的longs ),它可以以用来存储...

    实现trie树的C/C++模板

    ### 实现Trie树的C/C++模板 在计算机科学领域,Trie树(又称前缀树或字典树)是一种用于存储具有共同前缀的字符串的高效数据结构。它广泛应用于各种场景,如自动补全、拼写检查以及IP路由表等。本文将详细介绍如何...

    Python实现Trie树

    用Python实现Trie树的应用,并可以对英汉词典进行导入和检索、添加和删除,最终可以将导入的英汉词典保存到本地磁盘。内附两个.py文件,分别是tree.py和d_gui.py,tree.py是类和方法,d_gui.py是图形界面;一个.txt...

    Go-trie-单词查找树实现Go实现

    通过压缩包子文件`trie-master`,我们可以进一步学习和研究这个Go实现的Trie数据结构,包括可能包含的测试用例、性能优化以及与其他数据结构如哈希表的比较。 总之,了解和熟练掌握Trie数据结构及其在Go中的实现,...

    java 敏感词过滤 并显示内容所包含的敏感词

    Java作为一种广泛应用的编程语言,提供了多种实现敏感词过滤的方法。本篇将详细探讨如何在Java中进行敏感词过滤,并展示如何显示内容中包含的敏感词。 首先,我们要理解敏感词过滤的核心原理。敏感词过滤通常基于...

    trie数组的算法实现

    在本文中,我们将深入探讨 Trie 数组的算法实现,特别是基于 libdatrie 库的双数组 Trie 实现。 libdatrie 是一个由泰国开发者编写的开源库,它提供了构建和操作双数组 Trie 树的功能。双数组 Trie 是 Trie 数据...

    Trie 树实现的源码

    ### Trie树实现详解 #### 一、Trie树简介 Trie树,也称为前缀树或字典树,是一种用于存储字符串数据结构。它利用字符串间的公共前缀来减少所需的存储...通过合理的设计和实现,Trie树可以大大提高字符串搜索的效率。

    用Trie树实现词频统计和单词查询

    一个简单的C语言程序:用Trie树实现词频统计和单词查询

    双数组 DoubleArray Trie树的数组实现 双数组字典

    Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现。它本质上是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态。在...

    实现Trie_java_

    Trie,又称为字典树或前缀...通过使用Trie,可以大大提高字符串操作的效率,尤其在处理大量字符串和进行前缀匹配时。在实际项目中,比如搜索引擎、文本编辑器的自动补全功能、词频统计等场景,Trie都扮演着重要的角色。

    Trie实现英文分词的相关算法

    3. **错误纠正**:通过检查单词的最长公共前缀,Trie树还可以辅助实现拼写纠错功能,提供可能的正确拼写建议。 ### 实现细节 1. **节点结构**:节点通常包含一个字符数组,用于存储可能的字符;一个子节点指针数组...

    Trie树 结构描述 实现方法 用法

    Trie树,也被称为前缀树或字典树...总结来说,Trie树是一种高效的数据结构,通过它的结构设计,能够快速地进行字符串的查找和前缀匹配。了解并掌握Trie树的原理和实现方法,对于解决涉及大量字符串处理的问题至关重要。

    KMP算法与trie搜索树实现

    Trie树通过将字符串的每个字符作为节点,逐层构建树结构,其中根节点表示空字符串,每个内部节点代表一个字符串,而叶子节点代表一个完整的关键字。这种结构使得搜索、插入和删除操作的时间复杂度可以达到O(m),其中...

    trie数的数组实现

    这是刘汝佳大大代码的完整版,数组实现,《训练指南》209页 代码可以实现,输入n表示字典中有n个单词,之后请输入n个单词(注意本代码中字符为'a'~'z')然后进行询问,输入"..."退出程序

    trie树的实现(C)

    trie.c中定义了trie树的操作函数; trie.h为相应的头文件; test.c用于测试相关的函数。 在trie.c中,关于查找定义了两个函数,一个是find(),一个是search(),二者的区别是,前者仅判断一个字符串是否在树中出现,...

Global site tag (gtag.js) - Google Analytics