`
m635674608
  • 浏览: 5042886 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java开源分词系统IKAnalyzer学习(七) 词库加载分词

 
阅读更多

 

词库加载模块的源码:

Java开源分词系统IKAnalyzer学习(四) 词库加载源代码——Dictionary类

Java开源分词系统IKAnalyzer学习(五) 词库加载源代码——DictSegmenty类

Java开源分词系统IKAnalyzer学习(六) 词库加载源代码——Hit类

 

首先这个词典管理类Dictionary类采用的设计模式是单立模式,实现的代码:

 

[c-sharp] view plaincopy
 
  1. /* 
  2.  * 词典单子实例 
  3.  */  
  4. private static final Dictionary singleton;  
  5.   
  6. /* 
  7.  * 词典初始化 
  8.  */  
  9. static{  
  10.     singleton = new Dictionary();  
  11. }  
  12. private Dictionary(){  
  13.     //初始化系统词典  
  14.     loadMainDict();  
  15.     loadSurnameDict();  
  16.     loadQuantifierDict();  
  17.     loadSuffixDict();  
  18.     loadPrepDict();  
  19.     loadStopWordDict();  
  20. }  
  21. /** 
  22.  * 词典初始化 
  23.  * 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化 
  24.  * 只有当Dictionary类被实际调用时,才会开始载入词典, 
  25.  * 这将延长首次分词操作的时间 
  26.  * 该方法提供了一个在应用加载阶段就初始化字典的手段 
  27.  * 用来缩短首次分词时的时延 
  28.  * @return Dictionary 
  29.  */  
  30. public static Dictionary getInstance(){  
  31.     return Dictionary.singleton;  
  32. }  

 

 

 

词库加载的关键代码,这里以主词典为例,其他大同小异

 

[c-sharp] view plaincopy
 
  1.     /** 
  2.      * 加载主词典及扩展词典 
  3.      */  
  4.     private void loadMainDict(){  
  5.         //建立一个主词典实例  
  6.         _MainDict = new DictSegment((char)0);  
  7.         //读取主词典文件  
  8.         InputStream is = Dictionary.class.getResourceAsStream(Dictionary.PATH_DIC_MAIN);  
  9.         if(is == null){  
  10.             throw new RuntimeException("Main Dictionary not found!!!");  
  11.         }  
  12.           
  13.         try {  
  14.               
  15.             BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);  
  16.             String theWord = null;  
  17.             do {  
  18.                 theWord = br.readLine();  
  19.                 //假如还没有读到文件尾  
  20.                 if (theWord != null && !"".equals(theWord.trim())) {  
  21.                     _MainDict.fillSegment(theWord.trim().toCharArray());  
  22.                 }  
  23.             } while (theWord != null);  
  24.               
  25.         } catch (IOException ioe) {  
  26.             System.err.println("Main Dictionary loading exception.");  
  27.             ioe.printStackTrace();  
  28.               
  29.         }finally{  
  30.             try {  
  31.                 if(is != null){  
  32.                     is.close();  
  33.                     is = null;  
  34.                 }  
  35.             } catch (IOException e) {  
  36.                 e.printStackTrace();  
  37.             }  
  38.         }  
  39. }  

 

 

 

底层的字典存储代码

 

[c-sharp] view plaincopy
 
  1. /** 
  2.  * 加载填充词典片段 
  3.  * @param charArray 
  4.  */  
  5. public void fillSegment(char[] charArray){  
  6.     this.fillSegment(charArray, 0 , charArray.length);   
  7. }  
  8.   
  9. /** 
  10.  * 加载填充词典片段 
  11.  * @param charArray 
  12.  * @param begin 
  13.  * @param length 
  14.  */  
  15. public synchronized void fillSegment(char[] charArray , int begin , int length){  
  16.     //获取字典表中的汉字对象  
  17.     Character beginChar = new Character(charArray[begin]);  
  18.     Character keyChar = charMap.get(beginChar);  
  19.     //字典中没有该字,则将其添加入字典  
  20.     if(keyChar == null){  
  21.         charMap.put(beginChar, beginChar);  
  22.         keyChar = beginChar;  
  23.     }  
  24.       
  25.     //搜索当前节点的存储,查询对应keyChar的keyChar,如果没有则创建(这段代码没看明白)  
  26.     DictSegment ds = lookforSegment(keyChar);  
  27.     //处理keyChar对应的segment  
  28.     if(length > 1){  
  29.         //词元还没有完全加入词典树  
  30.         ds.fillSegment(charArray, begin + 1, length - 1);  
  31.     }else if (length == 1){  
  32.         //已经是词元的最后一个char,设置当前节点状态为1,表明一个完整的词  
  33.         ds.nodeState = 1;  
  34.     }  
  35. }  
  36.   
  37. /** 
  38.  * 查找本节点下对应的keyChar的segment 
  39.  * 如果没有找到,则创建新的segment 
  40.  * @param keyChar 
  41.  * @return 
  42.  */  
  43. private DictSegment lookforSegment(Character keyChar){  
  44.       
  45.     DictSegment ds = null;  
  46.     if(this.storeSize <= ARRAY_LENGTH_LIMIT){  
  47.         //获取数组容器,如果数组未创建则创建数组  
  48.         DictSegment[] segmentArray = getChildrenArray();              
  49.         //搜寻数组  
  50.         for(DictSegment segment : segmentArray){  
  51.             if(segment != null && segment.nodeChar.equals(keyChar)){  
  52.                 //在数组中找到与keyChar对应的segment  
  53.                 ds =  segment;  
  54.                 break;  
  55.             }  
  56.         }             
  57.         //遍历数组后没有找到对应的segment  
  58.         if(ds == null){  
  59.             //构造新的segment  
  60.             ds = new DictSegment(keyChar);                
  61.             if(this.storeSize < ARRAY_LENGTH_LIMIT){  
  62.                 //数组容量未满,使用数组存储  
  63.                 segmentArray[this.storeSize] = ds;  
  64.                 //segment数目+1  
  65.                 this.storeSize++;  
  66.             }else{  
  67.                 //数组容量已满,切换Map存储  
  68.                 //获取Map容器,如果Map未创建,则创建Map  
  69.                 Map<Character , DictSegment> segmentMap = getChildrenMap();  
  70.                 //将数组中的segment迁移到Map中  
  71.                 migrate(segmentArray ,  segmentMap);  
  72.                 //存储新的segment  
  73.                 segmentMap.put(keyChar, ds);  
  74.                 //segment数目+1 ,  必须在释放数组前执行storeSize++ , 确保极端情况下,不会取到空的数组  
  75.                 this.storeSize++;  
  76.                 //释放当前的数组引用  
  77.                 this.childrenArray = null;  
  78.             }  
  79.         }             
  80.           
  81.     }else{  
  82.         //获取Map容器,如果Map未创建,则创建Map  
  83.         Map<Character , DictSegment> segmentMap = getChildrenMap();  
  84.         //搜索Map  
  85.         ds = (DictSegment)segmentMap.get(keyChar);  
  86.         if(ds == null){  
  87.             //构造新的segment  
  88.             ds = new DictSegment(keyChar);  
  89.             segmentMap.put(keyChar , ds);  
  90.             //当前节点存储segment数目+1  
  91.             this.storeSize ++;  
  92.         }  
  93.     }  
  94.     return ds;  
  95. }  

 

 http://blog.csdn.net/lengyuhong/article/details/6010123

分享到:
评论

相关推荐

    使用IK Analyzer实现中文分词之Java实现

    从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。 从 3.0 版本开始,IK 发展为面向 Java 的公用分词...

    基于ik动态词库分词实现--无需重启服务

    本篇将深入探讨如何基于IK Analyzer实现动态词库分词,并且在整个过程中无需重启服务,极大地提高了系统的灵活性和效率。 首先,我们需要了解什么是IK Analyzer。它是一个开源的、适用于Java平台的全文检索分析引擎...

    IKanalyzer约2000个常用停止词库

    Lucene是一个开源的全文搜索引擎库,IKAnalyzer是基于Lucene进行的中文分词扩展。在使用IKAnalyzer时,可以通过配置停用词表(如本压缩包中的`stopwords.txt`)来定制自己的停用词策略。将这个文件导入到IKAnalyzer...

    分词器 ikanalyzer-solr6.5

    ikanalyzer是一个开源的、基于Java实现的中文分词库,主要用于解决中文文本处理中的分词问题,对于搜索引擎和信息检索系统尤其重要。在Solr中,分词器是构建高效、精准全文检索的关键组件。 首先,ikanalyzer-solr...

    IK Analyzer 中文分词器下载

    IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索或信息提取等任务设计。它由尹力(Wu Li)在2006年发起,最初是为了改善Lucene的中文处理能力。自那时起,IK Analyzer已经发展成为一个广泛使用的...

    中文分词库IKAnalyzer

    IKAnalyzer是一款在IT领域广泛应用的开源中文分词工具,尤其在信息检索、搜索引擎以及自然语言处理等场景中扮演着重要角色。它由Java编写,具有轻量级、高效能的特点,为开发者提供了一种便捷的方式来处理中文文本...

    Solr java IKAnalyzer词库

    标题中的“Solr java IKAnalyzer词库”指的是在Java环境下使用Apache Solr搜索引擎时,配合IKAnalyzer进行中文分词的实践。IKAnalyzer是一个开源的、基于Java实现的中文分词器,它针对Solr这样的全文检索框架优化,...

    solr分词 IKAnalyzer2012FF_hf1.rar

    - 将IKAnalyzer2012FF_hf1.jar添加到Solr的lib目录下,确保Solr启动时能加载该分词库。 - 在Solr的schema.xml中配置分析器,指定使用IKAnalyzer,并可自定义参数,如是否开启动态扩展等。 3. **使用与优化**: -...

    solr 中文分词其IKAnalyzer 支持solr版本5.X-7.X

    IKAnalyzer是专门为Java设计的中文分词器,它在处理中文文本时表现优秀,尤其适合于信息检索、数据挖掘等场景。在Solr中,IKAnalyzer扮演了核心角色,帮助我们对输入的中文文本进行精准的分词,从而提高搜索的准确性...

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    IKAnalyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索和搜索引擎提供高效、快速的分词服务。这款工具广泛应用于Lucene、Elasticsearch、Solr等全文检索框架,以提高中文处理的性能。在给定的标题和描述...

    java单独整合ikanalyzer中文分词器提取关键字及动态拓展词库并兼容lucene高版本

    IKAnalyzer是一款开源的、基于Java实现的中文分词工具,它最初是为Lucene搜索引擎设计的,但随着时间的发展,已经逐渐成为一个独立的、可扩展的分词系统,能够很好地兼容高版本的Lucene。 首先,我们需要了解IK...

    ik-analyzer-8.5.0-jar

    ik-analyzer是一款在Java环境下广泛使用的开源中文分词器,专为满足Java开发者在信息检索、文本分析等领域的需求而设计。这个资源是ik-analyzer的8.5.0版本,包含了一个名为"ik-analyzer-8.5.0-jar"的JAR文件,它是...

    IKAnalyzer 实现分词 词频统计

    IKAnalyzer是一款开源的、基于Java语言的中文分词工具,主要应用于搜索引擎和文本分析领域。它是由北京大学信息科学技术学院自然语言处理实验室开发,旨在提供一个灵活、高效的中文分词解决方案。本教程将详细介绍...

    ik中文分词词库,包含不低于20万词

    Ik分词器,全称为“Intelligent Chinese Analyzer”,是一个开源的、高效且灵活的中文分词系统。它的设计目标是为各种应用场景提供服务,包括搜索引擎、信息检索、文本挖掘等。Ik分词器支持自定义词典,可以根据具体...

    IKAnalyzer中文分词器 v3.2.0 源码包

    IKAnalyzer是一款广泛应用于Java环境中的开源中文分词器,它主要设计用于提高搜索引擎的性能,同时也适用于其他需要中文处理的领域。v3.2.0是该分词器的一个稳定版本,提供了良好的分词效果和较高的性能。在这个版本...

    solr配置ikanalyzer分词文件以使用说明

    ikanalyzer是一款专门为Java语言设计的开源中文分词库,它基于Apache Lucene项目,针对中文进行了优化,能够有效地进行中文分词、词性标注等任务。在Solr中,ikanalyzer作为分词器插件,帮助处理中文文档,提高搜索...

    IKAnalyzer2012分词.zip

    IKAnalyzer2012是一款基于Java开发的开源中文分词工具,主要应用于信息检索、文本挖掘、搜索引擎等领域。这个压缩包包含的是IKAnalyzer2012的分词库及其使用说明,适合对中文文本进行高效的分词处理。下面将详细介绍...

    ik分词器ik-analyzer-5.3.0和ikanalyzer-solr6.5-2018

    IK分词器是Java实现的开源中文分词组件,尤其在Solr和Elasticsearch等全文检索系统中广泛使用。 分词器是自然语言处理中的重要工具,它将文本拆分成一系列独立的词语,为后续的文本分析和信息检索提供基础。IK分词...

    中文分词库 IKAnalyzer

    IKAnalyzer是中国著名的开源中文分词库,专注于提供高效、易用的中文自然语言处理工具。在文本挖掘、信息检索、搜索引擎等领域,IKAnalyzer扮演着重要的角色。它支持自定义词典,可以灵活地应对各种场景下的分词需求...

    IK Analyzer 2012FF_hf1.7z

    IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为中文信息处理而设计。这个工具在处理中文文本时表现出色,尤其在Solr这样的搜索引擎中,它作为一个插件,提供了对中文词汇切分的强大支持。"2012FF_hf1.7z...

Global site tag (gtag.js) - Google Analytics