Jcseg是使用Java开发的一款开源的中文分词器, 基于流行的mmseg算法实现,分词准确率高达98.4%, 支持中文人名识别, 同义词匹配, 停止词过滤等。并且提供了最新版本的lucene,solr,elasticsearch分词接口。
<jcseg.version>1.9.5</jcseg.version> <dependency> <groupId>org.lionsoul.jcseg</groupId> <artifactId>jcseg-core</artifactId> <version>${jcseg.version}</version> </dependency>
如何配置jcseg.properties
# jcseg function #-正向最大化匹配数目(建议位于4-7 之间)。 jcseg.maxlen=10 #-开启中文人名识别(1.7.0 后, 0 关闭, 1 开启)。 jcseg.icnname=1 #-中英混合词最大中文词数,例如:A 计划 A 后面有两个字“计划”。 jcseg.mixcnlen=4 #最大的配对标点内容长度。 jcseg.pptmaxlen=15 #-姓氏修饰词长度,例如:老陈 中的“陈”(通常为1)。 jcseg.cnmaxlnadron=1 #是否自动过滤停止词(0 关闭, 1 开启) jcseg.clearstopword=1 #是否自动中文数字转阿拉伯数字(0 关闭, 1 开启) jcseg.cnnumtoarabic=1 #是否自动中文分数转阿拉伯分数(0 关闭, 1 开启) jcseg.cnfratoarabic=0 #-姓名成词歧义阕值(不用更改, 除非你知道你改了什么)。 jcseg.nsthreshold=1000000 #自动保留标点,用于识别负载的英文标点组合词. jcseg.keeppunctuations=@%.&+ # about the lexicon #-词库文件前缀(例如: lex-main.lex)。 lexicon.prefix=lex #-词库文件后缀(例如: lex-main.lex)。 lexicon.suffix=lex #-词库存放路径({jar.dir}/lexicon 为默认路径, 表示词库位于jar 目录下的lexicon 目录下) #从jcseg-1.9.2 开始: 支持多目录加载词库.不同的路径使用';'隔开就可以了. #例如: lexicon.path=/java/jcseg/lex1;/java/jcseg/lex2 lexicon.path= #-是否词库更新自动加载(1 开启, 0 关闭) lexicon.autoload=1 #-词库更新轮询时间(单位: 秒) lexicon.polltime=120 # lexicon load #载入词库时是否载入词条的词性。(0 关闭, 1 开启) jcseg.loadpos=0 #载入词库时是否载入词条的拼音(1.7.0 后, 0 关闭, 1 开启)。 jcseg.loadpinyin=1 #载入词库时是否载入词条的同义词(0 关闭, 1 开启)。 jcseg.loadsyn=0 #是否保留Jcseg 不是别的字符.(1 保留, 0 关闭) jcseg.keepunregword=1 #是否二次切分复杂的英文切分结果. (1 开启, 0 关闭) jcseg.ensencondseg = 0 #最小二次切分长度. (建议大于1) jcseg.stokenminlen = 4
怎么初始化jcseg
static ISegment seg; static{ JcsegTaskConfig config = null;// new JcsegTaskConfig(); final File jcseg_config_file = FileMgr.findFile(InformationService.class,"jcseg.properties"); if(jcseg_config_file != null && jcseg_config_file.exists()){ config = new JcsegTaskConfig(jcseg_config_file.getAbsolutePath()); }else{ InformationService.LOG.info("Could Not Found jcseq.properties ,Use Default!!"); config = new JcsegTaskConfig(); } String webRootpath=JavaPath.getAutoRootPath()+"VitalData/info/lexicon"; String[] lexPath = {webRootpath}; config.setLexiconPath(lexPath); ADictionary dic = DictionaryFactory.createDefaultDictionary(config); try { InformationService.seg =SegmentFactory.createJcseg(JcsegTaskConfig.COMPLEX_MODE, config, dic); } catch (JcsegException e) { e.printStackTrace(); } }
使用
public List<String> segment(final String str) throws IOException, JcsegException { final List<String> hashSet = new ArrayList<String>(); IWord word = null; final long _start = System.nanoTime(); int counter = 0; seg.reset(new StringReader(str)); while ( (word = seg.next()) != null ) { if(word.getValue().length()>=2){ hashSet.add(word.getValue()); counter++; } word = null; } final long e = System.nanoTime(); return hashSet; }