这篇文章主要介绍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
依赖Analyzer
的tokenStream
是final
方法,但是公式分词用到的tokenSteam
方法是抽象方法。两者冲突了,所以考虑去做兼容。
以上是“IKAnalyzer如何使用不同版本中文分词的切词方式实现相同功能效果”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。