简单的敏感词提示功能

简单的敏感词提示功能

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,返回敏感词信息结果如下
在这里插入图片描述

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论敏感词屏蔽功能可以通过以下步骤实现: 1. 在 MySQL 数据库中创建一个敏感词表,用于存储所有需要屏蔽的敏感词。 2. 在 Spring Boot 中使用 MyBatis 或 JPA 等框架,将敏感词表映射为一个实体类,并创建一个 DAO 层用于操作该表。 3. 在后端编写一个过滤器,用于过滤评论中的敏感词。过滤器可以在评论提交到后端之前进行拦截,并根据敏感词表进行屏蔽。 4. 在前端使用 Vue3,通过 AJAX 请求将评论提交到后端,并接收后端返回的结果。如果评论中包含敏感词,前端可以弹出提示框进行提醒。 下面是一个简单的示例代码,仅供参考: MySQL敏感词表: ```sql CREATE TABLE `sensitive_words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` Spring Boot 实体类: ```java @Entity @Table(name = "sensitive_words") public class SensitiveWord { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "word") private String word; // getter 和 setter 方法 } ``` Spring Boot DAO 层: ```java @Repository public interface SensitiveWordDao extends JpaRepository<SensitiveWord, Integer> { List<SensitiveWord> findAll(); } ``` Spring Boot 过滤器: ```java @WebFilter(filterName = "sensitiveWordFilter", urlPatterns = "/comment/*") public class SensitiveWordFilter implements Filter { private List<String> sensitiveWords = new ArrayList<>(); @Autowired private SensitiveWordDao sensitiveWordDao; @Override public void init(FilterConfig filterConfig) throws ServletException { List<SensitiveWord> words = sensitiveWordDao.findAll(); for (SensitiveWord word : words) { sensitiveWords.add(word.getWord()); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String comment = httpRequest.getParameter("comment"); for (String word : sensitiveWords) { if (comment.contains(word)) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setStatus(400); httpResponse.getWriter().write("评论中包含敏感词"); return; } } chain.doFilter(request, response); } @Override public void destroy() { } } ``` Vue3 组件: ```vue <template> <div> <textarea v-model="comment"></textarea> <button @click="submitComment">提交</button> </div> </template> <script> import axios from 'axios'; export default { data() { return { comment: '' } }, methods: { submitComment() { axios.post('/comment', { comment: this.comment }).then(response => { alert('评论成功'); }).catch(error => { alert(error.response.data); }); } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值