当前位置: 首页 > news >正文

v0.29.3 敏感词性能优化之繁简体转换 opencc4j 优化

敏感词性能调优系列

v0.29.0 敏感词性能优化提升 14 倍全过程

v0.29.1 敏感词性能优化之内部类+迭代器内部类

v0.29.2 敏感词性能优化之基本类型拆箱、装箱的进一步优化的尝试

v0.29.3 敏感词性能优化之繁简体转换 opencc4j 优化

背景

opencc4j

opencc4j 中,因为考虑到汉字的复杂性,可能存在繁简体的多个对应和一个汉字,多个 char 的场景。

所以以前的实现比较复杂

    private static char getChar(char c) {List<String> mappingList = ZhConverterUtil.toSimple(c);if(CollectionUtil.isEmpty(mappingList)) {return c;}return mappingList.get(0).charAt(0);}

这里涉及到多余的对象转换。

优化思路

在 opencc4j 中提供简化版本的繁简体实现。

package com.github.houbb.opencc4j.util;import com.github.houbb.opencc4j.model.data.DataInfo;
import com.github.houbb.opencc4j.support.collection.Char2CharMap;
import com.github.houbb.opencc4j.support.data.impl.TSCharData;import java.util.List;
import java.util.Map;/*** 中文转换简化版** @since 1.14.0* @author 老马啸西风*/
public final class ZhSlimUtil {private ZhSlimUtil(){}private static final Char2CharMap char2CharMap;static {int size = 100;TSCharData tsCharData = new TSCharData();DataInfo dataInfo = tsCharData.data();Map<String, List<String>> dataList = dataInfo.getDataMap();// 这里如果有多个,只看第一个// 如果超过2个 char,直接跳过char2CharMap = new Char2CharMap(dataList.size());for(Map.Entry<String, List<String>> entry : dataList.entrySet()) {String key = entry.getKey();List<String> valueList = entry.getValue();char[] keys = key.toCharArray();char[] values = valueList.get(0).toCharArray();if(keys.length > 1 || values.length > 1) {continue;}char2CharMap.put(keys[0], values[0]);}}/*** 简化版本* @param c 字符* @return 对应字符*/public static char toSimple(final char c) {return char2CharMap.get(c, c);}}

压测对比

10w 次,这个方法性能平均大概提高了 6 倍左右。

小结

底层依赖的库,果然还是可以自己修改最方便。

也最方便性能的拓展和优化。

开源地址

https://github.com/houbb/sensitive-word

http://www.xdnf.cn/news/1475389.html

相关文章:

  • 大语言模型提示词工程详尽实战指南
  • 记一次uniapp+nutui-uniapp搭建项目
  • 计算机网络:无线局域网加密与认证方式
  • LeetCode算法日记 - Day 33: 最长公共前缀、最长回文子串
  • Linux | i.MX6ULL Tftp 烧写和 Nfs 启动(第十九章)
  • Paimon——官网阅读:文件系统
  • 1.5、机器学习-回归算法
  • Oracle体系结构-Redo Log Buffer详解
  • Day22_【机器学习—集成学习(3)—Boosting—Adaboost算法】
  • FreeMarker快速入门指南
  • Lua 面向对象编程
  • 【MFC】对话框节点属性:Language(语言)
  • macOS下arm编译缺少stdint.h等问题
  • Python入门:从Hello World到项目创建
  • MySQL与ES索引区别
  • 【LeetCode热题100道笔记】二叉树的右视图
  • 数据结构中排序的时间、空间复杂度以及稳定性
  • 20250906-01:开始创建LangChain的第一个项目
  • 虚拟化技术
  • 文件I/O与I/O多路复用
  • 外置flash提示音打包脚本
  • 版本发布流程手册:Release分支规范与Bug分级标准全解析
  • [C++刷怪笼]:搜索二叉树--便利的查找工具
  • 【数据库相关】TxSQL新增数据库节点步骤
  • Nmap使用手册
  • 第08章 聚合函数
  • 数据结构:查找
  • Matplotlib 动态显示详解:技术深度与创新思考
  • 【3D算法技术】blender中,在曲面上如何进行贴图?
  • 少儿舞蹈小程序(9)校区信息展示