简单的敏感词提示功能

news2024/9/22 9:57:20

简单的敏感词提示功能

1. 需求

公司现在接到通知,部分接口的部分手动输入字段,需要新增敏感词报红提示,敏感词汇现在应该是7000多个左右,需要我们提供一个敏感词校验接口,如果前端输入敏感词,则前端提示出输入的非法敏感词信息,并且分词需要支持自定义字典信息。

2.具体实现

此接口的实现过程也是相对简单,主要是使用java的分词器进行前端输入字符串代码分词,然后使用分词后的结果集与数据库中的数据进行比对,如果比对成功,则证明前端页面字符输入有非法的敏感词汇,返回给前端提示即可,数据库中数据则是在服务启动的时候加载到服务内存中,以hashSet形式进行存储(因为hashSet.contains方法效率比较高)

具体的简单实现步骤如下:

  • 引入分词器pom坐标
  • 添加自定义分词字典文件
  • 初始化加载数据库数据,加载自定义分词字典
  • 编写判定接口,进行敏感字判定

自定义词典格式要求,词典格式和dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。具体词性列表如下所示:

参数类型含义解释
Ag形语素形容词性语素。形容词代码为 a,语素代码g前面置以A。
a形容词取英语形容词 adjective 的第1个字母。
ad副形词直接作状语的形容词。形容词代码 a和副词代码d并在一起。
an名形词具有名词功能的形容词。形容词代码 a和名词代码n并在一起。
b区别词取汉字“别”的声母。
c连词取英语连词 conjunction的第1个字母。
dg副语素副词性语素。副词代码为 d,语素代码g前面置以D。
d副词adverb的第2个字母,因其第1个字母已用于形容词。
e叹词取英语叹词 exclamation的第1个字母。
f方位词取汉字“方”
g语素绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。
h前接成分取英语 head的第1个字母。
i成语取英语成语 idiom的第1个字母。
j简称略语取汉字“简”的声母。
k后接成分
l习用语习用语尚未成为成语,有点“临时性”,取“临”的声母。
m数词取英语 numeral的第3个字母,n,u已有他用。
Ng名语素名词性语素。名词代码为 n,语素代码g前面置以N。
n名词取英语名词 noun的第1个字母。
nr人名名词代码 n和“人(ren)”的声母并在一起。
ns地名名词代码 n和处所词代码s并在一起。
nt机构团体“团”的声母为 t,名词代码n和t并在一起。
nz其他专名“专”的声母的第 1个字母为z,名词代码n和z并在一起。
o拟声词取英语拟声词 onomatopoeia的第1个字母。
p介词取英语介词 prepositional的第1个字母。
q量词取英语 quantity的第1个字母。
r代词取英语代词 pronoun 的第2个字母,因p已用于介词。
s处所词取英语 space 的第1个字母。
tg时语素时间词性语素。时间词代码为 t,在语素的代码g前面置以T。
t时间词取英语 time的第1个字母。
u助词取英语助词 auxiliary
vg动语素动词性语素。动词代码为 v。在语素的代码g前面置以V。
v动词取英语动词 verb的第一个字母。
vd副动词直接作状语的动词。动词和副词的代码并在一起。
vn名动词指具有名词功能的动词。动词和名词的代码并在一起。
w标点符号
x非语素字非语素字只是一个符号,字母 x通常用于代表未知数、符号。
y语气词取汉字“语”的声母。
z状态词取汉字“状”的声母的前一个字母。
un未知词不可识别词及用户自定义词组。取英文 Unkonwn首两个字母。(非北大标准,CSW分词中定义)

3. 代码部分

  • 引入pom信息

    <!-- 结巴分词 -->
    <dependency>
        <groupId>com.huaban</groupId>
        <artifactId>jieba-analysis</artifactId>
        <version>1.0.2</version>
    </dependency>
    
  • 添加自定义分词字典文件
    在resources目录下添加新的分词文件
    在这里插入图片描述

  • 初始化加载数据库数据,加载自定义分词字典

    package cn.git.init;
    
    import com.huaban.analysis.jieba.WordDictionary;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import java.io.File;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.HashSet;
    import java.util.Objects;
    import java.util.Set;
    
    /**
     * @description: 自定义分词词典加载初始化
     * @program: bank-credit-sy
     * @author: lixuchun
     * @create: 2024-08-13
     */
    @Slf4j
    @Component
    public class AnalyzerInit {
    
        /**
         * 敏感词集合
         */
        public static Set<String> sensitiveWordsSet = new HashSet<>();
    
        /**
         * 自定义词典路径
         */
        private static final String DICT_PATH = "dict/custom.dict";
    
        /**
         * 初始化加载自定义分词词典
         */
        @PostConstruct
        public void analyzerInit() {
            // 获取自定义词典信息
            String dictFilePath = Objects.requireNonNull(getClass().getClassLoader().getResource(DICT_PATH)).getPath();
            Path path = Paths.get(new File(dictFilePath).getAbsolutePath());
    
            log.info("开始加载分词词典信息,获取自定义词典路径[{}]", dictFilePath);
    
            //加载自定义的词典进词库
            WordDictionary.getInstance().loadUserDict(path);
            log.info("加载自定义词典信息完毕");
    
            // 开始加载数据库中敏感词信息,大写字母修改为小写字母,此过程正常应该是在数据库中获取
            for (int i = 0; i < 1000000; i++) {
                if (i == 0) {
                    sensitiveWordsSet.add("傻x");
                    sensitiveWordsSet.add("牛p");
                    sensitiveWordsSet.add("先烈的电话");
                } else {
                    sensitiveWordsSet.add("傻x" + i);
                    sensitiveWordsSet.add("牛p" + i);
                }
            }
            log.info("数据库中敏感分词加载完毕!");
        }
    }
    
    
  • 编写判定接口,进行敏感字判定

    package cn.git.analysis;
    
    import cn.git.init.AnalyzerInit;
    import com.alibaba.fastjson.JSONObject;
    import com.huaban.analysis.jieba.JiebaSegmenter;
    import com.huaban.analysis.jieba.SegToken;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @description: 分词测试controller
     * @program: bank-credit-sy
     * @author: lixuchun
     * @create: 2024-08-13
     */
    @RestController
    @RequestMapping("/analyzer")
    public class AnalyzerController {
    
        /**
         * 分词测试方法
         */
        @GetMapping("/test")
        public String test() {
            // 创建分词对象
            JiebaSegmenter jiebaSegmenter = new JiebaSegmenter();
    
            // 其中傻X是自定义分词,正常接收到字符串首先去除空格,然后调用分词方法
            String[] sentences = new String[] {
                    "傻X上海这是一个伸手不见五指的黑夜。我叫孙悟空咸阳6合彩,我爱北京,我爱Python和C++。h动画", "我不喜欢日本和服。", "雷猴回归人间。",
                    "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作先烈的电话,牛p啊", "结果婚的和尚未结过婚的666"
            };
    
            // 进行分词展示
            List<String> sentenceWordList = new ArrayList<>();
            for (String sentence : sentences) {
                List<SegToken> process = jiebaSegmenter.process(sentence, JiebaSegmenter.SegMode.INDEX);
                process.forEach(segToken -> {
                    if (AnalyzerInit.sensitiveWordsSet.contains(segToken.word)) {
                        sentenceWordList.add(segToken.word);
                    }
                });
            }
    
            // 输出敏感词汇
            return JSONObject.toJSONString(sentenceWordList);
        }
    }
    
    

4.测试部分

使用请求简单测试 http://localhost:8089/analyzer/test,返回敏感词信息结果如下
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Unreal Engine中使用C++创建基础角色并添加移动功能

目录 引言 步骤一&#xff1a;创建C类 步骤二&#xff1a;编写C代码 步骤三&#xff1a;设置输入绑定 步骤四&#xff1a;在UE编辑器中测试 结论 引言 Unreal Engine&#xff08;UE&#xff09;以其强大的功能和灵活性在游戏开发界广受好评。本文将指导你如何在UE中通过…

校园外卖平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;菜品信息管理&#xff0c;菜品分类管理&#xff0c;购买菜品管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&a…

揭开ChatGPT进化之谜:人工智能如何变得更聪明

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域取得了显著进展&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;方面。OpenAI的GPT系列模型&#xff0c;如GPT-3和ChatGPT&#xff0c;代表了这一领域的前沿技术。本文将围绕ChatGPT提升的原因、发展趋势…

基于JSP的个性化影片推荐系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;MyEclipse、Tomcat、MySQL 系统展示 首页 管理员功能模块 用户功能模块 …

国外评论家称《黑神话》PC版有性能问题 还有卡顿现象

《黑神话&#xff1a;悟空》即将正式发售&#xff0c;人们对这款游戏的期待值相当高。所以许多粉丝在耐心等待第一批评测报道&#xff0c;然后再购买这款游戏。在8月16日媒体评测解禁之前&#xff0c;有一位国外评论家认为《黑神话&#xff1a;悟空》是一款好游戏&#xff0c;但…

Vue的监视属性watch、computed和watch之间的区别

目录 1. 监视属性2. 监视属性的简写3. computed和watch之间的区别 1. 监视属性 监听对象: 监视属性可以监听普通属性和计算属性调用时间: 当监听的属性发生改变时。handler被调用immediate: true: 是否初始化时让handler调用一下。此时oldVlue为undefineddeep: false: watch默…

美国洛杉矶大带宽服务器的运维与监控

美国洛杉矶的大带宽服务器因其优越的地理位置、高速的网络连接以及充足的带宽资源&#xff0c;在全球范围内享有很高的声誉。为了确保这些服务器的稳定运行和高效服务&#xff0c;运维与监控工作显得尤为重要。以下是一些关于美国洛杉矶大带宽服务器运维与监控方面的科普内容。…

CentOS7 配置 nginx 和 php 方案

配置方案 一、安装软件二、编写配置文件&#xff0c;连接PHP三、引用文件四、测试 鉴于网上教程错综复杂&#xff0c;写下一这篇文章 本教程只需要三步即可 一、安装软件 yum install -y nginx php php-fpm二、编写配置文件&#xff0c;连接PHP 一般情况下在安装完 nginx 后…

css实现太极图

<template><div><!-- 太极图 --><div class"all"><div class"left box"></div><div class"right box"></div><div class"black"><div class"inner_white"><…

16.3 简单神经网络的实现

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

java或者sh脚本实现 实现 mysql 数据库定时导出并导入(适合linux和windows)

定时导出指定数据库的指定表导出到指定数据库 一、Java实现 1、contronller Slf4j Controller public class BackupController {AutowiredBackupService backupService;// 备份 // ResponseBody // PostMapping("/backup/backupByfile")Scheduled(cron&quo…

CANopen 控制多台设备的支持能力与定制方案评估

1. CANopen 支持的设备数量 CAN 总线的物理限制&#xff1a;CANopen 基于 CAN 总线协议&#xff0c;其设备数量受到 CAN 总线物理层的限制。标准 CAN 总线通常支持最多 127 个节点&#xff0c;但实际应用中&#xff0c;考虑到总线负载、波特率、线缆长度、网络拓扑等因素&#…

(Java)集合框架

1.集合的简介 集合Collection&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提供了若干个用来操作集合中…

[upload]-[GXYCTF2019]BabyUpload1-笔记

尝试上传.htaccess和图片和一句话木马提示 php文件提示 响应头可以看到 构造一句话图片木马如下&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 上传成功 必须增加文件夹下jpg后缀解析php .htaccess如下 <FilesMatch "jpg">Set…

windows关闭英语美式键盘

命令窗口 在Windows 中&#xff0c;如果你可通过批处理文件&#xff08;.bat&#xff09;关闭或移除美式键盘布局&#xff0c;可以使用以下步骤创建一个简单的批处理脚本&#xff1a; 打开windows命令窗口 执行命令 reg add "HKCU\Keyboard Layout\Toggle" /v &quo…

多模态感知:打造温室作物的全方位“健康档案“

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;现代农业的发展&#xff0c;离不开现代科技的支撑。在温室种植领域&#xff0c;由于环境复杂多变、管理要素繁多&#xff0c;传统人工经验难以应对日益精细化、智能化的生产需求。多模态感知技术的出现&#xf…

由于Offer报文引起的事件订阅失败

今天在工作中碰到一个车机上someip事件订阅的问题&#xff0c;Android端订阅了S32G发布的定位相关的someip服务(0x0001)中的某个事件&#xff08;卫星状态&#xff09;&#xff0c;然后这个事件是基于TCP通信的&#xff0c;设置了通信端口50001。 然后Android端上层应用反馈说收…

机器学习课程学习周报七

机器学习课程学习周报七 文章目录 机器学习课程学习周报七摘要Abstract一、机器学习部分1.1 Transformer模型概述1.2 Transformer编码器1.3 Transformer解码器1.3.1 自回归解码器1.3.2 非自回归解码器 1.4 编码器-解码器注意力1.5 Transformer的训练过程 总结 摘要 本周的学习…

How to debug a appliction on local Linux or WSL?

由于K8S权限控制&#xff0c;当部署在上面的应用程式出现问题后&#xff0c;无法还原用户出问题的场景。所以需要把程式部署到本地的Linux或WSL。 1.Upload application publish files to your Linux or WSL. 2.Add a Dockerfile FROM harbor.xxx.com/dotnet/aspnet:6.0 MAIN…

SQL注入之二次,加解密,DNS注入

加解密注入 在注入的时候&#xff0c;对变量做了加密操作&#xff0c;比如说?id1正常显示&#xff0c;但是代码对1进行了加密&#xff0c;这个时候想用?id1 and 11去判断&#xff0c;就得把1 and 11整体按照网站的方式加密&#xff0c;再去注入 二次注入 无法通过手动注入…