年前换了 am5 平台,把 Windows 7 搞坏了(B650m 主板没有 PS/2,amd 又没有 Win7 下的 USB 驱动),只能在 openSUSE 处理一些工作上的事情。我面临的问题是:输入一些奇奇怪怪的国内公司名字的时候,搜狗输入法NG版本(基于 CPIS),记忆比较快,但是它有几个硬伤解决不了,比如候选词面板上的数字上屏,有时候会跳,输入3上的是第5个字; 比如使用输入法切换到英文输入模式就切换不回来了;比如一些基本的汉字打不出来,比如覆盖的覆字。而 fcitx5 呢,记忆又太慢,我不得不一次次的去敲比如“鑫永俪”。于是我想到了一个办法,就是把我常用的公司名字制作成拼音词库。
fcitx5 的 libime 提供了 libime-pinyindict 工具用来把文本转为词库,要求的文本格式是这样的:
鑫永俪 xin'yong'li 0
于是我需要的就是把 excel 格式的客户名单分词,再标注拼音就可以了(词频默认是 0)。我的客户名单是这样的:
91110000MA0UXXXXXX 北京市鑫永俪金融服务有限责任公司 李华梅 13800138000
所以先需要一段 python 脚本去处理 excel
#!/usr/bin/env python3
import xlrd
import jieba
import sys
''' 输出 Excel 中的中文公司名和法人名 '''
def get_chinese_words_from_excel(f):
book = xlrd.open_workbook(f)
sheet = book.sheet_by_index(0)
res = []
for i in range(sheet.nrows):
# 9 开头的是公司
if not sheet.cell_value(i, 0).startswith('9'):
continue
for j in range(sheet.ncols):
if j not in (1, 2):
continue
if len(sheet.cell_value(i, j).strip()) > 0:
print(sheet.cell_value(i, j).strip())
seg_list = jieba.cut(sheet.cell_value(i, j).strip())
for s in seg_list:
if s not in res:
print(s)
res.append(s)
return res
if len(sys.argv) > 1:
get_chinese_words_from_excel(sys.argv[1])
这样就得到了:
北京市鑫永俪金融服务有限责任公司
北京
北京市
鑫
永
俪
金融
服务
金融服务
有限
责任
公司
有限责任
有限责任公司
李华梅
李
华梅
这里有一个问题,它发现组不了词的(往往是我要的),会返回单字。
于是进一步处理,把长度小于 2 的,与上一行拼接,同时生成拼音:
#!/usr/bin/env python3
from pypinyin import lazy_pinyin
arr = []
with open('text.txt', 'r') as f:
last_line = ''
for line in f.readlines():
if len(line.strip()) > 2:
last_line = line.strip()
else:
line = last_line + line.strip()
last_line = line
if line.strip() not in arr:
arr.append(line.strip())
str = ''
for a in arr:
str += a + '\t\' + "'".join(lazy_pinyin(a)) + '\t0\n'
f1 = open('dict.txt', 'w')
f1.write(str)
f1.close()
然后再使用:
/usr/bin/libime_pinyindict dict.txt company.dict
mkdir -p ~/.local/share/fcitx5/pinyin/dictionaries
cp -r company.dict ~/.local/share/fcitx5/pinyin/dictionaries
重启 fcitx5 生效。
总结一下,openSUSE 下面制作 fcitx5 词库还是比较简单的,第一步分词,第二步添加拼音和词频。我第二步的脚本是可以通用的,只需要把那个 text.txt 处理好就可以。而我的 text.txt 的处理方式比较特殊,因为我是从 excel 文件来的。后续我做行业词库的时候还改脚本把 word 文档喂给了它。如果想要自制词库,需要处理好语料的获取。分词方面,我用的是 jieba, 准确率不算很高,你也可以试试 pkuseg, 这两个包在 openSUSE 下面都是有的。