rime中州韵小狼毫 生字注音滤镜 汉字注音滤镜

2024-01-09 10:12

本文主要是介绍rime中州韵小狼毫 生字注音滤镜 汉字注音滤镜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在中文环境下,多音字是比较常见的现象。对于一些不常见的生僻字,或者一些用于地名,人名中的常见字的冷门读音,如果不能正确的阅读,例如把 荥阳 读成了 miāo yáng,则会怡笑大方。

今天我们在rime中州韵小狼毫输入法中配置一个注音滤镜,以便我们在日常的文字输入时,可以经常的,实时的学习、复习、强化这些文字的读音,不做白字先生。

先睹为快

本文所分离的在rime中州韵小狼毫须鼠管输入法中的生字注音效果如下👇:
20240108191021

pinyinAdding.txt

首先,我们需要一个文档来记录和管理汉字与注音的信息。pinyinAdding.txt 文档的内容截取部分展示如下👇:

冔	冔(xǔ)
玏	玏(lè)
鹯	鹯(zhān)
亶	亶(dǎn)
荥	荥(yíng)
荥阳	荥(xíng)阳

👆以上,pinyinAdding.txt 文档中的内容主要有两列,以 tag 制表符分隔。第一列是汉字或者词组,第二列是带有注音的词组。顺序无先后。但在后续的lua滤镜中,会被处理成优先匹配词组的逻辑。例如词组荥阳会优先匹配荥(xíng)阳,而不是匹配成 荥(yíng)阳

pinyinAddingModule.lua

我们有了字典文档 pinyinAdding.txt,但这并没有办法在输入引擎中直接使用。我们还需要一个lua脚本,将 pinyinAdding.txt 文档内的词组加载到lua程序中。pinyinAddingModule.lua 脚本文档中的脚本如下👇:

-- pinyinAddingModule.lua
-- Copyright (C) 2023 yaoyuan.dou <douyaoyuan@126.com>local M={}
local dict={}
local dbgFlg = true--引入系统变更处理模块
local ok, sysInfoRes = pcall(require, 'sysInfo')
local currentDir = sysInfoRes.currentDir
local userName = sysInfoRes.userName
--引入utf8String,用于处理utf8字符串
local of,utf8Str = pcall(require, 'utf8String')
local utf8Sub = utf8Str.utf8Sub
local utf8Len = utf8Str.utf8Len--设置 dbg 开关
local function setDbg(flg)dbgFlg = flgsysInfoRes.setDbg(flg)print('pinyinAddingModule 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 then--此处,如果key 已经存在,则使用后来的值顶替旧的值if ''~=val thenthisDict[key] = valendendendendif dbgFlg thenprint("-->dictload completed here")endreturn thisDict
end--===========================test========================
local function test(printPrefix)if nil == printPrefix thenprintPrefix = ' 'endif dbgFlg thenprint(printPrefix,'pinyinAddingModule test starting...')sysInfoRes.test(printPrefix..' ')for k,v in pairs(dict) doif dbgFlg thenprint(printPrefix..k..'\t'..v)endendend
end--这是一个递归函数,用于在给定的字符串中查找最大能匹配的子串
local function getItmInDicByStr(Str)Str = Str or ''if ''==Str then--返回子串值,匹配值,匹配长度return '','',0endlocal itmKey,itmLen,itmVal,strLen,flgstrLen = utf8Len(Str)flg=falsefor idx=strLen,1,-1 doitmKey = utf8Sub(Str,1,idx)if''~=itmKey thenitmVal = dict[itmKey]if nil~=itmVal thenitmLen = idxflg = truebreakendendendif flg thenreturn itmKey,itmVal,itmLenelsereturn '','',0end
endlocal function pinyinAdding(k)k = k or ''if ''==k thenreturn kendlocal valStr,kLenlocal subK,subKVal,subKLenlocal matchPositionvalStr = ''kLen = utf8Len(k)matchPosition = 1while matchPosition <= kLen dosubK,subKVal,subKLen = getItmInDicByStr(utf8Sub(k,matchPosition,kLen))if ''==subK thenvalStr = valStr..utf8Sub(k,matchPosition,1)matchPosition = matchPosition + 1elsevalStr =valStr..subKValmatchPosition = matchPosition + subKLenendendreturn valStr
endfunction M.init(...)local files={...}--文件名不支持中文,其中 # 开始的行为注释行table.insert(files,"pinyinAdding.txt")for i,v in next, files dofiles[i] = currentDir().."/".. venddict= dictload(table.unpack(files))--抛出功能函数M.pinyinAdding = pinyinAddingM.pinyinAddingT = pinyinAddingM.setDbg = setDbgM.test = test
endM.init()return M

👆以上脚本中,我们将指定的 pinyinAdding.txt 文档中的词组加载为一个 dict 的字典对象,然后给出了一个检索字典的方法 pinyinAdding。我们通过方法pinyinAdding可以方便的检索出指定关键字的注音版本词组。

pinyinAdding_Filter.lua

在脚本文档 pinyinAddingModule.lua 中,我们加载并定义了词组的检索方法。现在我们需要在脚本文档 pinyinAdding_Filter.lua 内将词组检索方法整理成rime引擎的滤镜方法,pinyinAdding_Filter.lua文档内的脚本如下👇:

-- phraseReplace_Filter.lua
-- Copyright (C) 2023 yaoyuan.dou <douyaoyuan@126.com>
--[[
这个过滤器的主要作用是,对于候选项中命中的选项(OR 内容),用其指定的内容来代替,如果没有指定,则使用 * 替换
由于这个过滤器会改变候选项的内容(主要是会减少候选项数量),所以请将这个过滤器放在其它过滤器的最前端使用
]]
local phraseShown = ''local ok, py = pcall(require, 'pinyinAddingModule')--最长的comment长度限制
local maxLenOfComment = 250local function pinyinAdding(input, env)--获取选项pinyin开关状态local pySwitchFlg = env.engine.context:get_option("pinyin") or false--如果pySwitchFlg是true状态,则替换原选项,如果是false状态,则在comment中注音local pyInCommentFlg = trueif pySwitchFlg thenpyInCommentFlg = falseendfor cand in input:iter() dolocal txtWithPy = py.pinyinAdding(cand.text)if nil == txtWithPy then--没有获取到 txtWithPy,则不做处理yield(cand)elseif txtWithPy == cand.text then--txtWithPy 与 原候选词一致,则不做处理yield(cand)else--获取到了 txtWithPy,且不与原候选词一致if pyInCommentFlg or string.find(cand.comment,'☯') then--如果需要加到comment里,或者这是一个自造词,为了不影响自造词功能,也需要加到commnet里if ''==cand.comment thencand:get_genuine().comment = txtWithPyelseif utf8.len(cand.comment) < 5 thencand:get_genuine().comment = cand.comment..'✔'..txtWithPyelsecand:get_genuine().comment = cand.comment..'\r✔'..txtWithPyendendyield(cand)else--如果不加到comment,则替换原选项,注意,替换原选项,会影响自动调频功能cand.text = txtWithPyif cand.text == txtWithPy thenyield(cand)elseyield(Candidate("word", cand.start, cand._end, txtWithPy, cand.comment))endendendend
endreturn pinyinAdding

👆以上脚本中, 我们定义了滤镜方法 pinyinAdding 并返回/抛出了该方法。

💣注意:
以上所述文档 pinyinAdding.txtpinyinAddingModule.luapinyinAdding_Filter.lua 三个文档,应该位于 用户文件夹 下的 lua 文件夹内。如下👇:
20240108185223

rime.lua

以上我们完成了 pinyinAdding 滤镜方法的定义,现在我们需要在文档 rime.lua 中将该 pinyinAdding 滤镜方法映射成 pinyinAdding_Filter 滤镜接口。我们在 rime.lua 中增加以下👇脚本:

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")
pinyinAdding_Filter = require("pinyinAdding_Filter")

👆以上脚本中,注音最后一行的 pinyinAdding_Filter 的定义。

wubi_pinyin.custom.yaml

以上步骤中,我们完成了pinyinAdding_Filter滤镜的定义。现在万事俱备,只欠东风了。我们只需要在我们的输入方案中配置引用该 pinyinAdding_Filter 滤镜,即可看到文字注音的效果了。

现在我们以 五笔・拼音 输入方案为例来配置生字注音滤镜。我们在 五笔・拼音输入方案的方案文档 wubi_pinyin.schema.yaml 的补丁文档 wubi_pinyin.custom.yaml 加入以下👇配置:

patch:switches/+: #增加以下开关- name: pinyin					# 这个开关用于标记是否打开拼音滤镜reset: 0states: [Off, pīnyīn]engine/filters:									# 设置以下filter- simplifier# 下面的滤镜是comment滤镜,不会改变候选项列表- lua_filter@pinyinAdding_Filter				# pinyin滤镜,用于对候选项中的字添加拼音

👆以上的配置中,我们增加了两项内容,一个是switch开关pinyin, 一个是lua_filter 滤镜 pinyinAdding_Filter。这是因为我们在 pinyinAdding_Filter.lua 脚本中会检测开关pinyin的状态以决定是否启用滤镜功能。如下👇:
20240108190137

💣注意:
文档 rime.luawubi_pinyin.custom.yaml 都应该位于 用户文件夹下,这不需要再多说什么了。

pinyinAdding.txt/pinyinAddingModule.lua/pinyinAdding_Filter.lua/rime.lua/wubi_pinyin.custom.yaml 文档

👆以上所述 pinyinAdding.txtpinyinAddingModule.luapinyinAdding_Filter.luarime.luawubi_pinyin.custom.yaml 五个文档,你也可以在 rime中州韵小狼毫 生字注音滤镜.zip 下载取用。

效果欣赏

做完了以上的配置工作,不要忘了 重新部署 你的 rime。然后你就应该能够观察到文字注音效果了。如下👇:
20240108191021

小结

本文分享了一种在rime中州韵小狼毫须鼠管输入法中配置生字注音滤镜的方法,并以五笔・拼音 输入方案为例,配置并演示了生字注音滤镜的功能效果。本文所配置文档共5个,其中 pinyinAdding.txt 文档为词组管理文档,通过这个文档可以非常方便的增删管理生字及其注音信息;pinyinAddingModule.lua 脚本文档提供了 pinyinAdding.txt 词组的加载和解析功能,并提提供了检索方法的接口;pinyinAdding_Filter.lua 文档定义了基于rime引擎接口的滤镜方法;最后我们在 rime.lua 脚本和 wubi_pinyin.custom.yaml 文档中配置和使用了该滤镜。并在最终的功能效果中观察到了预期的功能效果。

这篇关于rime中州韵小狼毫 生字注音滤镜 汉字注音滤镜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586759

相关文章

快速搞定“照片调色”!50000+Lr预设滤镜模板,一键让你照片不再丑!

照片调色不仅仅是调整颜色,更是一种艺术表达。通过巧妙地运用 LR 预设,可以突出照片的主题,增强情感共鸣。比如,在风景照片中,使用特定的预设可以让天空更蓝、草地更绿,让大自然的美丽更加生动地展现出来。 在人像摄影中,合适的 LR 预设可以让肤色更加自然、眼神更加明亮,让人物更加迷人。而且,LR 预设还可以根据不同的风格和场景进行定制,满足各种个性化的需求。如果你对照片调色还不是

linux下C连接mysql查询表信息汉字乱码问题

对于mysql C_API接口的查询问题,在查询之前需要设置读取数据库的编码格式,即在查询语句之前添加以下语句 mysql_query(connection, "set names utf8") 即在执行数据查询之前,要设置一下编码方式!

【OpenLayers 进阶】添加滤镜改变底图样式

目录 一、前言二、准备工作三、实现方式四、总结 一、前言    项目实施过程中,需要根据不同的业务场景需求变换地图样式。如果客户提供的底图服务或自建底图服务是类似Mapbox这种矢量切片,那只要按照需求配置不同的样式文件即可。如果没有矢量切片,只有一张张瓦片图如何实现呢?下面提供两种实现方式,以供参考 二、准备工作 首先要将完成地图的初始化 添加地图DIV <

iOS CoreImage专题(三)—— 自定义滤镜

前言子类化CIFilter自定义滤镜配方 子类化CIFilter创建CIColorInvert滤镜色度键滤镜配方 创建立体映射 获得最佳性能 最佳性能实践你的App需要颜色管理吗 总结 前言 本章节是这个专题最后一篇文章,学完这里,你应该能非常熟练的掌握CoreImage的使用技巧了。 在上一章节中我们介绍了如何实现一些高级技巧,包括滤镜链的实现、转场效果、人脸检测等。

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示

1、本节实现的内容 上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析,这节课将使用到显示列表等操作,我们还将制作一个显示文字坠落的动画效果。 2、文字显示与普通Windows编程的区别 第一、文字显

iOS汉字转换成拼音

系统提供了将汉字转换为拼音的方法。 1.str为汉字字符串对象,转换为可变的待转字符串string     CFMutableStringRef string = CFStringCreateMutableCopy(nil, 0, CFSTR(str)); 2.将string转换成带有音调的拼音     CFStringTransform(string, nil, kCFStringTr

Android汉字转拼音的完美解决方案

前面的话:做一件事情前一定要先对比多种解决方案在开始写代码,如果一开始就知道某种方法的不合理,就不会浪费那么多时间在解决之前的错误上啦。这篇文章就是因为一开始没有认识到这个问题,付出的代价。以此为戒! 一开始,我使用ASCII码和拼音的映射对汉字和拼音间进行转换,相关类如下: public class CharacterParser {private static int[] pyvalue

如何将十六进制的乱码转换成汉字

在TCP通信时,抓包得到的请求报文,我们需要对其进行分析, 用下面的报文举例: GET  /search?query=%E4%B8%89%E6%98%9F  HTTP/1.1 Host: 192.168.0.118:50500 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Window

PHP 获取一段内容中每个汉字出现的次数

//获取$str里的前几个汉字function gainChinese($str='',$length=99999999999){$count = 0;//$str_count = strlen($str);//字符个数$result = '';if ($str_count>0) {for($i=0;$i<$str_count;$i++){$str_i = mb_substr($str,

使用python按拼音归类GBK编码表中的所有汉字

按拼音归类GBK编码表中的所有汉字,每个拼音对应的第一个汉字前面用左大括号,每一个拼音的最后一个汉字后面用右大括号,并保存到txt文本中,并统计包含了多少汉字 安装必要的库 确保安装 pypinyin 库用于拼音转换: pip install pypinyin 代码 import collectionsimport pypinyin# 生成 GBK 编码中的所有汉字gbk_char