庖丁(Paoding)分词的词典原理解析
Paoding分词过程中词典是相关重要的一环,其特性主要有:
(1)多词典支持,词典功能区分;
(2)词典加载入内存使用,使用预加载和Lazy Mode模式;
(3)根据分词模式,对词典进行二次编译;
(4)词典变更侦测,当词典文件发生变化时,可以重新加载词典。
1.1 词典类型
庖丁中有多种词典,每一种词典在分词过程中都不有同的意义。主要的词典及其功能如下:
(1)VocabularyDictionary:分词主要的词典,最后构建索引的索引项(term\dictionary);
(2)ConfucianFamilyNamesDictionary:中文姓氏词典,用于识别特殊词;
(3)NoiseCharactorsDictionary:停止单字词典,该词典中的词不用于构建索引项;
(4)NoiseWordsDictionary:停止词语词典,该词典中的词不用于构建索引项;
(5)UnitsDictionary:计量单位词典,该词典中的词主要是一些计量单位。
paoding将多个词典进行组合进行使用。
1.2 词典加载流程
1) PaodingAnalyzer初始化时需要构建Paoding对象;
2) 先由PaodingMaker的readUnCompiledDictionaries调用FileDictionaries;
3) 获取各种属性和词典编译类;
4) 读取未编译词典属性、编译词典(FileDictionaries的一些方法中才真正的加载了词项、CompiledFileDictionaries中调用读取词项);
5) 使用编译后的词典;
6) 为词典设置变更监听器。
1.3 词典文件格式
词典文本一般为纯文本格式,notepad将文件保存为unitcode或utf-8时会在文件开头保存bom字符串,notepad根据是否有bom来识别该文件是否是utf-8编码存储的(详情参见 ref:http://www.w3.org/International/questions/qa-utf8-bom)。而庖丁字典需要将这个字符从词典中去掉。
词典内格式是一行一个词。
1.4 读取词典文件
如果需要编译,那么读取词典文件是在词典编译前进行。如果不需要编译,则先不加载。
FileDictionaries的一些方法中才真正的加载了词项、CompiledFileDictionaries中调用读取词项。
词典文件读取采用了Lazy Mode,即需要的时候再加载。
1.5 词典编译
(1)根据系统参数配置,调用相应的词典编译类,共有两种一种是MostWordsModeDictionariesCompiler类,即最大词量分词方式,另一种是SortingDictionariesCompiler这个是按词的字顺编译的方式;
(2)判断(vocabularyDictionary)词典是否应该编译:检查文件夹中是否在这个文件:.compiled/xxx/.metadata,从中读取词典的元数据,如果编译类、摘要、版本相同,说明经过了编译,则不需要编译;其他情况都需要编译。
(3)最小切分分词词典编译:将词典中的每一个词当作一个可以被分词的字符串,如果该词还可以继续被完全分解为多个词,那么编译后不记录该词。程序分词某个词后将其首尾位置之间的位置都置为true,如果一个词的所有位置都为true那么说明该词能再被完全分解为多词,否则可作为独立词。
(4)SortingDictionariesCompiler其实就是按词在词典中的原序来进行编译,基本不再做其他处理。
(5)readCompliedDictionaries方法返回庖丁中的编译后的多种词典集合。
1.6 词典变更侦测
(1)变更侦测原理
在创建Paoding时初始化Dictionaries,然后启动Detector利用线程驻守,定期去检测;每一个字典都有一个快照,记录下当前快照,检测时将最新快照与当前快照比对,如果发现不同,那么说明有更新,则触发变更监听DiffListener。更新有三种情况:修改、删除、添加。发现更新后,监听器刷新词典,然后重新为各个Knife设置词典。
(2)快照原理
快照主要记录了如下信息:
// 此次快照版本,使用时间表示
private long version;
// 根地址,绝对地址,使用/作为目录分隔符
private String root;
// String为相对根的地址,使用/作为目录分隔符
private Map/*<String, InnerNode>*/ nodesMap = new HashMap/*<String, InnerNode>*/();
//内部节点
private InnerNode[] nodes;
//checksum of this snapshot
private String checksum;
快照刷新方法:获取当前时间作为version,根路径作为root,内部所有的文件作为nodes,然后<相对根的地址,node>作为nodesMap;
快照摘要:采用lazy mode获取快照摘要;
快照对比原理:对比version\root和新增、修改、删除的词典文件(而不是词典中的词)。
庖丁(Paoding)分词的词典原理解析相关推荐
- 【NLP】Doc2vec原理解析及代码实践
本文概览: 1. 句子向量简介 Word2Vec提供了高质量的词向量,并在一些任务中表现良好.虽然Word2Vec提供了高质量的词汇向量,但是仍然没有有效的方法将它们结合成一个高质量的文档向量.对于一 ...
- 6、HIVE JDBC开发、UDF、体系结构、Thrift服务器、Driver、元数据库Metastore、数据库连接模式、单/多用户模式、远程服务模式、Hive技术原理解析、优化等(整理的笔记)
目录: 5 HIVE开发 5.1 Hive JDBC开发 5.2 Hive UDF 6 Hive的体系结构 6.2 Thrift服务器 6.3 Driver 6.4 元数据库Metastore 6.5 ...
- LDA主题模型原理解析与python实现
本文转自:LDA主题模型原理解析与python实现_wind_blast的博客-CSDN博客 python实现: #-*- coding:utf-8 -*- import logging impo ...
- Elasticsearch大数据量写入调优和原理解析
前言 千万.亿级别数据批量写入ES的调优和原理解析 Elasticsearch version (bin/elasticsearch --version): 7.8 Plugins installed ...
- Android版中文分词器:原理、接入和启动优化
Android版中文分词器:原理.接入和启动优化 结巴分词的原理 接入方式 启动速度优化 中文分词功能是一项常用的基础功能,有很多开源的工程实现,目前能应用于Android手机端的中文分词器没有很完善 ...
- 人工智能大模型多场景应用原理解析
前言 在上篇文章<人工智能大模型之ChatGPT原理解析>中分享了一些大模型之ChatGPT的核心原理后,收到大量读者的反馈,诸如:在了解了核心原理后想进一步了解未来的发展趋势(比如生成式 ...
- Spark Shuffle原理解析
Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...
- 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)
2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六) 中, 介绍了 ...
- Tomcat 架构原理解析到架构设计借鉴
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这 ...
最新文章
- java运行时_java编译时与运行时概念与实例详解
- File类的使用(java)
- CSS深入理解学习笔记之z-index
- pyqt5讲解5:窗口绘图类控件QPainter,QPen,QBrush,QPixmap
- (*长期更新)软考网络工程师学习笔记——Section 9 应用层
- P4213-[模板]杜教筛(Sum)
- 485转换器产品功能特点及技术参数介绍
- 苹果的倔强!今秋新iPhone外观设计将与2018年款非常相似
- MATLAB设置坐标轴的位置及方向
- 网页制作中点一张图片变成图片浏览式_如何建设响应式网站?
- 模拟电子技术动画-PN结(动画是转的)内容再修改
- shell脚本下的教你如果运用for,while,unti循环,以及区别l
- 最大公约数简便算法_三种求最大公约数的方法
- Fast-Paced Multiplayer (Part I): Introduction
- 实现微博批量取消关注用户
- 微信小程序 - 搜索历史记录功能(纯前端)
- 神经网络模型(TensorFlow)
- php毕业论文致谢,zpw2000毕业论文致谢(本科毕业论文致谢词范文)
- 折叠共源共栅放大器(一)项目报告/实验/论文/比赛
- 五脏六腑等最喜欢的食物