IKAnalyzer使用不同版本中文分词的切词方式实现相同功能效果
最近公司在做一个题库的功能,需要用到中文分词和公式分词的工具,最开始用IKAnalyzer2012F版本+lunece6.5.1做了一版中文分词工具。
具体如下:
一、IKAnalyzer2012F+lunece6.5.1实现中文分词
publicstaticListanalysisByIK(Analyzeranalyzer,Stringfield,Stringcontent){ if(StringUtils.isNullOrEmpty(content)){ returnnull; } TokenStreamts=null; try{ ts=analyzer.tokenStream(field,newStringReader(content)); CharTermAttributeterm=ts.addAttribute(CharTermAttribute.class); ts.reset(); List vocabularies=newArrayList<>(); while(ts.incrementToken()){ vocabularies.add(term.toString()); } ts.end(); returnvocabularies; }catch(Exceptione){ logger.error(e.getMessage(),e); }finally{ if(ts!=null){ try{ ts.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnnull; }
调用方式:
Stringstr="已知三角形ABC中,角A等于角B加角C,那么三角形ABC是A、锐角三角形B、直角三角形C、钝角三角形D、不能确定"; Analyzeranalyzer=newIKAnalyzer(true); ikList=analysisByIK(analyzer,"myfield",str); listAnalyzer.addAll(ikList);
输出结果listAnalyzerd:
[已知,三角形,abc,中,角,a,等于,角,b,加,角,c,那么,三角形,abc,是,a,锐角三角形,b,直角三角形,c,钝角三角形,d,不能,确定]
但是由于公式切词是原来公司大牛写的,在满足公式切词的条件下,中文切词的IKAnalyzer2012F与其不兼容。于是尝试其他版本,最终决定用IKAnalyzer3.2.8实现了兼容。
二、IKAnalyzer3.2.8+lunece3.1.0兼容版本
publicstaticListanalysisByIK3Point2(Analyzeranalyzer,Stringfield,Stringcontent)throwsException{ if(StringUtils.isNullOrEmpty(content)){ returnnull; } List list=newArrayList<>(); Readerreader=newStringReader(content); TokenStreamstream=(TokenStream)analyzer.tokenStream(field,reader); //添加工具类注意:以下这些与之前lucene2.x版本不同的地方 TermAttributetermAtt=(TermAttribute)stream.addAttribute(TermAttribute.class); OffsetAttributeoffAtt=(OffsetAttribute)stream.addAttribute(OffsetAttribute.class); //循环打印出分词的结果,及分词出现的位置 while(stream.incrementToken()){ list.add(termAtt.term()); //System.out.println(termAtt.term()); } returnlist; }
调用方式:
Stringstr="已知三角形ABC中,角A等于角B加角C,那么三角形ABC是A、锐角三角形B、直角三角形C、钝角三角形D、不能确定"; Analyzeranalyzer=newIKAnalyzer(true); ikList=analysisByIK3Point2(analyzer,"myfield",str); listAnalyzer.addAll(ikList);
输出结果:
[已知,三角形,abc,中,角,a,等于,角,b,加,角,c,那么,三角形,abc,是,a,锐角三角形,b,直角三角形,c,钝角三角形,d,不能,确定]
即使用不同版本实现相同功能效果。主要是因为IKAnalyzer2012F依赖Analyzer的tokenStream是final方法,但是公式分词用到的tokenSteam方法是抽象方法。两者冲突了,所以考虑去做兼容。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。