Jcseg分词器的实现详解

1.之前的项目一直都是用的ik分词器,但是最近的一个项目项目大佬说ik好像很长时间都没更新,版本太老旧,故而用了新的jcseg的分词器,于是也上网找了一些资料,学习了一下如何使用jcseg分词器。

2.http://www.docin.com/p-782941386.html这个是网上找到的Jcseg中文分词器开发说明文档

3.具体实现

在pom文件里面添加相关架包

<dependency> <groupId>org.lionsoul</groupId> <artifactId>jcseg-core</artifactId> <version>1.9.2</version> </dependency>

jcseg.properties 注意的是那个词典(lexicon)的目录,没有的可以去官网上下载。

# jcseg properties file. # bug report chenxin <chenxin619315@gmail.com>

# Jcseg function #maximum match length. (5-7) jcseg.maxlen=5

#recognized the chinese name.(1 to open and 0 to close it) jcseg.icnname=1

#maximum chinese word number of english chinese mixed word. jcseg.mixcnlen=2

#maximum length for pair punctuation text. jcseg.pptmaxlen=15

#maximum length for chinese last name andron. jcseg.cnmaxlnadron=1

#Wether to clear the stopwords.(set 1 to clear stopwords and 0 to close it) jcseg.clearstopword=0

#Wether to convert the chinese numeric to arabic number. (set to 1 open it and 0 to close it) # like '\u4E09\u4E07' to 30000. jcseg.cnnumtoarabic=1

#Wether to convert the chinese fraction to arabic fraction. jcseg.cnfratoarabic=1

#Wether to keep the unrecognized word. (set 1 to keep unrecognized word and 0 to clear it) jcseg.keepunregword=1

#Wether to start the secondary segmentation for the complex english words. jcseg.ensencondseg = 1

#min length of the secondary simple token. (better larger than 1) jcseg.stokenminlen = 2

#thrshold for chinese name recognize. # better not change it before you know what you are doing. jcseg.nsthreshold=1000000

#The punctuations that will be keep in an token.(Not the end of the token). jcseg.keeppunctuations=@%.&+ ####about the lexicon #prefix of lexicon file. lexicon.prefix=lex

#suffix of lexicon file. lexicon.suffix=lex

#abusolte path of the lexicon file. #Multiple path support from jcseg 1.9.2, use ';' to split different path. #example: lexicon.path = /home/chenxin/lex1;/home/chenxin/lex2 (Linux) #  : lexicon.path = D:/jcseg/lexicon/1;D:/jcseg/lexicon/2 (WinNT) #lexicon.path=C:/Users/admin/Downloads/jcseg-1.9.2/lexicon lexicon.path=D:/workspace/lexicon

#Wether to load the modified lexicon file auto. lexicon.autoload=0

#Poll time for auto load. (seconds) lexicon.polltime=120 ####lexicon load #Wether to load the part of speech of the entry. jcseg.loadpos=1

#Wether to load the pinyin of the entry. jcseg.loadpinyin=0

#Wether to load the synoyms words of the entry. jcseg.loadsyn=1

JcsegTools.java的代码

package com.iflytek.jcseg;

import java.io.IOException; import java.io.Serializable; import java.io.StringReader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.lionsoul.jcseg.core.ADictionary; import org.lionsoul.jcseg.core.DictionaryFactory; import org.lionsoul.jcseg.core.ISegment; import org.lionsoul.jcseg.core.IWord; import org.lionsoul.jcseg.core.JcsegException; import org.lionsoul.jcseg.core.JcsegTaskConfig; import org.lionsoul.jcseg.core.SegmentFactory;

public class JcsegTools implements Serializable {

 private static final long serialVersionUID = 1L;  private static JcsegTaskConfig config;

 ISegment seg = null;  private boolean inited;

 synchronized private void init() throws JcsegException {   JcsegTaskConfig config = new JcsegTaskConfig();   ADictionary dic = DictionaryFactory.createDefaultDictionary(config);

  for (String s : config.getLexiconPath()) {    System.out.println("->" + s);   }   seg = SegmentFactory.createJcseg(JcsegTaskConfig.COMPLEX_MODE,     new Object[] { config, dic });   inited = true;  }

 public List<String> segment(String fullText) throws IOException,    JcsegException {   if (!inited) {    init();   }   IWord word = null;   seg.reset(new StringReader(fullText));   List<String> ret = new ArrayList<String>();   Set<String> ml = new HashSet<String>();   while ((word = seg.next()) != null) {    if (word.getLength() < 2) {     continue; // 去掉长度小于2的词    }    ml.add(word.getValue());   }   ret.addAll(ml);   return ret;  }

 public static void main(String[] args) throws JcsegException, IOException {   String str = "3月22日,百度首席科学家吴恩达在多个社交平台发布公开信,宣布自己将从百度离职,对于未来的去向,他在推特上表示:未来将会推动大公司使用人工智能,并创造丰富的创业机会及进一步的人工智能研究。对于吴恩达的离职,百度官方也给予了祝福,并感谢其在百度任职期间做出的贡献。巧合的是,百度股价曾在2月的同一天大幅下跌,市值蒸发超200亿人民币,联想到今天的离职事件,个中缘由耐人寻味。"; //  List<String> list = JcsegTools.analyze(str); //  for (String word : list) { //   System.out.println(word); //  } //  System.out.println(list.size());   JcsegTools demo = new JcsegTools();   try {    List<String> strings=demo.segment(str);    for(int i=0;i<strings.size();i++){     System.out.println(strings.get(i));    }   } catch (IOException e) {    e.printStackTrace();   }  } }

结果截图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java成神之路

【转】零基础写Java知乎爬虫之进阶篇

说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅...

923
来自专栏everhad

设计模式:Builder

简介 建造者模式(Builder),将一个复杂对象的表示和它的构建分离,这样同样的构造过程可以创建出不同的对象状态。 类图 下面的Product是要创建的对象的...

1649
来自专栏java达人

java与ruby的直观比较

以前花过一段时间学习ruby,还顺便写了个股票爬虫,搭了数据展示网站,这次回顾一下以前的知识点,将ruby与java作个简单而直观的比较,这样有助于更深入地理解...

1877
来自专栏偏前端工程师的驿站

JS魔法堂:再识IE的内存泄露

一、前言                               IE6~8除了不遵守W3C标准和各种诡异外,我想最让人诟病的应该是内存泄露的问题了。这阵子...

2075
来自专栏pangguoming

IntPtr 转 string

假设有 intPtr pBuffer 方法一: 直接使用Marshal.PtrToStringAnsi方法: string ss = Marshal.PtrTo...

33014
来自专栏老付的网络博客

详解.net中IL语言

中间语言,又称(IL语言)。充当Clr与.net 平台的中间语言,比如用C#编写程序,编译器首先是把C#代码转译成IL语言,最终由Clr解释执行,下面我们学习下...

572
来自专栏林德熙的博客

C# BBcode 转 Markdown

本文的方法都是使用正则转换,现在支持的代码只有很少的常用标签,如果大家发现有转换失败的,请帮我修改代码,估计代码我不会进行修改。

351
来自专栏小李刀刀的专栏

ASP中的数字和字符比较

昨晚和老迷聊天聊到很晚,说到一个把字符串转换为数字进行比较的问题。老迷说他喜欢保持字符串本身的类型,进行字符串的匹配比较,而不喜欢把字符串强制转换为数字进行比较...

2858
来自专栏蓝天

通过小代码体验程序中BSS段和DATA段的差异

BSS(Block Started by Symbol)用来存储未初始化的全局变量,值为0的通常会被编译器认为未初始化,属于静态内存分配区,不会占用程序文件空...

571
来自专栏.NET后端开发

认识XmlReader

摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作。通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开...

33310

扫码关注云+社区