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.rhkb.cn/news/237909.html

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

相关文章

【大厂秘籍】 - Java多线程面试题

Java多线程面试题 友情提示&#xff0c;看完此文&#xff0c;在Java多线程这块&#xff0c;基本上可以吊打面试官了 线程和进程的区别 进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线…

【办公软件】手机当电脑摄像头Iriun Webcam软件安装与试用

家里电脑是台式的没有摄像头&#xff0c;但老安卓手机有一台。本来想用小爱摄像头做电脑摄像头&#xff0c;但是发现像素有点差&#xff0c;捣鼓了半天没成功。看网上别人都用旧手机来当电脑摄像头&#xff0c;并且也能使用音频&#xff0c;所以还是用旧手机做摄像头比较香。 …

yolov5无人机视频检测与计数系统(创新点和代码)

标题&#xff1a;基于YOLOv5的无人机视频检测与计数系统 摘要&#xff1a; 无人机技术的快速发展和广泛应用给社会带来了巨大的便利&#xff0c;但也带来了一系列的安全隐患。为了实现对无人机的有效管理和监控&#xff0c;本文提出了一种基于YOLOv5的无人机视频检测与计数系…

如何从 Keras 中的深度学习目录加载大型数据集

一、说明 数据集读取&#xff0c;使用、在磁盘上存储和构建图像数据集有一些约定&#xff0c;以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…

NLP论文阅读记录 - 2022 WOS | 语义提取文本摘要的新方法

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.背景三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 A Novel Approach for Semantic Extractive Text Summarization&…

vue前端开发自学,组件的嵌套关系demo

vue前端开发自学,组件的嵌套关系demo!今天开始分享的&#xff0c;前端开发经常用到的&#xff0c;组件的嵌套关系案例代码。下面先给大家看看&#xff0c;代码执行效果。 如图&#xff0c;这个是代码执行后&#xff0c;的效果布局&#xff01; 下面给大家贴出来源码。方便大家…

02 时间复杂度和空间复杂度

目录 算法效率时间复杂度空间复杂度练习 1. 算法效率 1.1 如何衡量一个算法的好坏 比如裴波那切数列: long long Fib (int N) { if (N < 3) return 1 ; return Fib(N-1) Fib(N -2) ; } 它的递归方式很简洁&#xff0c;但一定好吗&#xff1f;怎么衡量算法的好坏&#xf…

高效学习新编程语言的实践指南

学习一门新的编程语言或框架对于新手和有经验的程序员来说都是一个挑战。然而&#xff0c;通过采用一些有效的策略和方法&#xff0c;我们可以快速入门并掌握新的编程工具。本文将从新手和有编程经验两个不同的角度&#xff0c;分享一些实用的建议和技巧&#xff0c;帮助读者在…

mysql进阶-索引基础

目录 1. 概念-索引是什么&#xff1f; 2. 索引的数据结构(索引模型) 2.1 二分查找&#xff1a; 2.2 二叉查找树&#xff08;BST Binary Search Tree&#xff09;&#xff1a; 2.3 平衡二叉树(AVL Tree Balanced binary search trees) 2.4 多路平衡查找树(B Tree Balanced…

SG-8101CGA 系列 (晶体振荡器 可编程 可用 +125°C )

SG-8101CGA是可编程晶体振荡器&#xff0c;具有CMOS输出&#xff0c;适用于汽车&#xff0c;同时&#xff0c;该系列还提供相同的频率和其他参数的轻松编程能力&#xff0c;符合AEC-Q100标准&#xff0c;具有出色的电磁兼容性和稳定性&#xff0c;可以在各种环境下使用。外部尺…

第六站:C++面向对象

面向对象的第一概念:类 类的构成: “类”&#xff0c;是一种特殊的“数据类型”&#xff0c;不是一个具体的数据。 类的设计: 创建一个类: class Human { public://公有的,对外的void eat();//方法,成员函数void sleep();void play();void work();string getName();//获取对内…

【GitHub项目推荐--克隆你的声音】【转载】

今天推荐一个黑科技开源项目&#xff0c;只需要你 5 秒钟的声音对话&#xff0c;就能克隆出你的声音&#xff0c;而且能够实时的生成你任意语音。 是不是很顶&#xff1f; 我举个例子&#xff0c;如果我这里有 300 条你说话的语音&#xff0c;我把你的语音数据用这个开源项目…

c++ 开发生态环境、工作流程、生命周期-拾遗

拾遗 1 生态环境初识 当您使用Visual Studio 2019进行C开发时&#xff0c;您将进入C生态环境。以下是一些重要的概念和步骤&#xff1a; C程序的结构&#xff1a; 一个典型的C程序包括源文件&#xff08;.cpp&#xff09;、头文件&#xff08;.h&#xff09;、编译后的目标文…

Java 并发性和多线程3

七、线程安全及不可变性 当多个线程同时访问同一个资源&#xff0c;并且其中的一个或者多个线程对这个资源进行了写操作&#xff0c;才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。 我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改&…

实战之-Redis代替session实现用户登录

一、设计key的结构 首先我们要思考一下利用redis来存储数据&#xff0c;那么到底使用哪种结构呢&#xff1f;由于存入的数据比较简单&#xff0c;我们可以考虑使用String&#xff0c;或者是使用哈希&#xff0c;如下图&#xff0c;如果使用String&#xff0c;注意他的value&…

AI老照片修复-Bringing-Old-Photos-Back-to-Life

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI老照片修复原理-…

第18课 移植FFmpeg和openCV到Android环境

要在Android下从事音视频开发&#xff0c;同样也绕不开ffmpegopencv&#xff0c;不管是初学者还是有一定经验的程序&#xff0c;面临的首要问题就是环境的搭建和库文件的编译配置等问题&#xff0c;特别是初学者&#xff0c;往往会在实际开发前浪费大量的时间来编译ffmpeg及ope…

nvm管理多版本Node.js

nvm管理多版本Node.js 可能大家都曾苦恼于Node环境问题&#xff0c;某个项目需要升版本&#xff0c;某项目又需要降&#xff0c;甚至还出现npm版本与Node对不上的情况。 通过nvm进行版本管理&#xff0c;即可解决。 卸载Node 通过命令行输入node -v命令查看是否已安装Node&…

认知觉醒(九)

认知觉醒(九) 专注力——情绪和智慧的交叉地带 第一节 情绪专注&#xff1a;一招提振你的注意力 用元认知来观察自己的注意力是一件很有意思的事情&#xff0c;相信你可以轻易观察到这种现象&#xff1a;身体做着A&#xff0c;脑子却想着B。 跑步的时候&#xff0c;手脚在…