IKAnalyzer使用不同版本中文分词的切词方式实现相同功能效果

 更新时间:2018年12月07日 15:07:17   作者:执笔记忆的空白  
今天小编就为大家分享一篇关于IKAnalyzer使用不同版本中文分词的切词方式实现相同功能效果,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

最近公司在做一个题库的功能,需要用到 中文分词和公式分词的工具,最开始用 IKAnalyzer 2012F 版本 + lunece 6.5.1做了一版中文分词工具。

具体如下:

一、IKAnalyzer 2012F + lunece 6.5.1 实现中文分词

 public static List<String> analysisByIK(Analyzer analyzer,String field, String content){
 if(StringUtils.isNullOrEmpty(content)){
  return null;
 }
 TokenStream ts = null;
 try {
  ts = analyzer.tokenStream(field, new StringReader(content));
  CharTermAttribute term = ts.addAttribute(CharTermAttribute.class);
  ts.reset(); 
  List<String> vocabularies = new ArrayList<>();
  while (ts.incrementToken()) {
  vocabularies.add(term.toString());
  }
  ts.end();
  return vocabularies;
 } catch (Exception e) {
  logger.error(e.getMessage(), e);
 } finally {
  if (ts != null) {
  try {
   ts.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }
 return null;
 }

调用方式:

 String str = "已知三角形ABC中,角A等于角B加角C,那么三角形ABC是 A、锐角三角形 B、直角三角形 C、钝角三角形 D、不能确定";
 Analyzer analyzer = new IKAnalyzer(true);
 ikList = analysisByIK(analyzer, "myfield", str);
 listAnalyzer.addAll(ikList);

输出结果listAnalyzerd

[已知, 三角形, abc, 中, 角, a, 等于, 角, b, 加, 角, c, 那么, 三角形, abc, 是, a, 锐角三角形, b, 直角三角形, c, 钝角三角形, d, 不能, 确定]

但是由于公式切词是 原来公司大牛写的,在满足公式切词的条件下,中文切词的IKAnalyzer 2012F与其不兼容。于是尝试其他版本,最终决定用 IKAnalyzer 3.2.8 实现了兼容。

二、IKAnalyzer 3.2.8 + lunece 3.1.0 兼容版本

 public static List<String> analysisByIK3Point2(Analyzer analyzer,String field, String content) throws Exception{
 if(StringUtils.isNullOrEmpty(content)){
  return null;
 }
 List<String> list = new ArrayList<>();
 Reader reader = new StringReader(content);
    TokenStream stream = (TokenStream)analyzer.tokenStream(field, reader);
    //添加工具类 注意:以下这些与之前lucene2.x版本不同的地方
    TermAttribute termAtt = (TermAttribute)stream.addAttribute(TermAttribute.class);
    OffsetAttribute offAtt = (OffsetAttribute)stream.addAttribute(OffsetAttribute.class);
    // 循环打印出分词的结果,及分词出现的位置
    while(stream.incrementToken()){
     list.add(termAtt.term());
//       System.out.println(termAtt.term());
    }
 return list;
 }

调用方式:

 String str = "已知三角形ABC中,角A等于角B加角C,那么三角形ABC是 A、锐角三角形 B、直角三角形 C、钝角三角形 D、不能确定";
 Analyzer analyzer = new IKAnalyzer(true);
 ikList = analysisByIK3Point2(analyzer, "myfield", str);
 listAnalyzer.addAll(ikList);

输出结果:

[已知, 三角形, abc, 中, 角, a, 等于, 角, b, 加, 角, c, 那么, 三角形, abc, 是, a, 锐角三角形, b, 直角三角形, c, 钝角三角形, d, 不能, 确定]

即使用不同版本实现相同功能效果。 主要是 因为IKAnalyzer 2012F 依赖AnalyzertokenStreamfinal方法,但是公式分词用到的tokenSteam方法是抽象方法。两者冲突了,所以考虑去做兼容。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • spring 集成 mybatis的实例详解

    spring 集成 mybatis的实例详解

    这篇文章主要介绍了spring 集成 mybatis的实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • servlet实现文件上传与下载功能

    servlet实现文件上传与下载功能

    这篇文章主要为大家详细介绍了servlet实现文件上传与下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Java EasyExcel利用填充模版动态生成多个sheet页

    Java EasyExcel利用填充模版动态生成多个sheet页

    这篇文章主要为大家详细介绍了Java EasyExcel如何利用填充模版动态生成多个sheet页,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • springboot自定义异常视图过程解析

    springboot自定义异常视图过程解析

    这篇文章主要介绍了springboot自定义异常视图过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java学习教程之常量折叠详解

    java学习教程之常量折叠详解

    这篇文章主要给大家介绍了关于java学习教程之常量折叠的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Spring Cloud Loadbalancer服务均衡负载器详解

    Spring Cloud Loadbalancer服务均衡负载器详解

    这篇文章主要介绍了Spring Cloud Loadbalancer服务均衡负载器,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 详解Java如何优雅地书写if-else

    详解Java如何优雅地书写if-else

    在日常开发中我们常常遇到有多个if else的情况,之间书写显得代码冗余难看,对于追求更高质量代码的同学,就会思考如何优雅地处理这种代码。本文我们就来探讨下几种优化if else的方法
    2022-08-08
  • 喜大普奔IntelliJ IDEA 可以使用中文了

    喜大普奔IntelliJ IDEA 可以使用中文了

    IntelliJ Idea最大的亮点开始支持中文,很多英语不好的童鞋有福了,今天通过本文给大家分享如何开启中文汉化,通过图文步骤给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-05-05
  • Java 栈与队列实战真题训练

    Java 栈与队列实战真题训练

    在编写程序的时候,对于栈与队列的应用需要熟练的掌握,这样才能够确保写出来的代码有质量。本文小编就以几个题目详细说说Java中的栈与队列,需要的朋友可以参考一下
    2022-04-04
  • 基于rocketmq的有序消费模式和并发消费模式的区别说明

    基于rocketmq的有序消费模式和并发消费模式的区别说明

    这篇文章主要介绍了基于rocketmq的有序消费模式和并发消费模式的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论