- 浏览: 811775 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
107x:
不错,谢谢!
log4j.properties配置详解 -
gzklyzf:
为啥我解析的PDF文档没有作者、文章题目等信息啊,下面是我的代 ...
Apache Lucene Tika 文件内容提取工具 -
mervyn1024:
解压密码是啥
ictclas4j调整 -
百卉含英:
如果我的文件输出路径是这个log4j.appender.Fil ...
log4j.properties配置详解 -
lxhxklyy:
mark……
log4j.properties配置详解
ictclas4j中文分词模块ms也是采用了Viterbi算法进行切词,在切词基础上进行词性标注。具体可参阅其代码:
package org.ictclas4j.segment; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import org.ictclas4j.bean.Atom; import org.ictclas4j.bean.Dictionary; import org.ictclas4j.bean.MidResult; import org.ictclas4j.bean.SegNode; import org.ictclas4j.bean.SegResult; import org.ictclas4j.bean.Sentence; import org.ictclas4j.utility.POSTag; import org.ictclas4j.utility.Utility; public class SegTag { private Dictionary coreDict; private Dictionary bigramDict; private PosTagger personTagger; private PosTagger transPersonTagger; private PosTagger placeTagger; private PosTagger lexTagger; private int segPathCount = 1;// 分词路径的数目 public SegTag(int segPathCount) { this.segPathCount = segPathCount; coreDict = new Dictionary("data\\coreDict.dct"); bigramDict = new Dictionary("data\\bigramDict.dct"); personTagger = new PosTagger(Utility.TAG_TYPE.TT_PERSON, "data\\nr", coreDict); transPersonTagger = new PosTagger(Utility.TAG_TYPE.TT_TRANS_PERSON, "data\\tr", coreDict); placeTagger = new PosTagger(Utility.TAG_TYPE.TT_TRANS_PERSON, "data\\ns", coreDict); lexTagger = new PosTagger(Utility.TAG_TYPE.TT_NORMAL, "data\\lexical", coreDict); } public SegResult split(String src) { SegResult sr = new SegResult(src);// 分词结果 String finalResult = null; if (src != null) { finalResult = ""; int index = 0; String midResult = null; sr.setRawContent(src); SentenceSeg ss = new SentenceSeg(src); ArrayList<Sentence> sens = ss.getSens(); for (Sentence sen : sens) { long start = System.currentTimeMillis(); MidResult mr = new MidResult(); mr.setIndex(index++); mr.setSource(sen.getContent()); if (sen.isSeg()) { // 原子分词 AtomSeg as = new AtomSeg(sen.getContent()); ArrayList<Atom> atoms = as.getAtoms(); mr.setAtoms(atoms); println2Err("[atom time]:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); // 生成分词图表,先进行初步分词,然后进行优化,最后进行词性标记 SegGraph segGraph = GraphGenerate.generate(atoms, coreDict); mr.setSegGraph(segGraph.getSnList()); // 生成二叉分词图表 SegGraph biSegGraph = GraphGenerate.biGenerate(segGraph, coreDict, bigramDict); mr.setBiSegGraph(biSegGraph.getSnList()); println2Err("[graph time]:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); // 求N最短路径 NShortPath nsp = new NShortPath(biSegGraph, segPathCount); ArrayList<ArrayList<Integer>> bipath = nsp.getPaths(); mr.setBipath(bipath); println2Err("[NSP time]:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); for (ArrayList<Integer> onePath : bipath) { // 得到初次分词路径 ArrayList<SegNode> segPath = getSegPath(segGraph, onePath); ArrayList<SegNode> firstPath = AdjustSeg .firstAdjust(segPath); String firstResult = outputResult(firstPath); mr.addFirstResult(firstResult); println2Err("[first time]:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); // 处理未登陆词,进对初次分词结果进行优化 SegGraph optSegGraph = new SegGraph(firstPath); ArrayList<SegNode> sns = clone(firstPath); personTagger.recognition(optSegGraph, sns); transPersonTagger.recognition(optSegGraph, sns); placeTagger.recognition(optSegGraph, sns); mr.setOptSegGraph(optSegGraph.getSnList()); println2Err("[unknown time]:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); // 根据优化后的结果,重新进行生成二叉分词图表 SegGraph optBiSegGraph = GraphGenerate.biGenerate( optSegGraph, coreDict, bigramDict); mr.setOptBiSegGraph(optBiSegGraph.getSnList()); // 重新求取N-最短路径 NShortPath optNsp = new NShortPath(optBiSegGraph, segPathCount); ArrayList<ArrayList<Integer>> optBipath = optNsp .getPaths(); mr.setOptBipath(optBipath); // 生成优化后的分词结果,并对结果进行词性标记和最后的优化调整处理 ArrayList<SegNode> adjResult = null; for (ArrayList<Integer> optOnePath : optBipath) { ArrayList<SegNode> optSegPath = getSegPath( optSegGraph, optOnePath); lexTagger.recognition(optSegPath); String optResult = outputResult(optSegPath); mr.addOptResult(optResult); adjResult = AdjustSeg.finaAdjust(optSegPath, personTagger, placeTagger); String adjrs = outputResult(adjResult); println2Err("[last time]:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); if (midResult == null) midResult = adjrs; break; } } sr.addMidResult(mr); } else midResult = sen.getContent(); finalResult += midResult; midResult = null; } sr.setFinalResult(finalResult); } return sr; } private ArrayList<SegNode> clone(ArrayList<SegNode> sns) { ArrayList<SegNode> result = null; if (sns != null && sns.size() > 0) { result = new ArrayList<SegNode>(); for (SegNode sn : sns) result.add(sn.clone()); } return result; } // 根据二叉分词路径生成分词路径 private ArrayList<SegNode> getSegPath(SegGraph sg, ArrayList<Integer> bipath) { ArrayList<SegNode> path = null; if (sg != null && bipath != null) { ArrayList<SegNode> sns = sg.getSnList(); path = new ArrayList<SegNode>(); for (int index : bipath) path.add(sns.get(index)); } return path; } // 根据分词路径生成分词结果 private String outputResult(ArrayList<SegNode> wrList) { String result = null; String temp = null; char[] pos = new char[2]; if (wrList != null && wrList.size() > 0) { result = ""; for (int i = 0; i < wrList.size(); i++) { SegNode sn = wrList.get(i); if (sn.getPos() != POSTag.SEN_BEGIN && sn.getPos() != POSTag.SEN_END) { int tag = Math.abs(sn.getPos()); pos[0] = (char) (tag / 256); pos[1] = (char) (tag % 256); temp = "" + pos[0]; if (pos[1] > 0) temp += "" + pos[1]; result += sn.getSrcWord() + "/" + temp + " "; } } } return result; } public void setSegPathCount(int segPathCount) { this.segPathCount = segPathCount; } public static void main(String[] args) { SegTag segTag = new SegTag(1); BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); String line = null; try { while ((line = reader.readLine()) != null) { try { SegResult seg_res = segTag.split(line); System.out.println(seg_res.getFinalResult()); } catch (Throwable t) { t.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } private static void println2Err(String str) { // System.err.println(str); } }
发表评论
-
Stanford Dependence Relations(zz)
2014-09-08 10:50 1126中心语为谓词 subj -- 主语 nsubj -- 名 ... -
发现庖丁分词器的一个小问题
2014-09-06 11:02 606”深圳市集银科技有限公司“ 会被切分成: ... -
ictclas4j调整
2012-01-17 17:12 2254Ictclas4j在处理一些文档片段时候,会报如下异常: ... -
Ictclas的一个bug(转)
2011-12-15 17:44 1652SegTag tag=new SegTag(4); S ... -
Ubuntu下ICTCLAS JNI的使用
2011-11-14 17:46 4287首先下载ICTCLAS2011_Linux_32_jni ,解 ... -
OneMain
2011-10-24 17:09 1330import org.ictclas4j.bean.SegRe ... -
资料准备
2010-03-09 16:16 1111筹备 RegExr(正则表达式)(舍去) Tika ... -
如何对一个Document的不同Filed使用不同的分词器
2010-02-25 15:13 1399如何对一个Document的不同Filed使用不同的分词器 ... -
Lucene搜索方法总结
2010-01-13 16:07 6193Lucene搜索方法总结 更多lucene信息欢迎查看 ... -
Luke简介
2010-01-11 19:49 2210Luke简介 Luke是一个方便的开发和诊断工具,它能访问L ... -
Apache Lucene Tika 文件内容提取工具
2010-01-08 15:56 17264Tika入门 Tika是一个内容抽取的工具集合(a t ... -
What Is Lucene?
2010-01-05 22:43 1342What Is Lucene? The Apache ... -
ictclas4j词性表
2009-11-15 22:14 21201. 名词 (1个一类,7个二类,5个三类) 名词分为以下 ... -
Lucene Hack之通过缩小搜索结果集来提升性能
2009-08-23 20:19 1200一、缘起 Lucene在索引文件上G之后的搜索性能下降很严 ... -
Lucene基础排序算法改进
2009-08-23 17:47 2907Lucene基础排序算法: score_d = sum_t( ... -
关于imdict-chinese-analyzer中文分词模块
2009-05-19 12:00 3185CJK中文分词模块是很重要的工具。imdic ...
相关推荐
最好的中分分词工具ictclas 最好的中分分词工具ictclas 最好的中分分词工具ictclas
本代码用java实现了分词功能,包括分词和词性标注,里面有具体的说明文档,包括数据结构的设计,分词步骤,分词系统研究等。
基于Lucene的中文分词包,ictclas4j的最新发布,已经打包成jar包。
NULL 博文链接:https://lionsadness.iteye.com/blog/689910
中科院ICTCLAS2014分词系统下载包
java开源分词系统主要功能包括中文分词;词性标注;命名实体识别;...我们先后精心打造五年,内核升级7次,目前已经升级到了ICTCLAS2009 用户词典接口扩展用户可以动态增加、删除用户词典中的词,调节分词的效果
ictclas工程,分词学习ictclas工程,分词学习ictclas工程,分词学习
ICTCLAS(Chinese Word Segmentation for Information Content Extraction and Linguistic Analysis System)是由北京师范大学的陈天教授基于ICTCLAS(信息内容提取与语言分析系统)进一步开发的一个Java分词系统。...
《中文分词器ictclas4j_3:深入解析与应用》 中文分词是自然语言处理中的关键步骤,尤其在中文信息检索、文本挖掘、机器翻译等领域扮演着至关重要的角色。ictclas4j_3是一款针对中文的分词工具,它基于贝叶斯公式,...
ICTCLAS 中文分词 中科院 ICTCLAS 中文分词 中科院
ictclas中科院分词
ictclas4j java版 for lucene
ICTCLAS中文分词系统是基于信息技术(ICT)和自然语言处理(NLP)的工具,主要用于处理中文文本。这个系统由中关村的科研团队开发,代表着国内在中文分词技术领域的先进水平。分词是中文信息处理的重要步骤,因为...
ICTCLAS 中文分词的elipse 工程
ictclas4j java版实现,可供参考
中国科学院计算技术研究所在多年研究工作积累的基础上,研制出了汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),主要功能包括中文分词;词性标注;命名实体识别;...
分词结果是中/w 国/w 科/w 学/w 院/w 计/w 算/w 技/w 术/w 研/w 究/w 所/w 在/w 多/w 年/w 研/w 究/w 基/w 础/w 上/w ,/w 耗/nx 时/nx 一/nx 年/nx 研/nx 制/nx 出/nx 了/nx ICTCLAS/nx解决: 字典没导入成功,/...
ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0
sinboy发表的ictclas4j-0.9.1版(最新)相关的字典、源码和开发文档打包
中科院分词,最流行的中文分词,我的总结。