使用Trie树实现网站对用户输入的敏感词打码

news/2024/5/13 12:52:50/文章来源:https://blog.csdn.net/qq_37372007/article/details/82499986

使用Trie树实现网站对用户输入的敏感词打码

什么是Trie树?

Trie树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

Trie树的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
还在路上,稍等...
使用Trie树数据结构可以匹配多个关键词,速度快。Trie树的最坏空间复杂度为O(m^n),最坏时间复杂度为O(n)。从而可以利用该数据结构把一段文本中敏感词替换为***或者删除掉

import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
@Service
public class SensitiveService implements InitializingBean {private static final Logger logger = LoggerFactory.getLogger(SensitiveService.class);private TrieNode rootNode = new TrieNode();public static void main(String[] args) {SensitiveService s = new SensitiveService();s.addWord("色情");s.addWord("赌博");String test = "你好啊色*情家伙,竟然赌博啊,你是个坏人!";System.out.println(s.filter(test));}public String filter(String text) {StringBuilder sb = new StringBuilder();if (StringUtils.isEmpty(text)) {return text;}String replace = "***";TrieNode curNode = rootNode;int begin = 0;int position = 0;while (position < text.length()) {char c = text.charAt(position);//如果不是东亚文字,如空格,则跳过在trie树中匹配if (isSymbol(c)) {if (curNode == rootNode) {sb.append(c);++begin;}++position;continue;}curNode = curNode.getSubNode(c);/*** 如果curNode等于Null,则说明在trie树中找不到下个字符,这个词不会是敏感词* 换句话说,trie树中没有这个子节点,说明begin开头的字符串不是敏感词,* 把begin这个字符加入过滤后的字符串中,同时前缀树指针指回开头*/if (curNode == null) {sb.append(text.charAt(begin));position = begin + 1;begin = position;curNode = rootNode;} else if (curNode.isKeywordEnd()) {//发现一个敏感词sb.append(replace);position = position + 1;begin = position;curNode = rootNode;} else {++position;}}sb.append(text.substring(begin));return sb.toString();}@Overridepublic void afterPropertiesSet() throws Exception {try {InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("SensitiveWords.txt");InputStreamReader reader = new InputStreamReader(is);BufferedReader bufferedReader = new BufferedReader(reader);String lineTxt;while ((lineTxt = bufferedReader.readLine()) != null) {addWord(lineTxt.trim());}reader.close();} catch (Exception e) {logger.error("读取过滤的敏感词文件失败" + e.getMessage());}}//构建trie树,在前缀树中添加敏感词private void addWord(String lineTxt) {TrieNode curNode = rootNode;for (int i = 0; i < lineTxt.length(); ++i) {Character c = lineTxt.charAt(i);TrieNode node = curNode.getSubNode(c);if (node == null) {node = new TrieNode();curNode.addSubNode(c, node);}curNode = node;if (i == lineTxt.length() - 1) {curNode.setKeywordEnd(true);}}}private class TrieNode {private boolean end = false;//子节点private Map<Character, TrieNode> subNodes = new HashMap<>();public void addSubNode(Character key, TrieNode node) {subNodes.put(key, node);}TrieNode getSubNode(Character key) {return subNodes.get(key);}boolean isKeywordEnd() {return end;}void setKeywordEnd(boolean end) {this.end = end;}}//返回true表示不是东亚文字private boolean isSymbol(char c) {int i = (int) c;//东亚文字0x2E80-0x9FFFreturn !CharUtils.isAsciiAlphanumeric(c) && (i < 0x2E80 || i > 0x9FFF);}
}

该程序运行结果如下图:
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_751245.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从HTML到XHTML--使用Web标准建设网站 《转》

转自http://ysearchblog.cn/2006/08/htmlxhtmlweb_1.html 从HTML到XHTML--使用Web标准建设网站(一) 作者&#xff1a;张克军 用户体验部 小编按&#xff1a;最近看到搜索日志上有不少朋友对雅虎的网页设计模式感兴趣&#xff0c;我们的设计师张克军也不禁手痒&#xff0c;和大家…

Three.js_环境的搭建_搭建本地官方网站

Three.js – JavaScript 3D Library 去官网下载 Three.js引擎的包 下载 VSCode 代码编辑器 Download Visual Studio Code - Mac, Linux, Windows 安装好后导入 下载好的 three.js 的引擎包 安装本地官网 VSCode里右键"在集成终端中打开" 输入 指令 npm install …

QuickWAP 2005让WAP网站拥有更好的兼容性

QuickWAP 2005让WAP网站拥有更好的兼容性 很多利用WML或ASPWML编写的WAP程序是必须利用手机或手机模拟器去浏览的&#xff0c;即使有些站点做了适配&#xff0c;也不过是利用调转指令将用户引导到其它网页而已。另一种兼容性的方法如双模网站&#xff0c;即一套站点同时做WAP和…

简体中文化的 Slax-ChineseOptimized

上次说到安装Slax后不直接支持中文&#xff0c;也有几个Linux喜爱者&#xff02;辩驳&#xff02;了下&#xff0c;说我没有去细致的研究&#xff0c;确实&#xff0c;像我这样在MS平台上用的比较多的一下子也没有那么多时间去研究&#xff0c;所以只有先直接拿来用了 Slax-Chi…

ASP.NET MVC3书店--第十节 为网站导航与局部设计做最后的修改(转)

http://blog.sina.com.cn/s/blog_6ad539a90100rc4n.html现在我们已经完成了这个网站中的主要功能。但我们还需要为整个网站的导航&#xff0c;首页与书籍列表页面做一点最终的修改。 10.1 创建购物摘要分部视图 首先&#xff0c;我们想要在整个网站中显示用户购物车中的书籍…

11个超炫的视差滚动网站欣赏

目前这种视差滚动效果被越来越多的国内外网站所应用&#xff0c;成为网页设计的热点趋势。 通过一个很长的网页页面&#xff0c;其中利用一些令人惊叹的插图 和图形&#xff0c;并使用视差滚动&#xff08;Parallax Scrolling&#xff09;效果&#xff0c;让多层背景以不同的速…

Avast!:小型网站最易遭受的3种黑客攻击

avast是捷克研发的杀毒软件&#xff0c;从网站上找到一篇avast关于网站安全的文章&#xff0c;觉得颇有意思&#xff0c;因此想到翻译过来与大家共享。有不对之处还望大家批评指正。 一个拥有上万访问者的小型网站管理员发来一份信&#xff0c;向我描述了他的遭遇&#xff0c;我…

Photoshop 爱好者应该收藏的42个网站

Photoshop 是 Adobe 公司旗下最为出名的图像处理软件之一&#xff0c;集图像扫描、编辑修改、图像制作、广告创意&#xff0c;图像输入与输出于一体的图形图像处理软件。今天&#xff0c;本文与大家分享42个非常有用的 Photoshop 设计教程和素材资源网站&#xff0c;希望能帮助…

DNN快速入门教程3 - 如何创建DotNetNuke网站

这个入门系列已经停了很长时间了&#xff0c;没有完成的原因是我有太多的东西想写但是自己又没有一个明确的主线。经过最近blog&#xff0c;和QQ群的反馈我突然意识到&#xff0c;这个入门系列就是要帮助大家从零开始完成一个自己的DNN5网站&#xff0c;不需要太过深入&#xf…

(转)SharePoint 2010的网站主题

从SharePoint 2003开始&#xff0c;主题就作为一种自定义SharePoint外观的重要选项。SharePoint 2003和2007中的包括一系列开箱即用的主题&#xff0c;可以被网站所有者通过SharePoint UI应用到SharePoint网站。网页设计师和开发人员可以创建包含自定义图片及CSS文件的自定义主…

自己动手搞定支付宝手机Wap网站支付接口 FOR ECShop

支付宝WAP网站版本的支付接口网上整合的比较少&#xff0c;看到很多网站在卖&#xff0c;顿觉无语。 主要是得自己查看支付宝官方提供的SDK中的开发文档。 支付宝sdk下载地址&#xff1a;https://doc.open.alipay.com/doc2/detail?treeId60&articleId103564&docType1 …

优秀网页设计:25个精美的旅游网站设计示例

旅游公司和旅行社的网站通常都会搭配非常有吸引力的精美照片&#xff0c;目的是为了突出视觉吸引力&#xff0c;获取更多的潜在客户。这篇文章向大家分享的25个精美的国外旅游网站设计作品&#xff0c;你可以从这些优秀的网站作品中学习大照片在网页背景中的应用以及制作出多彩…

大型网站系统架构分析

千万级的注册用户&#xff0c;千万级的帖子&#xff0c;nTB级的附件&#xff0c;还有巨大的日访问量&#xff0c;大型网站采用什么系统架构保证性能和稳定性&#xff1f; 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理&#xff1a;负载量不大的情况下select、…

百度搜索引擎优化指南3.0_「百度SEO」百度推出的针对网站优化指南有哪些?第二篇...

一、面向搜索引擎的网站建设。搜索引擎只是网站上一个普通的访客&#xff0c;对网站的抓取方式、对网站/网页的价值判断&#xff0c;也都是从用户的角度出发的&#xff0c;任何对用户体验的改进&#xff0c;都是对搜索引擎改进。对搜索引擎的优化&#xff0c;同时也会让用户受益…

网站到底是什么?

网站到底是什么&#xff1f; 网站是由一个一个网页构成的&#xff0c;要想理解网站是什么&#xff0c;首先要理解网页是什么。 1. 什么是网页&#xff1f; 网页其实就是放在服务器上的一个文件&#xff0c;当我们浏览网页时&#xff0c;这个文件会被下载到我们本地的电脑&am…

无法访问此网站 localhost 拒绝了我们的连接请求。_PHP实战之WEB网站常见受攻击方式及解决办法...

一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种漏洞情况和防止攻击的办法跨站脚本攻击(XSS)跨站脚本攻击(XSS&#xff0c;Cross-site scripting)是最常见和基本的攻击WEB网站的方法。攻击者在网页上发布包含攻击性代码的数据。当浏览者看到此网…

PS网页设计教程XXIII——创建一个售卖iPhone 5应用程序的网站

作为编码者&#xff0c;美工基础是偏弱的。我们可以参考一些成熟的网页PS教程&#xff0c;提高自身的设计能力。套用一句话&#xff0c;“熟读唐诗三百首&#xff0c;不会作诗也会吟”。 本系列的教程来源于网上的PS教程&#xff0c;都是国外的&#xff0c;全英文的。本人尝试翻…

一些视频教程网站推荐

程序员是一个艰苦的职业&#xff0c;因为作为程序员总是要取追逐和学习日新月异的各种编程语言和技术&#xff0c;而也正是因为这样才让程序员的自学能力往往强于其它从事 其它职业的人员。程序员的会从各种渠道获得学习资源&#xff0c;包括书籍、博客、论坛、社区、搜索、交流…

mixamo网站_有了这个网站,3D模型在PPT中又进化了

相信大家也对3D模型也有了一定的了解今天继续跟大家介绍PPT中的3D如何把静态3D模型赋予动作场景即使你是个狠角色也只能乖乖接着奏乐接着舞值得一提的是这个转换网站大雄宝殿社群二群的成员推荐的我看了效果之后觉得很赞但一直觉得好像在哪儿见过后来想起来是大神Simon-阿文的微…

我也要谈谈大型网站架构之系列(1)——纵观历史演变(上)

转自&#xff1a;http://www.cnblogs.com/huangxincheng/p/3682008.html 我们知道一个网站都是随着业务的发展&#xff0c;逐渐演变成几万服务器&#xff0c;几亿用户数的大型网站&#xff0c;经历了若干年&#xff0c;甚至上十年的 发展成为大型网站&#xff0c;然而真正亲身经…