一行命令给现在的 cizu_raw.txt 自定义权重 #54
amorphobia
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
命令
我用 cizu_raw.txt 的前几行解释一下,假设 cizu_raw.txt 的内容是:
现在想要把「彬彬」的权重降低 300,把宾补的权重增加200,那么就在一个 cizu_patch.txt 文件里写如下内容(tab 分割):
然后用上面的命令,就可以得到调整权重之后的 result.txt
解释
awk 命令
中间先不看,这个命令整体的结构是
awk ...... cizu_patch.txt cizu_raw.txt > result.txt
,就是用 awk 按照先 cizu_patch.txt 后 cizu_raw.txt 的顺序处理,把结果放到 result.txt-v OFS='\t'
这个参数表示,输出结果时用 tab 分割,而不是空格。
NR==FNR
这是个判断语句,其实完整的是包含接下来的两个花括号代码块的:
NR
表示已经记录的文本总行数,FNR
表示当前处理的文本中的行号。那么对于第一个处理的补丁文件 cizu_patch.txt,当前行号自然等于总行数,所以执行第一个花括号中的代码,而对于第二个处理的文件 cizu_raw.txt,当前行号不等于总行数,所以执行第二个花括号中的代码第一个花括号(处理 cizu_patch.txt)
{map[$1,$2] = $3; next}
map[]
在 awk 中表示一个键-值对映射,$
加数字是文本中的第几列的意思,因此map[$1,$2]
表示前两列(词语和声码)一起为键,在 map 中查找值,= $3
表示把这个值设置为第三列(权重的增减)。第二个花括号(处理 cizu_raw.txt)
{print $1,$2,$3,$4+map[$1,$2],$5,$6}
依次输出
$1
,$2
,$3
,$4+map[$1,$2]
,$5
,$6
,代表的内容,其他的都好理解,分别是第一列(词语),第二列(声码),第三列(形码),第五列(附加权重), 第六列(注释)$4+map[$1,$2]
表示的意思就是,把第四列(原有权重)加上 map 中查到的值,这里 map 中存的值就是 cizu_patch.txt 里面的 -300 / +200 了。别忘了,我们设置过用 tab 分隔,以及把结果放到 result.txt 里,最终在 result.txt 里的内容就是我们想要的:
可以见到「彬彬」变成700,「宾补」变成1099了。这个可以用于自己调序,不需要直接改官方的文件,官方更新后可以更容易维护自己的排序。
Beta Was this translation helpful? Give feedback.
All reactions