需求分析

文章审核功能已经交付了,文章也能正常发布审核。突然,产品经理过来说要开会。

会议的内容核心有以下内容:

  • 文章审核不能过滤一些敏感词:
    私人侦探、针孔摄象、信用卡提现、广告代理、代开发票、刻章办、出售答案、小额贷款…

需要完成的功能:

需要自己维护一套敏感词,在文章审核的时候,需要验证文章是否包含这些敏感词

7.2)敏感词-过滤

技术选型

方案 说明
数据库模糊查询 效率太低
String.indexOf(“”)查找 数据库量大的话也是比较慢
全文检索 分词再匹配
DFA算法 确定有穷自动机(一种数据结构)

7.3)DFA实现原理

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。

存储:一次性的把所有的敏感词存储到了多个map中,就是下图表示这种结构

敏感词:冰毒、大麻、大坏蛋

自管理敏感词 - 图1

检索的过程

自管理敏感词 - 图2

7.4)自管理敏感词集成到文章审核中

①:创建敏感词表,导入资料中wm_sensitive到leadnews_wemedia库中

自管理敏感词 - 图3

  1. package com.heima.model.wemedia.pojos;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import lombok.Data;
  7. import java.io.Serializable;
  8. import java.util.Date;
  9. /**
  10. * <p>
  11. * 敏感词信息表
  12. * </p>
  13. *
  14. * @author itheima
  15. */
  16. @Data
  17. @TableName("wm_sensitive")
  18. public class WmSensitive implements Serializable {
  19. private static final long serialVersionUID = 1L;
  20. /**
  21. * 主键
  22. */
  23. @TableId(value = "id", type = IdType.AUTO)
  24. private Integer id;
  25. /**
  26. * 敏感词
  27. */
  28. @TableField("sensitives")
  29. private String sensitives;
  30. /**
  31. * 创建时间
  32. */
  33. @TableField("created_time")
  34. private Date createdTime;
  35. }

②:拷贝对应的wm_sensitive的mapper到项目中

  1. package com.heima.wemedia.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.heima.model.wemedia.pojos.WmSensitive;
  4. import org.apache.ibatis.annotations.Mapper;
  5. @Mapper
  6. public interface WmSensitiveMapper extends BaseMapper<WmSensitive> {
  7. }

③:在文章审核的代码中添加自管理敏感词审核

第一:在WmNewsAutoScanServiceImpl中的autoScanWmNews方法上添加如下代码

  1. //从内容中提取纯文本内容和图片
  2. //.....省略
  3. //自管理的敏感词过滤
  4. boolean isSensitive = handleSensitiveScan((String) textAndImages.get("content"), wmNews);
  5. if(!isSensitive) return;
  6. //2.审核文本内容 阿里云接口
  7. //.....省略

新增自管理敏感词审核代码

  1. @Autowired
  2. private WmSensitiveMapper wmSensitiveMapper;
  3. /**
  4. * 自管理的敏感词审核
  5. * @param content
  6. * @param wmNews
  7. * @return
  8. */
  9. private boolean handleSensitiveScan(String content, WmNews wmNews) {
  10. boolean flag = true;
  11. //获取所有的敏感词
  12. List<WmSensitive> wmSensitives = wmSensitiveMapper.selectList(Wrappers.<WmSensitive>lambdaQuery().select(WmSensitive::getSensitives));
  13. List<String> sensitiveList = wmSensitives.stream().map(WmSensitive::getSensitives).collect(Collectors.toList());
  14. //初始化敏感词库
  15. SensitiveWordUtil.initMap(sensitiveList);
  16. //查看文章中是否包含敏感词
  17. Map<String, Integer> map = SensitiveWordUtil.matchWords(content);
  18. if(map.size() >0){
  19. updateWmNews(wmNews,(short) 2,"当前文章中存在违规内容"+map);
  20. flag = false;
  21. }
  22. return flag;
  23. }