当前位置:文档之家› hanlp中文分词器解读

hanlp中文分词器解读

中文分词器解析hanlp分词器接口设计:提供外部接口:分词器封装为静态工具类,并提供了简单的接口标准分词是最常用的分词器,基于HMM-Viterbi实现,开启了中国人名识别和音译人名识别,调用方法如下:HanLP.segment其实是对StandardTokenizer.segment的包装。

/*** 分词** @param text 文本* @return切分后的单词*/publicstatic List<Term>segment(String text){return StandardTokenizer.segment(text.toCharArray());}/*** 创建一个分词器<br>* 这是一个工厂方法<br>* 与直接new一个分词器相比,使用本方法的好处是,以后HanLP升级了,总能用上最合适的分词器* @return一个分词器*/publicstatic Segment newSegment()}publicclass StandardTokenizer{/*** 预置分词器*/publicstaticfinalSegment SEGMENT = HanLP.newSegment();/*** 分词* @param text 文本* @return分词结果*/publicstatic List<Term>segment(String text){return SEGMENT.seg(text.toCharArray());}/*** 分词* @param text 文本* @return分词结果*/publicstatic List<Term>segment(char[]text){return SEGMENT.seg(text);}/*** 切分为句子形式* @param text 文本* @return句子列表*/publicstatic List<List<Term>>seg2sentence(String text){return SEGMENT.seg2sentence(text);}}publicstatic Segment newSegment(){returnnew ViterbiSegment();// Viterbi分词器是目前效率和效果的最佳平衡}/*** Viterbi分词器<br>* 也是最短路分词,最短路求解采用Viterbi算法** @author hankcs*/publicclass ViterbiSegment extends WordBasedGenerativeModelSegmentNLP分词NLPTokenizer会执行全部命名实体识别和词性标注。

,调用方法如下:∙NLP分词NLPTokenizer会执行全部命名实体识别和词性标注。

∙所以速度比标准分词慢,并且有误识别的情况。

publicclass NLPTokenizer{/*** 预置分词器*/publicstaticfinalSegment SEGMENT =HanLP.newSegment().enableNameRecognize(true).enableTranslatedNameRecognize( true).enableJapaneseNameRecognize(true).enablePlaceRecognize(true).enableOr ganizationRecognize(true).enablePartOfSpeechTagging(true);publicstatic List<Term>segment(String text){return SEGMENT.seg(text);}/*** 分词* @param text 文本* @return分词结果*/publicstatic List<Term>segment(char[]text){return SEGMENT.seg(text);}/*** 切分为句子形式* @param text 文本* @return句子列表*/publicstatic List<List<Term>>seg2sentence(String text){return SEGMENT.seg2sentence(text);}}索引分词IndexTokenizer是面向搜索引擎的分词器,能够对长词全切分,另外通过term.offset可以获取单词在文本中的偏移量。

调用方法如下:List<Term>termList=IndexTokenizer.segment("主副食品");for(Termterm:termList){System.out.println(term+"["+term.offset+":"+(term.offset+term.word.length())+"]");}publicclass IndexTokenizer{/*** 预置分词器*/publicstaticfinalSegment SEGMENT = HanLP.newSegment().enableIndexMode(true); publicstatic List<Term>segment(String text){return SEGMENT.seg(text);}/*** 分词* @param text 文本* @return分词结果*/publicstatic List<Term>segment(char[]text){return SEGMENT.seg(text);}/*** 切分为句子形式* @param text 文本* @return句子列表*/publicstatic List<List<Term>>seg2sentence(String text){return SEGMENT.seg2sentence(text);}}繁体分词TraditionalChineseTokenizer可以直接对繁体进行分词,输出切分后的繁体词语。

调用方法如下:List<Term>termList=TraditionalChineseTokenizer.segment("大衛貝克漢不僅僅是名著名球員,球場以外,其妻為前辣妹合唱團成員維多利亞·碧咸,亦由於他擁有突出外表、百變髮型及正面的形象,以至自己品牌的男士香水等商品,及長期擔任運動品牌Adidas的代言人,因此對大眾傳播媒介和時尚界等方面都具很大的影響力,在足球圈外所獲得的認受程度可謂前所未見。

");System.out.println(termList);* 繁体中文分词器** @author hankcs*/publicclass TraditionalChineseTokenizer{/*** 预置分词器*/publicstaticSegment SEGMENT = HanLP.newSegment();privatestatic List<Term>segSentence(String text){if(text.length()==0)return Collections.emptyList();LinkedList<ResultTerm<String>>tsList=CommonAhoCorasickSegmentUtil.segment(t ext,TraditionalChineseDictionary.trie);StringBuilder sbSimplifiedChinese=new StringBuilder(text.length());boolean equal=true;for(ResultTerm<String>term:tsList){if(bel==null)bel=term.word;elseif(bel.length()!=term.word.length())equal=false; sbSimplifiedChinese.append(bel);}String simplifiedChinese=sbSimplifiedChinese.toString();List<Term>termList=SEGMENT.seg(simplifiedChinese);if(equal){int offset=0;for(Term term:termList){term.word=text.substring(offset,offset+term.length());term.offset=offset;offset+=term.length();}}else{Iterator<Term>termIterator=termList.iterator();Iterator<ResultTerm<String>>tsIterator=tsList.iterator();ResultTerm<String>tsTerm=tsIterator.next();int offset=0;while(termIterator.hasNext())Term term=termIterator.next();term.offset=offset;if(offset>tsTerm.offset+tsTerm.word.length())tsTerm=tsIterator.next();if(offset==tsTerm.offset&&term.length()==bel.length()){term.word=tsTerm.word;}else term.word=SimplifiedChineseDictionary.convertToTraditionalChinese(term. word);offset+=term.length();}}return termList;}publicstatic List<Term>segment(String text){List<Term>termList=new LinkedList<Term>();for(String sentence:SentencesUtil.toSentenceList(text)){termList.addAll(segSentence(sentence));}return termList;}/*** 分词** @param text 文本* @return分词结果*/publicstatic List<Term>segment(char[]text){return segment(CharTable.convert(text));}/*** 切分为句子形式** @param text 文本* @return句子列表*/publicstatic List<List<Term>>seg2sentence(String text){List<List<Term>>resultList=new LinkedList<List<Term>>();{for(String sentence:SentencesUtil.toSentenceList(text)){resultList.add(segment(sentence));}}return resultList;}}极速分词是词典最长分词,速度极其快,精度一般。

相关主题