- 浏览: 415390 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
这篇文章的内容质量不是很高,您可以在这里找到更新后的版本。Solo L正在努力提高这里所提供的内容的质量。如果由于内容的质量问题给您造成了影响,我在此真诚的表示歉意!
什么是中文分词
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。
中文分词技术
现有的分词技术可分为三类:
- 基于字符串匹配的分词
- 基于理解的分词
- 基于统计的分词
这篇文章中使用的是基于字符串匹配的分词技术,这种技术也被称为机械分词。它是按照一定的策略将待分析的汉字串与一个“充分大的”词库中的词条进行匹配。若在词库中找到某个字符串则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词法和分词与标注结合法。常用的几种机械分词方法如下:
- 正向最大匹配法(由左到右的方向)
- 逆向最大匹配法(由右到左的方向)
分词器实现
这个实现了机械分词中正向最大匹配法的Lucene分词器包括两个类,CJKAnalyzer和CJKTokenizer,他们的源代码如下:
package org.solol.analysis; import java.io.Reader; import java.util.Set; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.StopFilter; import org.apache.lucene.analysis.TokenStream; /** * @author solo L * */ public class CJKAnalyzer extends Analyzer {//实现了Analyzer接口,这是lucene的要求 public final static String[] STOP_WORDS = {}; private Set stopTable; public CJKAnalyzer() { stopTable = StopFilter.makeStopSet(STOP_WORDS); } @Override public TokenStream tokenStream(String fieldName, Reader reader) { return new StopFilter(new CJKTokenizer(reader), stopTable); } }
package org.solol.analysis; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.TreeMap; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.Tokenizer; /** * @author solo L * */ public class CJKTokenizer extends Tokenizer { //这个TreeMap用来缓存词库 private static TreeMap simWords = null; private static final int IO_BUFFER_SIZE = 256; private int bufferIndex = 0; private int dataLen = 0; private final char[] ioBuffer = new char[IO_BUFFER_SIZE]; private String tokenType = "word"; public CJKTokenizer(Reader input) { this.input = input; } //这里是lucene分词器实现的最关键的地方 public Token next() throws IOException { loadWords(); StringBuffer currentWord = new StringBuffer(); while (true) { char c; Character.UnicodeBlock ub; if (bufferIndex >= dataLen) { dataLen = input.read(ioBuffer); bufferIndex = 0; } if (dataLen == -1) { if (currentWord.length() == 0) { return null; } else { break; } } else { c = ioBuffer[bufferIndex++]; ub = Character.UnicodeBlock.of(c); } //通过这个条件不难看出这里只处理了CJK_UNIFIED_IDEOGRAPHS, //因此会丢掉其它的字符,如它会丢掉LATIN字符和数字 //这也是该lucene分词器的一个限制,您可以在此基础之上完善它, //也很欢迎把您完善的结果反馈给我 if (Character.isLetter(c) && ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) { tokenType = "double"; if (currentWord.length() == 0) { currentWord.append(c); } else { //这里实现了正向最大匹配法 String temp = (currentWord.toString() + c).intern(); if (simWords.containsKey(temp)) { currentWord.append(c); } else { bufferIndex--; break; } } } } Token token = new Token(currentWord.toString(), bufferIndex - currentWord.length(), bufferIndex, tokenType); currentWord.setLength(0); return token; } //装载词库,您必须明白它的逻辑和之所以这样做的目的,这样您才能理解正向最大匹配法是如何实现的 public void loadWords() { if (simWords != null)return; simWords = new TreeMap(); try { InputStream words = new FileInputStream("simchinese.txt"); BufferedReader in = new BufferedReader(new InputStreamReader(words,"UTF-8")); String word = null; while ((word = in.readLine()) != null) { //#使得我们可以在词库中进行必要的注释 if ((word.indexOf("#") == -1) && (word.length() < 5)) { simWords.put(word.intern(), "1"); if (word.length() == 3) { if (!simWords.containsKey(word.substring(0, 2).intern())) { simWords.put(word.substring(0, 2).intern(), "2"); } } if (word.length() == 4) { if (!simWords.containsKey(word.substring(0, 2).intern())) { simWords.put(word.substring(0, 2).intern(), "2"); } if (!simWords.containsKey(word.substring(0, 3).intern())) { simWords.put(word.substring(0, 3).intern(), "2"); } } } } in.close(); } catch (IOException e) { e.printStackTrace(); } } }
分词效果
这是我在当日的某新闻搞中随意选的一段话:
此外,巴黎市政府所在地和巴黎两座体育场会挂出写有相同话语的巨幅标语,这两座体育场还安装了巨大屏幕,以方便巴黎市民和游客观看决赛。
分词结果为:
此外 巴黎 市政府 所在地 和 巴黎 两座 体育场 会 挂出 写有 相同 话语 的 巨幅 标语 这 两座 体育场 还 安装 了 巨大 屏幕 以 方便 巴黎 市民 和 游客 观看 决赛
提示
这个lucene分词器还比较脆弱,要想将其用于某类项目中您还需要做一些工作,不过我想这里的lucene分词器会成为您很好的起点。
-
MMSeg是一个开放源代码的中文分词软件包,可以方便的和Lucene集成。它实现了MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm算法。
- Apache Lucene
发表评论
-
Android 数字签名学习笔记
2012-04-25 11:03 892在 Android系统中,所有安装到系统的应用程序都必有 ... -
序列化:serializable,hessian,protobuf性能对比
2011-10-31 17:08 1187分布式应用系统中,系统之间的通讯的质量决定了系统的可用性 ... -
JAR 文件揭密
2011-10-18 01:28 858JAR 文件是什么? ... -
SSL双向认证java实现
2011-10-17 23:49 983本文通过模拟场景,介绍SSL双向认证的java实现默认的情况下 ... -
Benchmark Analysis: Guice vs Spring
2011-04-19 14:35 1011The original link can be found ... -
Java Network Launching Protocol
2011-04-18 17:43 837在java开发的早期,重点被放在了客户端开发。语言中对于app ... -
NIO 包及工作原理
2011-03-11 11:14 1703NIO 包及工作原理 针对 ... -
使用Java NIO编写高性能的服务器
2011-03-11 01:19 735从JDK 1.4开始,Java的标 ... -
RMI, RMI-IIOP,JNDI
2009-05-21 17:31 14341. RMI-IIOP(Java Remote ... -
企业中的 RMI-IIOP
2009-05-21 17:13 979RMI 和 CORBA 常被视 ... -
JMX
2009-05-21 15:44 931JMX规范 1.1 J ... -
使用Eclipse IDE的技巧
2009-02-24 11:00 1751使用Eclipse IDE的技巧 作 ... -
spring quartz 动态定时任务
2009-01-22 13:31 4416什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
基于struts+spring+ibatis的轻量级
2009-01-12 16:21 1008基于struts+spring+ibatis的轻量级J2 ... -
Log4j配置实例[经典]
2009-01-12 14:53 1252Log4j配置实例[经典] 0 推荐 ... -
jbpm工作流学习心得
2008-09-19 13:59 1272一,装载流程: 第一种: java 代码 JbpmCo ... -
jbpm请假工作流
2008-09-19 13:56 1822请假流程(备用) 工作中要用到JBPM写工作流,自习的时 ... -
利用JExcel API操作EXCEL文件
2008-09-08 10:52 1437使用Windows操作系统的朋 ... -
jExcel API讲解
2008-09-08 10:51 1453转自:http://jhobby.iteye.com/blog ... -
Tomcat5.0乱码全解决方案
2008-09-02 11:56 1054http://hi.baidu.com/liet2008/bl ...
相关推荐
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
Lucene中文分词器组件,不错的。
lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮
lucene搜索引擎中文分词器,版本2.0.4,强大的中文分词效果在其它中文分词器当中独领风骚
//采用正向最大匹配的中文分词算法,相当于分词粒度等于0 MMAnalyzer analyzer = new MMAnalyzer(); //参数为分词粒度:当字数等于或超过该参数,且能成词,该词就被切分出来 MMAnalyzer analyzer = new ...
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包,将一段文字进行IK分词处理一般经过:词典加载、预处理、分词器分词、歧义处理、善后结尾 五个部分
关于lucene中文分词的一个辅助jar包
Struts标签Lucene中文分词构建基于词典的Lucene分析器使用Log4j进行日志记录 您使用过旅游指南吗?它总是能让我们快速的找到目的地。我对此有深刻的印象,希望这篇指南也能使您快速的完成Struts标签相关的任务。我...
引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar
lucene中文分词源码,做搜索引擎需要用到的好东西哦
1.修正了1.2版本在数量词处理的缺陷 2.优化分词性能 3.优化词典 请参考lucene中文分词公用组件V1.2之前版本使用说明
基于词典的最大匹配的Lucene中文分词程序
在lucene中文分词公用组件V1.3基础上做一下更新: 1.修订特定情况下数量词切分造成指针越界异常的BUG 2.进一步优化算法效率 3.优化词典 4.对英文和数词更改为分割处理
用java写的图形分词测试的小东西,用的分词器是: 来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器,其使用“正向全切分算法”,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I...
Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql...
引入局部统计识别高频词汇的Lucene中文分词程序src.rar
lucene中文分词器Jceseg和IK Analyzer使用示例,lucene5可以使用,本人亲测成功,大家放心用,喜欢lucene的人大家关注我的博客 http://blog.csdn.net/wuyinggui10000/article/category/3173543 大家共同交流,有需要...
Lucene关于几种中文分词的总结
lucene 中文分词小案例,实现中文检索,最近看到lucene顺便自己动手做了一下感觉挺实用的,案例很简单,很容易看懂
lucene3.0 中文分词器, 庖丁解牛