IKAnalyzer结合Lucene实现中文分词(示例讲解)

 更新时间:2017年10月13日 09:03:51   作者:funnyboy0128  
下面小编就为大家带来一篇IKAnalyzer结合Lucene实现中文分词(示例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、基本介绍

随着分词在信息检索领域应用的越来越广泛,分词这门技术对大家并不陌生。对于英文分词处理相对简单,经过拆分单词、排斥停止词、提取词干的过程基本就能实现英文分词,单对于中文分词而言,由于语义的复杂导致分词并没英文分词那么简单,一般都是通过相关的分词工具来实现,目前比较常用的有庖丁分词以及IKAnalyzer等。这里我们主要通过一个简单的Demo聊聊IKAnalyzer的基本使用。IKAnalyzer是一个开源的,基于java开发的分词工具包,它独立于Lucene项目,同时提供了Lucene的默认实现。

2、IKAnalyzer结合Lucene实现简单的中文分词

我们通过一个基本的Demo来实践说明,步骤如下:

step1:准备相关的Jar依赖,lucene-core-5.1.0.jar、ik.jar,然后新建项目,引入相关依赖项目结构如下:

IkDemo-src
     -con.funnyboy.ik
-IKAnalyzer.cfg.xml
     -stopword.dic
-ext.dic
-Reference Libraries
     -lucene-core-5.1.0.jar
     -ik.jar

IKAnalyzer.cfg.xml:配置扩展词典以及停止词典 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> <comment>IK Analyzer 扩展配置</comment>
   <entry key="ext_dict">ext.dic;</entry>
   <entry key="ext_stopwords">stopword.dic;</entry>
</properties>

其中的ext.dic配置自己的扩展字典,stopword.dic配置自己的扩展停止词字典

step2:通过java代码验证测试

public class MyIkTest {
  public static String str = "中国人民银行我是中国人";
  public static void main(String[] args) { 
     MyIkTest test = new MyIkTest(); 
     test.wordCount("", str);
   }
   private void wordCount(String arg,String content) {
     Analyzer analyzer = new IKAnalyzer(true); // IK实现分词 true:用最大词长分词 false:最细粒度切分 
    StringReader reader = null; 
    TokenStream ts = null; try { 
      reader = new StringReader(content); 
      ts = analyzer.tokenStream(arg,reader); 
      CharTermAttribute term = ts.addAttribute(CharTermAttribute.class); 
      ts.reset(); 
      Map<String, Integer> map = new HashMap<String, Integer>(); //统计 
      while (ts.incrementToken()) { 
        String str = term.toString(); 
        Object o = map.get(str); 
        if (o == null) { 
          map.put(str, new Integer(1)); 
         } else { 
          Integer i = new Integer(((Integer) o).intValue() + 1); 
           map.put(str, i); 
        } 
       } 
      List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(map.entrySet()); 
      Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() { 
        public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2) { 
          return (o2.getValue() - o1.getValue()); 
        } });  
       for (int k=0;k<list.size();k++) { 
        Entry<String, Integer> it=list.get(k); 
        String word = it.getKey().toString(); 
        System.err.println(word+"["+it.getValue()+"]"); 
       }  
    } catch (Exception e) {
     } finally { 
      if(reader != null){ 
         reader.close(); 
      } 
      if (analyzer != null) { 
        analyzer.close(); 
      } 
     } 
   }
  }

执行程序测试结果如下:

中国人民银行[1]

中国人[1]

我[1]

3、配置说明

a、如何自定义配置扩展词典和停止词典 IKAnalyzer.cfg.xml中定义了扩展词典和停止词典,如果有多好个可以通过;配置多个。扩展词典是指用户可以根据自己定义的词义实现分词,比如人名在默认的词典中并未实现,需要自定义实现分词,卡可以通过在ext.dic中新增自定义的词语。停止词是指对于分词没有实际意义但出现频率很高的词,比如吗、乎等语气词,用户也可以通过在stopword.dic中自定义相关的停止词。

b、关于最大词长分词和最小粒度分词的区分 在IKAnalyzer构造方法中可以通过提供一个标示来实现最大词长分词和最小粒度分词,true为最大词长分词,默认是最小粒度分词。对"中国人民银行我是中国人"分别测试结果如下:

最大词长分词结果如下:

中国人民银行[1]

中国人[1]

我[1]

最小粒度分词结果如下:

国人[2]
中国人[2]
中国[2]
人民[1]
中国人民银行[1]
我[1]
人民银行[1]
中国人民[1]
银行[1]

以上这篇IKAnalyzer结合Lucene实现中文分词(示例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中常用的日期类图文详解

    Java中常用的日期类图文详解

    Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不是java.sql包下的Date类),Date对象既包含日期,也包含时间,下面这篇文章主要给大家介绍了关于Java中常用的日期类的相关资料,需要的朋友可以参考下
    2022-11-11
  • java获取昨天日期字符串的方法

    java获取昨天日期字符串的方法

    这篇文章主要介绍了java获取昨天日期字符串的方法,涉及java针对日期与时间的运算与转换等相关操作技巧,需要的朋友可以参考下
    2016-08-08
  • 在Spring MVC中使用@ControllerAdvice创建全局异常处理器的方法

    在Spring MVC中使用@ControllerAdvice创建全局异常处理器的方法

    在Spring MVC中,可以使用@ControllerAdvice或@RestControllerAdvice注解来定义全局异常处理器类,并使用 @ExceptionHandler注解来定义处理特定异常的方法,本文就给大家介绍了Spring MVC @ControllerAdvice创建处理器的方法,需要的朋友可以参考下
    2023-08-08
  • SpringCloud-Gateway网关的使用实例教程

    SpringCloud-Gateway网关的使用实例教程

    Gateway网关在微服务架构中扮演了不可或缺的角色,通过集中化管理、智能路由和强大的过滤器机制,为构建高效、可扩展的微服务系统提供了有力支持,这篇文章主要介绍了SpringCloud-Gateway网关的使用,需要的朋友可以参考下
    2024-03-03
  • Java国密加密SM2代码详细使用步骤

    Java国密加密SM2代码详细使用步骤

    SM2算法可以用较少的计算能力提供比RSA算法更高的安全强度,而所需的密钥长度却远比RSA算法低,下面这篇文章主要给大家介绍了关于Java国密加密SM2代码的相关资料,需要的朋友可以参考下
    2024-07-07
  • Java实现定时任务最简单的3种方法

    Java实现定时任务最简单的3种方法

    几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损,下面这篇文章主要给大家介绍了关于Java实现定时任务最简单的3种方法,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 初识Java一些常见的数据类型

    初识Java一些常见的数据类型

    这篇文章主要介绍Java一些常见的数据类型,Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义,下面文章小编就来简单介绍为什么说Java是最好的语言并且介绍它的各种常见类型,需要的朋友可以参考一下
    2021-10-10
  • 编程语言榜单Java与Python并列第二!Julia下滑

    编程语言榜单Java与Python并列第二!Julia下滑

    日新月异的技术圈,随着云、大数据、人工智能等主流技术的广泛应用,作为开发利器的编程语言的最新发展趋势也在无形中发生了变化,本文主要介绍了java、Python、Julia等语言在Resmonk榜单的排名
    2021-08-08
  • 关于spring.factories失效原因分析及解决

    关于spring.factories失效原因分析及解决

    这篇文章主要介绍了关于spring.factories失效原因分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java并发编程之同步容器与并发容器详解

    Java并发编程之同步容器与并发容器详解

    今天给大家带来的文章是Java并发编程的相关知识,文中对java同步容器与并发容器做了非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论