rime中州韵小狼毫 敏感词脱敏滤镜

news2024/11/16 4:27:46

快速录入,是任何一个输入法,以及输入人员(无论是否专业)的追求目标之一。现实中,由于各种输入法在录入文本时,都无法完全避免重码的问题,所以在输入过程中都或多或少的需要进行选字/选词操作。这在根本上导致了在快速录入场景下,无法根本上避免错误词汇上屏;另一种错误是在快速击键的过程中,存在错误的击键,这更是无法避免的会录入错误的词汇。

当代办公室场景下,电子办公是绝对的主流,文本沟通,电子会议,都面临着大量的文本录入的需求。那么在发生录入错误时,如果上屏的词汇是 不雅 或者 不恰当 的词汇,则会面临着社死的尴尬。

👇如下,如果我们快速的输入了 koko,在 五笔・拼音 输入方案下,会有一个 咪咪 的词条出现在候选列表中,如果不慎上屏了 咪咪 并发送了聊天,则瞬间社死。
20240107164342

👇如下,那如果我们把此类词汇进行脱敏处理成 * 号,并在排序上使其靠后处理,则一方面避免了误选敏感词项,另一方面即使误选误发了,影响也完全可控。
20240107164510

rime中州韵小狼毫输入法中,我们可以通过 lua 定义 Filter 滤镜来实现以上敏感词脱敏的功能。

phraseReplace.txt

首先,我们需要有一个文档来整理/管理敏感词,以使Filter滤镜知道哪些字/词是敏感词,我们使用文档 phraseReplace.txt 来管理敏感词。phraseReplace.txt 文档的内容截取如下👇:
20240107165108
👆上图中,我们可以看到:

  • 文档 phraseReplace.txt 可以使用符号 # 来进行注释
  • 文档 phraseReplace.txt 第一列是要脱敏的敏感词
  • 文档 phraseReplace.txt 第二列是脱敏后的替代词,如果没有,则默认处理成 * 号

phraseReplaceModule.lua

有了 phraseReplace.txt 文档,我们还需要一个 lua 脚本来将 phraseReplace.txt 文档里的敏感词加载到 lua 程序中。phraseReplaceModule.lua 脚本文档中所定义的脚本就是负责加载文档 phraseReplace.txt 中的内容的。phraseReplaceModule.lua 脚本内容如下👇:

-- phraseReplaceModule.lua
-- Copyright (C) 2023 yaoyuan.dou <douyaoyuan@126.com>

local M={}
local dict={}
local dbgFlg = false

--引入系统变更处理模块
local ok, sysInfoRes = pcall(require, 'sysInfo')
local currentDir = sysInfoRes.currentDir
local userName = sysInfoRes.userName

--设置 dbg 开关
local function setDbg(flg)
	dbgFlg = flg
	sysInfoRes.setDbg(flg)
	
	print('phraseReplace dbgFlg is '..tostring(dbgFlg))
end

--将文档处理成行数组
local function files_to_lines(...)
	if dbgFlg then
		print("--->files_to_lines called here")
	end
	local tab=setmetatable({},{__index=table})
	local index=1
	for i,filename in next,{...} do
		local fn = io.open(filename)
		if fn then
			for line in fn:lines() do
				if not line or #line > 0 then
					tab:insert(line)
				end
			end
			fn:close()
		end
	end
	
	if dbgFlg then
		print("--->files_to_lines completed here")
	end
	return tab
end

local function dictload(...) -- filename)
	if dbgFlg then
		print("-->dictload called here")
	end
	
	local lines=files_to_lines(...)
	local thisDict={}
	
	for i,line in next ,lines do
		if not line:match("^%s*#") then  -- 第一字 # 为注释行
			local key,val = string.match(line,"(.+)\t(.+)")
			if nil == key then
				key = string.match(line,'(%S+)')
				val = ''
			end
			if nil ~= key then
				--此处,如果key 已经存在,则使用后来的值顶替旧的值
				thisDict[key] = val
			end
		end
	end
	
	if dbgFlg then
		print("-->dictload completed here")
	end
	return thisDict
end

--===========================test========================
local function test(printPrefix)
	if nil == printPrefix then
		printPrefix = ' '
	end
	if dbgFlg then
		print('phraseReplace test starting...')
		
		sysInfoRes.test(printPrefix..' ')
		
		for k,v in pairs(dict) do
			if dbgFlg then
				print(printPrefix..k..'\t'..v)
			end
		end
	end
end

--获取字典中的phrase
local function getShownPhrase(k)
	if nil == k then
		return ''
	elseif '' == k then
		return ''
	end
	
	--尝试获取 dictPhraseList 中 k 的列表
	return dict[k]
end

function M.init(...)
	local files={...}
	--文件名不支持中文,其中 # 开始的行为注释行
	table.insert(files,"phraseReplace.txt")
	
	for i,v in next, files do
		files[i] = currentDir().."/".. v
	end
	dict= dictload(table.unpack(files))
	
	--抛出功能函数
	M.getShownPhrase = getShownPhrase
	M.userName = userName
	M.setDbg = setDbg
	M.test = test
end

M.init()

return M

👆以上的脚本中,我们将指定的 phraseReplace.txt 文档的内容加载到一个 dict 字典中,并给出了一个 getShownPhrase 的方法来对字典 dict 进行查询。

phraseReplace_Filter.lua

phraseReplace_Filter.lua 脚本将上述 phraseReplaceModule.lua 所定义的模块封装成了 Filter 方法,以便可以在 rime 引擎中正确的被调用和运行。phraseReplace_Filter.lua 文档内的脚本如下👇:

-- phraseReplace_Filter.lua
-- Copyright (C) 2023 yaoyuan.dou <douyaoyuan@126.com>
--[[
这个过滤器的主要作用是,对于候选项中命中的选项(OR 内容),用其指定的内容来代替,如果没有指定,则使用 * 替换
由于这个过滤器会改变候选项的内容(主要是会减少候选项数量),所以请将这个过滤器放在其它过滤器的最前端使用
]]
local phraseShown = ''

local ok, res = pcall(require, 'phraseReplaceModule')
local getShownPhrase = res.getShownPhrase

--最长的comment长度限制
local maxLenOfComment = 250

local function phraseReplace_Filter(input, env)
	--获取选项敏感词替换开关状态
	local on = env.engine.context:get_option("phraseReplace")
	local candsHasBeenHidden = {}
	local candStart,candEnd
	
	for cand in input:iter() do
		candStart = cand.start
		candEnd = cand._end
		
		local candTxt = cand.text:gsub("%s","") or ""
		
		phraseShown = getShownPhrase(candTxt)
		
		if nil ~= phraseShown then
			--不管是否开启选项替换,如果该选项是被命中的替换项,则加上替换标记 👙
			cand.comment = '👙'..cand.comment
			if '' ~= phraseShown then
				if on then
					--如果开启了选项替换功能,且存在替换内容
					yield(Candidate("word", cand.start, cand._end, phraseShown, cand.comment))
				else
					--如果未开启选项替换功能
					yield(cand)
				end
			else
				if on then
					--如果开启了选项替换功能,且这个选项应该被隐藏
					table.insert(candsHasBeenHidden,candTxt)
				else
					--如果未开启选项替换功能
					yield(cand)
				end
			end
		else
			yield(cand)
		end
	end
	
	--如果有被隐藏的选项,则抛出一个 * 选项提示
	if 0 < #candsHasBeenHidden then
		yield(Candidate("word", candEnd-1, candEnd, '*', '👙'))
	end
end

return phraseReplace_Filter

👆以上的脚本中,我们返回了一个 phraseReplace_Filter 的滤镜方法。该方法可以对候选项逐一进行检查并进行脱敏处理。

💣注意:
phraseReplace.txtphraseReplace_Filter.luaphraseReplaceModule.lua 以及被引用的模块脚本 sysInfo.lua,均应在 用户文件夹下的 lua 文件夹内:
20240107170710

rime.lua

想必大家对 rime.lua 已经不陌生了,在 rime.lua 文档中,我们添加 phraseReplace_Filter 滤镜接口,如下👇:

help_translator = require("help")
inputShow_translator = require("inputShow")
inputShow_Filter = require("inputShow_Filter")
Upper_Filter = require("Upper_Filter")
dic_4w_Filter = require("dic_4w_Filter")
phraseReplace_Filter = require("phraseReplace_Filter")

wubi_pinyin.custom.yaml

以上,我们已经完成了所有滤镜的功能定义,我们只需要在我们所使用的输入方案中配置 phraseReplace_Filter 滤镜,即可使用 phraseReplace_Filter 滤镜所提供的敏感词脱敏功能了。此处以 五笔・拼音 输入方案为例,我们在 五笔・拼音 输入方案的方案文档 wubi_pinyin.schema.yaml 的补丁文档 wubi_pinyin.custom.yaml 中增加配置一个 lua 滤镜 phraseReplace_Filter,如下👇:

patch:
  engine/filters:									# 设置以下filter
    - simplifier
    - lua_filter@inputShow_Filter					# 这个过滤器用于在特定场景下,增加候选项
    # 上面的滤镜会调整候选词选项,或者增加,或者减少。原则上说,减少的滤镜,请放在前端
    - lua_filter@phraseReplace_Filter				# 词语替换滤镜,针对一些指定的关键字,将其替换为指定的内容,或者当没有指定内容时,替换为 *
    # 上面的滤镜会减少或者改变候先词选项
    - uniquifier									# 过滤重复候选项,依赖 simplifier

phraseReplace.txt/phraseReplaceModule.lua/phraseReplace_Filter.lua/sysInfo.lua/rime.lua/wubi_pinyin.custom.yaml 文档

👆上述 6 个配置文档,你可以在 rime中州韵小狼毫敏感词脱敏滤镜 取用。

交互欣赏

敏感词不太适合进行对比展示,此处展示一下脱敏后的效果吧。
20240107172905
以上👆,如果你也用的是五笔,你应该能猜到脱敏前是什么字/词。

小结

以上就是今天的分享,我们通过 1 个字典文档,5lua 脚本文档,在rime中州韵小狼毫输入法中配置了一个敏感词脱敏滤镜。通过对这 6 个文档的逐一讲解,相信大家也能够在理解每个文档的作用和使用方法的基础上可以灵活运用和配置更强大的功能词库。

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

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

相关文章

OpenSource - 基于Netty的网络扩展库HServer

文章目录 概述官网Hserver的理念特点原理图代码案例HelloWorld 概述 HServer是一个基于Netty开发网络扩展库.使用插件方式来扩展我们的业务 HServer提供 web,gateway,rpc 等插件 同时用户也可以自定义插件&#xff0c;来完成各种各样的业务场景。 官网 https://gitee.com/HSe…

认识Git

&#x1f30e;初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…

JVM中对象的创建

一.JVM运行流程 JVM向操作系统申请内存&#xff0c;初始化运行时数据区&#xff0c;接下来装载使用的类&#xff0c;执行类里面相应方法的时候为当前虚拟机栈压入一个栈帧&#xff0c;方法执行完成后栈帧出栈&#xff0c;进行垃圾回收。 二.JVM中对象的创建过程 符号引用&…

三维模型数据的几何坐标变换的点云重建并行计算技术方法分析

三维模型数据的几何坐标变换的点云重建并行计算技术方法分析 倾斜摄影三维模型数据的几何坐标变换与点云重建并行计算技术的探讨主要涉及以下几个方面&#xff1a; 1、坐标系定义与转换&#xff1a;在进行坐标变换前&#xff0c;需要确定各个参考系的定义并实现坐标系之间的转…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

WorkPlus AI助理为企业提供智能客服的机器人解决方案

在数字化时代&#xff0c;企业面临着客户服务的重要挑战。AI客服机器人成为了提升客户体验和提高工作效率的关键工具。作为一款优秀的AI助理&#xff0c;WorkPlus AI助理以其智能化的特点和卓越的功能&#xff0c;为企业提供了全新的客服机器人解决方案。 为什么选择WorkPlus A…

Proteus 各版本安装指南

Proteus下载链接 https://pan.baidu.com/s/1vHgg8jK9KSHdxSU9SDy4vQ?pwd0531 1.鼠标右击【Proteus8.15(64bit&#xff09;】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到Proteus8.15(64bit&#xff09; 】。 2.打开解压后的文件夹&#…

Java最大优先队列设计与实现

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 1、API设计 类名MaxPriorityQueue构造方法MaxPriorityQueue(int capacity)&#xff1a;创建容量为capacity的MaxPriorityQueue对象成员方法private boolean less(int i,int j)&#xff1a;判断堆中索引i处的元素是否小…

CSS基础笔记-04cascade-specificity-inheritance

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》CSS基础笔记-03选择器 前言 Cascading Style Sheets&#xff0c;关键就在于这个cascading&#xff0c;对于这个术语理解&#xff0c;感觉对于我这种CSS新手有点儿不太friendly。本文记录下我对这个术语的理…

Java大数据hadoop2.9.2搭建伪分布式yarn资源管理器

1、修改配置文件 cd /usr/local/hadoop/etc/hadoop cp ./mapred-site.xml.template ./mapred-site.xml vi mapred-site.xml <configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> &l…

1_工程设计模式-简单工厂设计

工程设计模式 一.简单工程设计模式 1.概念 简单工厂模式( Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例。 但它不属于 GOF 23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff…

Java SE面试

1.什么是 Java&#xff1f; Java 是一门面向对象的编程语言&#xff0c;不仅吸收了 C语言的各种优点&#xff0c;还摒弃了 C里难以理解的多继承、指针等概念&#xff0c;因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表&#xff…

微信小程序 引导地址授权 获取位置信息 uniapp

概述 获取位置信息&#xff0c;需要保证是否授权位置信息&#xff0c;有几个条件是导致无法授权的原因 &#xff08;1&#xff09;微信应用未授权定位设置 &#xff08;2&#xff09;首次进入小程序未授权位置信息 &#xff08;3&#xff09;小程序之前阻止过授权位置信息 &…

深入理解堆(Heap):一个强大的数据结构

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 前言堆的实现基本操作结构体定义初始化堆&#xff08;HeapInit&#xff09;销毁堆&#xff08;HeapDestroy&#xff09; 重要函数交换函数&#xff08;…

Mybatis简易搭建并查询数据库表内所有数据

搭建步骤 1.在mysql中创建user表&#xff0c;添加数据2.创建maven模块&#xff0c;导入坐标3.在资源文件夹中导入需要用到的logback.xml4.编写MyBatis 核心配置文件->替换连接信息 解决硬编码问题5.编写 SQL映射文件->统一管理sgl语句&#xff0c;解决硬编码问题6.编码定…

Mybatis实现增删改查的两种方式-配置文件/注解

环境准备 1.数据库表tb_brand -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand(-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int…

阿里巴巴微服务治理框架的终极PK!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

前端效果 登入界面

文章目录 效果展示&#xff1a; 代码&#xff1a; <template><div class"login"><div class"section-1"><div class"card" mouseover"activeCard 1" mouseleave"activeCard 0" click"islogin…

【SpringBoot+dubbo+zk】实现服务之间rpc通信

0)前置准备&#xff0c;我们使用zk作为注册中心&#xff0c;先启动zk&#xff0c;也就是2181端口。 1)父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http…

UWB灵犀遥控器方案介绍

关键字&#xff1a;UWB技术、遥控器三维定位、遥控器指向操控 系统介绍&#xff1a;UWB灵犀遥控器&#xff0c;基于UWB TOF测距和AOA测角原理。显示器端可以同时定位遥控器的位置和朝向。实现使用遥控器指向屏幕&#xff0c;即可隔空触控&#xff0c;在大屏上实现滑动、拖拽、点…