11个Java开源中文分词器使用方法和分词效果对比.docx
- 文档编号:18384871
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:16
- 大小:18.48KB
11个Java开源中文分词器使用方法和分词效果对比.docx
《11个Java开源中文分词器使用方法和分词效果对比.docx》由会员分享,可在线阅读,更多相关《11个Java开源中文分词器使用方法和分词效果对比.docx(16页珍藏版)》请在冰点文库上搜索。
11个Java开源中文分词器使用方法和分词效果对比
1、学会使用11大Java开源中文分词器
2、对比分析11大Java开源中文分词器的分词效果
本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。
11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口:
/**
*获取文本的所有分词结果,对比不同分词器结果
*@author杨尚川
*/
publicinterfaceWordSegmenter{
/**
*获取文本的所有分词结果
*@paramtext文本
*@return所有的分词结果,去除重复
*/
defaultpublicSet
returnsegMore(text).values().stream().collect(Collectors.toSet());
}
/**
*获取文本的所有分词结果
*@paramtext文本
*@return所有的分词结果,KEY为分词器模式,VALUE为分词器结果
*/
publicMap
}
从上面的定义我们知道,在Java中,同样的方法名称和参数,但是返回值不同,这种情况不可以使用重载。
这两个方法的区别在于返回值,每一个分词器都可能有多种分词模式,每种模式的分词结果都可能不相同,第一个方法忽略分词器模式,返回所有模式的所有不重复分词结果,第二个方法返回每一种分词器模式及其对应的分词结果。
在这里,需要注意的是我们使用了Java8中的新特性默认方法,并使用stream把一个map的value转换为不重复的集合。
下面我们利用这11大分词器来实现这个接口:
1、word分词器
@Override
publicMap
Map
for(SegmentationAlgorithmsegmentationAlgorithm:
SegmentationAlgorithm.values()){
map.put(segmentationAlgorithm.getDes(),seg(text,segmentationAlgorithm));
}
returnmap;
}
privatestaticStringseg(Stringtext,SegmentationAlgorithmsegmentationAlgorithm){
StringBuilderresult=newStringBuilder();
for(Wordword:
WordSegmenter.segWithStopWords(text,segmentationAlgorithm)){
result.append(word.getText()).append("");
}
returnresult.toString();
}
2、Ansj分词器
@Override
publicMap
Map
StringBuilderresult=newStringBuilder();
for(Termterm:
BaseAnalysis.parse(text)){
result.append(term.getName()).append("");
}
map.put("BaseAnalysis",result.toString());
result.setLength(0);
for(Termterm:
ToAnalysis.parse(text)){
result.append(term.getName()).append("");
}
map.put("ToAnalysis",result.toString());
result.setLength(0);
for(Termterm:
NlpAnalysis.parse(text)){
result.append(term.getName()).append("");
}
map.put("NlpAnalysis",result.toString());
result.setLength(0);
for(Termterm:
IndexAnalysis.parse(text)){
result.append(term.getName()).append("");
}
map.put("IndexAnalysis",result.toString());
returnmap;
}
3、Stanford分词器
privatestaticfinalStanfordCoreNLPCTB=newStanfordCoreNLP("StanfordCoreNLP-chinese-ctb");
privatestaticfinalStanfordCoreNLPPKU=newStanfordCoreNLP("StanfordCoreNLP-chinese-pku");
privatestaticfinalPrintStreamNULL_PRINT_STREAM=newPrintStream(newNullOutputStream(),false);
publicMap
Map
map.put("StanfordBeijingUniversitysegmentation",seg(PKU,text));
map.put("StanfordChineseTreebanksegmentation",seg(CTB,text));
returnmap;
}
privatestaticStringseg(StanfordCoreNLPstanfordCoreNLP,Stringtext){
PrintStreamerr=System.err;
System.setErr(NULL_PRINT_STREAM);
Annotationdocument=newAnnotation(text);
stanfordCoreNLP.annotate(document);
List
StringBuilderresult=newStringBuilder();
for(CoreMapsentence:
sentences){
for(CoreLabeltoken:
sentence.get(CoreAnnotations.TokensAnnotation.class)){
Stringword=token.get(CoreAnnotations.TextAnnotation.class);;
result.append(word).append("");
}
}
System.setErr(err);
returnresult.toString();
}
4、FudanNLP分词器
privatestaticCWSTaggertagger=null;
static{
try{
tagger=newCWSTagger("lib/fudannlp_seg.m");
tagger.setEnFilter(true);
}catch(Exceptione){
e.printStackTrace();
}
}
@Override
publicMap
Map
map.put("FudanNLP",tagger.tag(text));
returnmap;
}
5、Jieba分词器
privatestaticfinalJiebaSegmenterJIEBA_SEGMENTER=newJiebaSegmenter();
@Override
publicMap
Map
map.put("INDEX",seg(text,SegMode.INDEX));
map.put("SEARCH",seg(text,SegMode.SEARCH));
returnmap;
}
privatestaticStringseg(Stringtext,SegModesegMode){
StringBuilderresult=newStringBuilder();
for(SegTokentoken:
JIEBA_SEGMENTER.process(text,segMode)){
result.append(token.word.getToken()).append("");
}
returnresult.toString();
}
6、Jcseg分词器
privatestaticfinalJcsegTaskConfigCONFIG=newJcsegTaskConfig();
privatestaticfinalADictionaryDIC=DictionaryFactory.createDefaultDictionary(CONFIG);
static{
CONFIG.setLoadCJKSyn(false);
CONFIG.setLoadCJKPinyin(false);
}
@Override
publicMap
Map
map.put("复杂模式",segText(text,JcsegTaskConfig.COMPLEX_MODE));
map.put("简易模式",segText(text,JcsegTaskConfig.SIMPLE_MODE));
returnmap;
}
privateStringsegText(Stringtext,intsegMode){
StringBuilderresult=newStringBuilder();
try{
ISegmentseg=SegmentFactory.createJcseg(segMode,newObject[]{newStringReader(text),CONFIG,DIC});
IWordword=null;
while((word=seg.next())!
=null){
result.append(word.getValue()).append("");
}
}catch(Exceptionex){
thrownewRuntimeException(ex);
}
returnresult.toString();
}
7、MMSeg4j分词器
privatestaticfinalDictionaryDIC=Dictionary.getInstance();
privatestaticfinalSimpleSegSIMPLE_SEG=newSimpleSeg(DIC);
privatestaticfinalComplexSegCOMPLEX_SEG=newComplexSeg(DIC);
privatestaticfinalMaxWordSegMAX_WORD_SEG=newMaxWordSeg(DIC);
@Override
publicMap
Map
map.put(SIMPLE_SEG.getClass().getSimpleName(),segText(text,SIMPLE_SEG));
map.put(COMPLEX_SEG.getClass().getSimpleName(),segText(text,COMPLEX_SEG));
map.put(MAX_WORD_SEG.getClass().getSimpleName(),segText(text,MAX_WORD_SEG));
returnmap;
}
privateStringsegText(Stringtext,Segseg){
StringBuilderresult=newStringBuilder();
MMSegmmSeg=newMMSeg(newStringReader(text),seg);
try{
Wordword=null;
while((word=mmSeg.next())!
=null){
result.append(word.getString()).append("");
}
}catch(IOExceptionex){
thrownewRuntimeException(ex);
}
returnresult.toString();
}
8、IKAnalyzer分词器
@Override
publicMap
Map
map.put("智能切分",segText(text,true));
map.put("细粒度切分",segText(text,false));
returnmap;
}
privateStringsegText(Stringtext,booleanuseSmart){
StringBuilderresult=newStringBuilder();
IKSegmenterik=newIKSegmenter(newStringReader(text),useSmart);
try{
Lexemeword=null;
while((word=ik.next())!
=null){
result.append(word.getLexemeText()).append("");
}
}catch(IOExceptionex){
thrownewRuntimeException(ex);
}
returnresult.toString();
}
9、Paoding分词器
privatestaticfinalPaodingAnalyzerANALYZER=newPaodingAnalyzer();
@Override
publicMap
Map
map.put("MOST_WORDS_MODE",seg(text,PaodingAnalyzer.MOST_WORDS_MODE));
map.put("MAX_WORD_LENGTH_MODE",seg(text,PaodingAnalyzer.MAX_WORD_LENGTH_MODE));
returnmap;
}
privatestaticStringseg(Stringtext,intmode){
ANALYZER.setMode(mode);
StringBuilderresult=newStringBuilder();
try{
TokenreusableToken=newToken();
TokenStreamstream=ANALYZER.tokenStream("",newStringReader(text));
Tokentoken=null;
while((token=stream.next(reusableToken))!
=null){
result.append(token.term()).append("");
}
}catch(Exceptionex){
thrownewRuntimeException(ex);
}
returnresult.toString();
}
10、smartcn分词器
privatestaticfinalSmartChineseAnalyzerSMART_CHINESE_ANALYZER=newSmartChineseAnalyzer();
@Override
publicMap
Map
map.put("smartcn",segText(text));
returnmap;
}
privatestaticStringsegText(Stringtext){
StringBuilderresult=newStringBuilder();
try{
TokenStreamtokenStream=SMART_CHINESE_ANALYZER.tokenStream("text",newStringReader(text));
tokenStream.reset();
while(tokenStream.incrementToken()){
CharTermAttributecharTermAttribute=tokenStream.getAttribute(CharTermAttribute.class);
result.append(charTermAttribute.toString()).append("");
}
tokenStream.close();
}catch(Exceptione){
e.printStackTrace();
}
returnresult.toString();
}
11、HanLP分词器
privatestaticfinalSegmentN_SHORT_SEGMENT=newNShortSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
privatestaticfinalSegmentDIJKSTRA_SEGMENT=newDijkstraSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
@Override
publicMap
Map
map.put("标准分词",standard(text));
map.put("NLP分词",nlp(text));
map.put("索引分词",index(text));
map.put("N-最短路径分词",nShort(text));
map.put("最短路径分词",shortest(text));
map.put("极速词典分词",speed(text));
returnmap;
}
privatestaticStringstandard(Stringtext){
StringBuilderresult=newStringBuilder();
StandardTokenizer.segment(text).forEach(term->result.append(term.word).append(""));
returnresult.toString();
}
privatestaticStringnlp(Stringtext){
StringBuilderresult=newStringBuilder();
NLPTokenizer.segment(text).forEach(term->result.append(term.word).append(""));
returnresult.toString();
}
privatestaticStringindex(Stringtext){
StringBuilderresult=newStringBuilder();
IndexTokenizer.segment(text).forEach(term->result.append(term.word).append(""));
returnresult.toString();
}
privatestaticStringspeed(Stringtext){
StringBuilderresult=newStringBuilder();
SpeedTokenizer.segment(text).forEach(term->result.append(term.word).append("")
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 Java 中文 分词 使用方法 效果 对比