词库加载模块的源码:
Java开源分词系统IKAnalyzer学习(四) 词库加载源代码——Dictionary类
Java开源分词系统IKAnalyzer学习(五) 词库加载源代码——DictSegmenty类
Java开源分词系统IKAnalyzer学习(六) 词库加载源代码——Hit类
首先这个词典管理类Dictionary类采用的设计模式是单立模式,实现的代码:
- /*
- * 词典单子实例
- */
- private static final Dictionary singleton;
- /*
- * 词典初始化
- */
- static{
- singleton = new Dictionary();
- }
- private Dictionary(){
- //初始化系统词典
- loadMainDict();
- loadSurnameDict();
- loadQuantifierDict();
- loadSuffixDict();
- loadPrepDict();
- loadStopWordDict();
- }
- /**
- * 词典初始化
- * 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化
- * 只有当Dictionary类被实际调用时,才会开始载入词典,
- * 这将延长首次分词操作的时间
- * 该方法提供了一个在应用加载阶段就初始化字典的手段
- * 用来缩短首次分词时的时延
- * @return Dictionary
- */
- public static Dictionary getInstance(){
- return Dictionary.singleton;
- }
词库加载的关键代码,这里以主词典为例,其他大同小异
- /**
- * 加载主词典及扩展词典
- */
- private void loadMainDict(){
- //建立一个主词典实例
- _MainDict = new DictSegment((char)0);
- //读取主词典文件
- InputStream is = Dictionary.class.getResourceAsStream(Dictionary.PATH_DIC_MAIN);
- if(is == null){
- throw new RuntimeException("Main Dictionary not found!!!");
- }
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);
- String theWord = null;
- do {
- theWord = br.readLine();
- //假如还没有读到文件尾
- if (theWord != null && !"".equals(theWord.trim())) {
- _MainDict.fillSegment(theWord.trim().toCharArray());
- }
- } while (theWord != null);
- } catch (IOException ioe) {
- System.err.println("Main Dictionary loading exception.");
- ioe.printStackTrace();
- }finally{
- try {
- if(is != null){
- is.close();
- is = null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
底层的字典存储代码
- /**
- * 加载填充词典片段
- * @param charArray
- */
- public void fillSegment(char[] charArray){
- this.fillSegment(charArray, 0 , charArray.length);
- }
- /**
- * 加载填充词典片段
- * @param charArray
- * @param begin
- * @param length
- */
- public synchronized void fillSegment(char[] charArray , int begin , int length){
- //获取字典表中的汉字对象
- Character beginChar = new Character(charArray[begin]);
- Character keyChar = charMap.get(beginChar);
- //字典中没有该字,则将其添加入字典
- if(keyChar == null){
- charMap.put(beginChar, beginChar);
- keyChar = beginChar;
- }
- //搜索当前节点的存储,查询对应keyChar的keyChar,如果没有则创建(这段代码没看明白)
- DictSegment ds = lookforSegment(keyChar);
- //处理keyChar对应的segment
- if(length > 1){
- //词元还没有完全加入词典树
- ds.fillSegment(charArray, begin + 1, length - 1);
- }else if (length == 1){
- //已经是词元的最后一个char,设置当前节点状态为1,表明一个完整的词
- ds.nodeState = 1;
- }
- }
- /**
- * 查找本节点下对应的keyChar的segment
- * 如果没有找到,则创建新的segment
- * @param keyChar
- * @return
- */
- private DictSegment lookforSegment(Character keyChar){
- DictSegment ds = null;
- if(this.storeSize <= ARRAY_LENGTH_LIMIT){
- //获取数组容器,如果数组未创建则创建数组
- DictSegment[] segmentArray = getChildrenArray();
- //搜寻数组
- for(DictSegment segment : segmentArray){
- if(segment != null && segment.nodeChar.equals(keyChar)){
- //在数组中找到与keyChar对应的segment
- ds = segment;
- break;
- }
- }
- //遍历数组后没有找到对应的segment
- if(ds == null){
- //构造新的segment
- ds = new DictSegment(keyChar);
- if(this.storeSize < ARRAY_LENGTH_LIMIT){
- //数组容量未满,使用数组存储
- segmentArray[this.storeSize] = ds;
- //segment数目+1
- this.storeSize++;
- }else{
- //数组容量已满,切换Map存储
- //获取Map容器,如果Map未创建,则创建Map
- Map<Character , DictSegment> segmentMap = getChildrenMap();
- //将数组中的segment迁移到Map中
- migrate(segmentArray , segmentMap);
- //存储新的segment
- segmentMap.put(keyChar, ds);
- //segment数目+1 , 必须在释放数组前执行storeSize++ , 确保极端情况下,不会取到空的数组
- this.storeSize++;
- //释放当前的数组引用
- this.childrenArray = null;
- }
- }
- }else{
- //获取Map容器,如果Map未创建,则创建Map
- Map<Character , DictSegment> segmentMap = getChildrenMap();
- //搜索Map
- ds = (DictSegment)segmentMap.get(keyChar);
- if(ds == null){
- //构造新的segment
- ds = new DictSegment(keyChar);
- segmentMap.put(keyChar , ds);
- //当前节点存储segment数目+1
- this.storeSize ++;
- }
- }
- return ds;
- }
http://blog.csdn.net/lengyuhong/article/details/6010123
相关推荐
从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。 从 3.0 版本开始,IK 发展为面向 Java 的公用分词...
本篇将深入探讨如何基于IK Analyzer实现动态词库分词,并且在整个过程中无需重启服务,极大地提高了系统的灵活性和效率。 首先,我们需要了解什么是IK Analyzer。它是一个开源的、适用于Java平台的全文检索分析引擎...
Lucene是一个开源的全文搜索引擎库,IKAnalyzer是基于Lucene进行的中文分词扩展。在使用IKAnalyzer时,可以通过配置停用词表(如本压缩包中的`stopwords.txt`)来定制自己的停用词策略。将这个文件导入到IKAnalyzer...
ikanalyzer是一个开源的、基于Java实现的中文分词库,主要用于解决中文文本处理中的分词问题,对于搜索引擎和信息检索系统尤其重要。在Solr中,分词器是构建高效、精准全文检索的关键组件。 首先,ikanalyzer-solr...
IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索或信息提取等任务设计。它由尹力(Wu Li)在2006年发起,最初是为了改善Lucene的中文处理能力。自那时起,IK Analyzer已经发展成为一个广泛使用的...
IKAnalyzer是一款在IT领域广泛应用的开源中文分词工具,尤其在信息检索、搜索引擎以及自然语言处理等场景中扮演着重要角色。它由Java编写,具有轻量级、高效能的特点,为开发者提供了一种便捷的方式来处理中文文本...
标题中的“Solr java IKAnalyzer词库”指的是在Java环境下使用Apache Solr搜索引擎时,配合IKAnalyzer进行中文分词的实践。IKAnalyzer是一个开源的、基于Java实现的中文分词器,它针对Solr这样的全文检索框架优化,...
- 将IKAnalyzer2012FF_hf1.jar添加到Solr的lib目录下,确保Solr启动时能加载该分词库。 - 在Solr的schema.xml中配置分析器,指定使用IKAnalyzer,并可自定义参数,如是否开启动态扩展等。 3. **使用与优化**: -...
IKAnalyzer是专门为Java设计的中文分词器,它在处理中文文本时表现优秀,尤其适合于信息检索、数据挖掘等场景。在Solr中,IKAnalyzer扮演了核心角色,帮助我们对输入的中文文本进行精准的分词,从而提高搜索的准确性...
IKAnalyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索和搜索引擎提供高效、快速的分词服务。这款工具广泛应用于Lucene、Elasticsearch、Solr等全文检索框架,以提高中文处理的性能。在给定的标题和描述...
IKAnalyzer是一款开源的、基于Java实现的中文分词工具,它最初是为Lucene搜索引擎设计的,但随着时间的发展,已经逐渐成为一个独立的、可扩展的分词系统,能够很好地兼容高版本的Lucene。 首先,我们需要了解IK...
ik-analyzer是一款在Java环境下广泛使用的开源中文分词器,专为满足Java开发者在信息检索、文本分析等领域的需求而设计。这个资源是ik-analyzer的8.5.0版本,包含了一个名为"ik-analyzer-8.5.0-jar"的JAR文件,它是...
IKAnalyzer是一款开源的、基于Java语言的中文分词工具,主要应用于搜索引擎和文本分析领域。它是由北京大学信息科学技术学院自然语言处理实验室开发,旨在提供一个灵活、高效的中文分词解决方案。本教程将详细介绍...
Ik分词器,全称为“Intelligent Chinese Analyzer”,是一个开源的、高效且灵活的中文分词系统。它的设计目标是为各种应用场景提供服务,包括搜索引擎、信息检索、文本挖掘等。Ik分词器支持自定义词典,可以根据具体...
IKAnalyzer是一款广泛应用于Java环境中的开源中文分词器,它主要设计用于提高搜索引擎的性能,同时也适用于其他需要中文处理的领域。v3.2.0是该分词器的一个稳定版本,提供了良好的分词效果和较高的性能。在这个版本...
ikanalyzer是一款专门为Java语言设计的开源中文分词库,它基于Apache Lucene项目,针对中文进行了优化,能够有效地进行中文分词、词性标注等任务。在Solr中,ikanalyzer作为分词器插件,帮助处理中文文档,提高搜索...
IKAnalyzer2012是一款基于Java开发的开源中文分词工具,主要应用于信息检索、文本挖掘、搜索引擎等领域。这个压缩包包含的是IKAnalyzer2012的分词库及其使用说明,适合对中文文本进行高效的分词处理。下面将详细介绍...
IK分词器是Java实现的开源中文分词组件,尤其在Solr和Elasticsearch等全文检索系统中广泛使用。 分词器是自然语言处理中的重要工具,它将文本拆分成一系列独立的词语,为后续的文本分析和信息检索提供基础。IK分词...
IKAnalyzer是中国著名的开源中文分词库,专注于提供高效、易用的中文自然语言处理工具。在文本挖掘、信息检索、搜索引擎等领域,IKAnalyzer扮演着重要的角色。它支持自定义词典,可以灵活地应对各种场景下的分词需求...
IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为中文信息处理而设计。这个工具在处理中文文本时表现出色,尤其在Solr这样的搜索引擎中,它作为一个插件,提供了对中文词汇切分的强大支持。"2012FF_hf1.7z...