输入法词库解析(四)百度分类词库.bdict(.bcd)
前言
.bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载。
手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.baidu.com/web/iw/index/ 下载。
解析
| 范围 | 描述 |
|---|---|
| 0x70 - 0x73 | 词条数 |
| 0x90 - 0xCF | 词库名 |
| 0xD0 - 0x10F | 词库作者 |
| 0x110 - 0x14F | 示例词 |
| 0x150 - 0x34F | 词库描述 |
有的词库在 0x250 开始的后 4 个字节是大端序的词条数。
码表偏移 0x350
词库不带拼音表,需要根据词库规纳出来,参考深蓝词库转换。
内部根据是否含有英文分为几种格式
格式一
纯中文
| # | 占用字节数 | 描述 |
|---|---|---|
| a | 2 | 拼音长,词长 |
| 2 | 词频 | |
| a*2 | 拼音,(声母索引<24+韵母索引<33) | |
| a*2 | 词,utf-16le 编码 |
带英文的,结构差不多,声母索引为 0xFF 表示英文字母
格式二:纯英文
编码使用 ascii
| # | 占用字节数 | 描述 |
|---|---|---|
| a | 2 | 词长 |
| 2 | 词频 | |
| a | 词,ascii 编码 |
格式三:编码和词不等长
拼音不再使用索引,而是直接使用 utf-16le 编码
| # | 占用字节数 | 描述 |
|---|---|---|
| a | 2 | 编码数 |
| 2 | 词频 | |
| 2 | 空 | |
| b | 2 | 词长 |
| a*2 | 编码,utf-16le | |
| b*2 | 词,utf-16le |
代码实现:
var bdictSm = []string{
"c", "d", "b", "f", "g", "h", "ch", "j", "k", "l", "m", "n",
"", "p", "q", "r", "s", "t", "sh", "zh", "w", "x", "y", "z",
}
var bdictYm = []string{
"uang", "iang", "iong", "ang", "eng", "ian", "iao", "ing", "ong",
"uai", "uan", "ai", "an", "ao", "ei", "en", "er", "ua", "ie", "in", "iu",
"ou", "ia", "ue", "ui", "un", "uo", "a", "e", "i", "o", "u", "v",
}
func (BaiduBdict) Parse(filename string) Dict {
data, _ := os.ReadFile(filename)
r := bytes.NewReader(data)
ret := make(Dict, 0, r.Len()>>8)
var tmp []byte
r.Seek(0x350, 0)
for r.Len() > 4 {
// 拼音长
pyLen := ReadUint16(r)
// 词频
freq := ReadUint16(r)
// 判断下两个字节
tmp = make([]byte, 2)
r.Read(tmp)
// 编码和词不等长,全按 utf-16le
if tmp[0] == 0 && tmp[1] == 0 {
wordLen := ReadUint16(r)
// 读编码
tmp = make([]byte, pyLen*2)
r.Read(tmp)
code, _ := util.Decode(tmp, "UTF-16LE")
// 读词
tmp = make([]byte, wordLen*2)
r.Read(tmp)
word, _ := util.Decode(tmp, "UTF-16LE")
ret = append(ret, Entry{
Word: word,
Pinyin: []string{code},
Freq: freq,
})
continue
}
// 全英文的词,编码和词是一样的
if int(tmp[0]) >= len(bdictSm) && tmp[0] != 0xff {
r.Seek(-2, 1)
eng := make([]byte, pyLen)
r.Read(eng)
ret = append(ret, Entry{
Word: string(eng),
Pinyin: []string{string(eng)},
Freq: freq,
})
continue
}
// 一般格式
r.Seek(-2, 1)
pinyin := make([]string, 0, pyLen)
for i := 0; i < pyLen; i++ {
smIdx, _ := r.ReadByte()
ymIdx, _ := r.ReadByte()
// 带英文的词组
if smIdx == 0xff {
pinyin = append(pinyin, string(ymIdx))
continue
}
pinyin = append(pinyin, bdictSm[smIdx]+bdictYm[ymIdx])
}
// 读词
tmp = make([]byte, pyLen*2)
r.Read(tmp)
word, _ := util.Decode(tmp, "UTF-16LE")
ret = append(ret, Entry{
Word: word,
Pinyin: pinyin,
Freq: freq,
})
}
return ret
}
参考资料:
输入法词库解析(四)百度分类词库.bdict(.bcd)的更多相关文章
- 系列篇|编译可在Android上运行的依赖库(一):glib库
前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...
- 输入法词库解析(六)QQ 拼音分类词库.qpyd
详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...
- 输入法词库解析(三)紫光拼音词库.uwl
详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...
- 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)
详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...
- 【中文同义词近义词】词向量 vs 同义词近义词库
方案一:利用预训练好的词向量模型 优点: (1)能把词进行语义上的向量化(2)能得到词与词的相似度 缺点: (1)词向量的效果和语料库的大小和质量有较大的关系(2)用most_similar() 得到 ...
- python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库 -转载
转载请注明出处 “结巴”中文分词:做最好的 Python 中文分词组件,分词模块jieba,它是python比较好用的分词模块, 支持中文简体,繁体分词,还支持自定义词库. jieba的分词,提取关 ...
- 网络系列之 jsonp 百度联想词
jsonp 可以跨域,ajax 不可以,ajax 会受到浏览器的同源策略影响,何为同源策略? 同源策略就是,如果 A 网站 想拿 B网站里的资源, 那么 有三个条件, 你得满足才能拿. 第一个:域名相 ...
- 百度敏感词过滤(tp)
百度智能云网址https://cloud.baidu.com/ 1:打开网址->管理控制台->产品服务->SDK下载>内容审核->phpSDK 2:下载至php目录ser ...
- GPS部标平台的架构设计(四)-百度地图设计
部标GPS软件平台之百度地图设计 地图是客户端中不可缺少的一个模块,很多人在设计和画图时候,喜欢加上地图引擎这样高大上的字眼,显得自己的平台有内涵,说白了就是用第三方的SDK来开发,早期的GPS监 控 ...
随机推荐
- Docker Buildx使用教程:使用Buildx构建多平台镜像
写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...
- antd vue 折叠面板 v-for 循环点击无效
问题描述 实现一个折叠面板点击展开,但是必须点击两次才能展开,第一次无效 <a-collapse-panel v-for="(item, index) in dataMap" ...
- NLM5系列中继采集仪的常见问题
NLM5系列中继采集采发仪常见问题 1.UART 通讯问题使用 UART 接口时一定要确认收发双方的通讯参数完全一致,包括通讯速率.数据位.校验位.停止位参数.NLM 在上电时会主动输出设备基本信息, ...
- mybatis-拦截器实际应用-替换表名-2022新项目
一.业务场景 考虑到新项目中部分与业务数据相关的表在后期数据量会比较大,架构师在最开始设计项目中与业务数据相关的表时,就已经考虑使用分表来 进行处理,给业务数据相关的每张表都添加统一批次的后缀,查询这 ...
- 【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进
用一句话来总结这种改进就是: 支持唯一性约束和索引将null值视为相同的值.之前是将null值索引成不同的值,现在可以通过使用unique nulls not distinct创建约束,将null值视 ...
- 【我的面试-01】Web前端开发实习岗-面试题总结
简单开头 首先技术面试官会根据简历里所写的项目和个人掌握技术栈提问(我不知道已经改过多少次简历了,因为前期投简历是真的是沉在茫茫大海,捞漂流瓶都捞不到的那种) 我的技术栈:(Vue还在苦苦的自学当中, ...
- 平衡树——splay 三
前文链接: 平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) 平衡树--splay 二 - yi_fan0305 - 博客园 (cnblogs.com) 再补 ...
- SkiaSharp 之 WPF 自绘 拖曳小球(案例版)
感谢各位大佬和粉丝的厚爱和关心( 催更),我会再接再厉的,其实这也是督促自己的一种方式,非常感谢. 刚写了一篇万字长文,自己也休养生息(低调发育)了一段时间,接下来来几个小案例. 拖曳小球 WPF的拖 ...
- 丽泽普及2022交流赛day16 社论
这场比较平凡吧 . 省流: http://zhengruioi.com/contest/1087 目录 目录 A. Gene 题面 题解 算法一(正解) 算法二 B. Fight 题面 题解 算法一( ...
- 2536-springsecurity系列--关于session管理1
版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...