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

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

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

👇如下,如果我们快速的输入了 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 = flgsysInfoRes.setDbg(flg)print('phraseReplace dbgFlg is '..tostring(dbgFlg))
end--将文档处理成行数组
local function files_to_lines(...)if dbgFlg thenprint("--->files_to_lines called here")endlocal tab=setmetatable({},{__index=table})local index=1for i,filename in next,{...} dolocal fn = io.open(filename)if fn thenfor line in fn:lines() doif not line or #line > 0 thentab:insert(line)endendfn:close()endendif dbgFlg thenprint("--->files_to_lines completed here")endreturn tab
endlocal function dictload(...) -- filename)if dbgFlg thenprint("-->dictload called here")endlocal lines=files_to_lines(...)local thisDict={}for i,line in next ,lines doif not line:match("^%s*#") then  -- 第一字 # 为注释行local key,val = string.match(line,"(.+)\t(.+)")if nil == key thenkey = string.match(line,'(%S+)')val = ''endif nil ~= key then--此处,如果key 已经存在,则使用后来的值顶替旧的值thisDict[key] = valendendendif dbgFlg thenprint("-->dictload completed here")endreturn thisDict
end--===========================test========================
local function test(printPrefix)if nil == printPrefix thenprintPrefix = ' 'endif dbgFlg thenprint('phraseReplace test starting...')sysInfoRes.test(printPrefix..' ')for k,v in pairs(dict) doif dbgFlg thenprint(printPrefix..k..'\t'..v)endendend
end--获取字典中的phrase
local function getShownPhrase(k)if nil == k thenreturn ''elseif '' == k thenreturn ''end--尝试获取 dictPhraseList 中 k 的列表return dict[k]
endfunction M.init(...)local files={...}--文件名不支持中文,其中 # 开始的行为注释行table.insert(files,"phraseReplace.txt")for i,v in next, files dofiles[i] = currentDir().."/".. venddict= dictload(table.unpack(files))--抛出功能函数M.getShownPhrase = getShownPhraseM.userName = userNameM.setDbg = setDbgM.test = test
endM.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 = 250local function phraseReplace_Filter(input, env)--获取选项敏感词替换开关状态local on = env.engine.context:get_option("phraseReplace")local candsHasBeenHidden = {}local candStart,candEndfor cand in input:iter() docandStart = cand.startcandEnd = cand._endlocal candTxt = cand.text:gsub("%s","") or ""phraseShown = getShownPhrase(candTxt)if nil ~= phraseShown then--不管是否开启选项替换,如果该选项是被命中的替换项,则加上替换标记 👙cand.comment = '👙'..cand.commentif '' ~= phraseShown thenif on then--如果开启了选项替换功能,且存在替换内容yield(Candidate("word", cand.start, cand._end, phraseShown, cand.comment))else--如果未开启选项替换功能yield(cand)endelseif on then--如果开启了选项替换功能,且这个选项应该被隐藏table.insert(candsHasBeenHidden,candTxt)else--如果未开启选项替换功能yield(cand)endendelseyield(cand)endend--如果有被隐藏的选项,则抛出一个 * 选项提示if 0 < #candsHasBeenHidden thenyield(Candidate("word", candEnd-1, candEnd, '*', '👙'))end
endreturn 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中州韵小狼毫敏感词脱敏滤镜 取用。

另同步gitHub仓库:dyyRime

效果欣赏

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

小结

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

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

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

相关文章

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中&#xff0c;本地环境&#xff08;dev&#xff09;和开发环境&#xff08;feature&#xff09;会共同使用相同的中间件&#xff08;本篇拿Redis举例&#xff09;&#xff0c;对于不同环境中的&#xff0c;图片、视频、语音等资源类型的预览地址url&#xff0c;需要配…

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

mysql定时备份shell脚本和还原

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言数据库备份分类mysqldump命令备份计划1.每日备份&#xff0c;保留30天备份文件2.每月1号备份&#xff0c;保留12个月备份文件 定时调度还原总结 前言 数据库备…

创建并美化Github主页(内含组件)

目录 1、创建仓库 2、美化 1、包含多种 2、活动统计图 3、资料奖杯 4、文字的打字特效 5、中文网站卡片 6、贪吃蛇贡献图 7、可参考的页面 最近有想要写开源的打算了&#xff0c;计划了好久好久好久&#xff0c;不知道写啥(目前仍然不知道)…… 俗话说人活一张脸&#xff0…

一台Linux服务jdk1.6 与 jdk1.8 并存,tomcat6+tomcat8 并存

Linux jdk1.6,1.8 tomcat6 tomcat8 并存 需求场景&#xff1a; 有一个项目 原来是 jdk1.6tomcat6 部署的&#xff0c;现在需要进行项目架构升级 项目需要适配jdk1.8 然后用 jdk.8 tomcat 8进行部署&#xff0c;然后下架 jdk1.6 的linux服务 现在有一台 jdk.8 tomcat 8的linu…

Qt During startup program exited with code 0xc0000135

网上试了好多办法没有用&#xff0c;可以试试在pro目录下加入如图所示的.dll 可以下个everything搜索整个电脑查看是否有上述dll&#xff0c;如果没有也可以网上下载或者点击连接

服务器感染了.pings勒索病毒,如何确保数据文件完整恢复?

导言&#xff1a; 随着科技的不断进步&#xff0c;网络犯罪也在不断演变。其中之一的.pings勒索病毒是一种危险的恶意软件&#xff0c;它能够加密用户的数据文件&#xff0c;并要求支付赎金以解密这些文件。在本文中&#xff0c;91数据恢复将介绍.pings勒索病毒&#xff0c;以…

Redis性能大挑战:深入剖析缓存抖动现象及有效应对的战术指南

在实际应用中&#xff0c;你是否遇到过这样的情况&#xff0c;本来Redis运行的好好的&#xff0c;响应也挺正常&#xff0c;但突然就变慢了&#xff0c;响应时间增加了&#xff0c;这不仅会影响用户体验&#xff0c;还会牵连其他系统。 那如何排查Redis变慢的情况呢&#xff1f…

[问题记录] vue-router中导航守卫默认跳转login失败

问题 做博客后台的时候发现一个问题&#xff0c;在没启动服务的情况下&#xff0c;后台在 router 中并未读取到配置的情况下&#xff0c;应该默认跳转 login 页面。但是页面始终不跳转&#xff0c;并且伴随多个执行错误弹窗。 router.beforeEach(async (to, from, next) >…

基于JavaWeb+BS架构+SpringBoot+Vue协同过滤算法的体育商品推荐系统的设计和实现

基于JavaWebBS架构SpringBootVue协同过滤算法的体育商品推荐系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 1 1.1项目背景 1 1.2研究意义 2 1.3设计目的 2 1.…

抖捧AI实景自动直播,开启2024直播新篇章!

在如今互联网的时代&#xff0c;各个行业的实体商家都面临着新的挑战与机遇&#xff0c;而传统做线下经营的方式&#xff0c;已经逐渐被直播与短视频宣传所超越&#xff0c;但还有不少商家思维存在于传统的宣传方式上&#xff0c;也错失了很多的机会&#xff0c;今天就给大家介…

基于微信小程序的学校图书管理系统开发与实现

学校图书馆里有大量的各种领域的图书&#xff0c;可供学校各个专业的师生来借阅与做科学和论文研究&#xff0c;但过去图书馆的借阅、归还及图书资料的管理完全依靠图书馆工作人员的手工记录与引导师生找寻借阅的书籍&#xff0c;其耗时费力且低效&#xff0c;开发的学校图书管…

爱情视频相册怎么做?2.14情人节表白/活动视频模板PR剪辑素材

美好爱情故事&#xff0c;情人节表白视频相册怎么做&#xff1f;粉色浪漫的PR情人节表白/活动视频模板剪辑素材mogrt下载。 特征&#xff1a;可编辑文字和调整颜色&#xff0c;通过智能对象替换图像&#xff0c;RGB颜色模式&#xff0c;易于自定义&#xff0c;无需插件&#xf…

groovy XmlParser 递归遍历 xml 文件,修改并保存

使用 groovy.util.XmlParser 解析 xml 文件&#xff0c;对文件进行修改&#xff08;新增标签&#xff09;&#xff0c;然后保存。 是不是 XmlParser 没有提供方法遍历每个节点&#xff0c;难道要自己写&#xff1f; 什么是递归&#xff1f; 不用说&#xff0c;想必都懂得~ …

2023年度总结 - 职业生涯第一个十年

2023年只剩下最后一周&#xff0c;又到了一年一度该做年末总结的时候了。 回想起去年&#xff0c;还有人专门建立了一个关于年度总结文章汇总的仓库。读了很多篇别人写的&#xff0c;给了我很多的触动和感想。这里的每篇文章都是关于某个人这一整年的生活和工作的轨迹啊。即使你…

搜索与图论第一期 DFS(深度优先搜索)

前言 DFS这部分难度不大&#xff0c;大家应该完全掌握&#xff01;&#xff01;&#xff01; 一、DFS的基本内容 内容&#xff1a; 深度优先遍历图的方法是&#xff0c;从图中某顶点v出发&#xff1a; &#xff08;1&#xff09;访问顶点v&#xff1b; &#xff08;2&#…

圣诞老人遇见 GenAI:利用大语言模型、LangChain 和 Elasticsearch 破译手写的圣诞信件

在北极的中心地带&#xff0c;圣诞老人的精灵团队面临着巨大的后勤挑战&#xff1a;如何处理来自世界各地儿童的数百万封信件。 圣诞老人表情坚定&#xff0c;他决定是时候将人工智能纳入圣诞节行动了。 圣诞老人坐在配备了最新人工智能技术的电脑前&#xff0c;开始在 Jupyter…

【LangChain学习之旅】—(4) 模型I/O:输入提示、调用模型、解析输出

【LangChain学习之旅】—&#xff08;4&#xff09; 模型I/O&#xff1a;输入提示、调用模型、解析输出 Model I/OLangChain 中提示模板的构建语言模型为什么选择langchain输出解析总结 Reference&#xff1a;LangChain 实战课 Model I/O 我们可以把对模型的使用过程拆解成三块…

计算机体系结构----计分板(scoreboard)算法

计分板算法简介 计分板记录着所有必要的信息&#xff0c;用来控制以下事情&#xff1a; 每条指令何时可以读取操作数并投入运行&#xff08;对应着RAW冲突的检测&#xff09;每条指令何时可以写入结果&#xff08;对应着WAR冲突的检测&#xff09;在计分板中&#xff0c;WAW冲…

利用numpy+sklearn+matplotlib演示如何创建和训练线性回归模型

通过一个具体的业务场景来演示如何创建和训练线性回归模型。让我们考虑一个房地产市场的例子&#xff0c;其中我们想要根据房屋的大小&#xff08;平方英尺&#xff09;来预测其市场价格。 业务场景 假设你的任务是帮助一个房地产公司预测不同大小房屋的市场价格。你有一份包…