lucene分词多种方法
另外网友谈的比较多的中文分词器还有:
CJKAnalyzer
ChineseAnalyzer
IK_CAnalyzer(MIK_CAnalyzer)
还有一些热心网友自己写的比较不错的分词器在此就不说了,有兴趣的可以自己研究研究。
以上三个中文分词器并不是lucene2.2.jar里提供的。
CJKAnalyzer和ChineseAnalyzer分别是lucene-2.2.0目录下contrib目录下analyzers的lucene-analyzers-2.2.0.jar提供的。分别位于cn和cjk目录。
IK_CAnalyzer(MIK_CAnalyzer)是基于分词词典,目前最新的1.4版本是基于lucene2.0开发的。以上分词器各有优劣,比较如下:
import java.io.Reader;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.mira.lucene.analysis.IK_CAnalyzer;
import org.mira.lucene.analysis.MIK_CAnalyzer;
public class All_Test {
     private static String string = "中华人民共和国在1949年建立,从此开始了新中国的伟大篇章。";
     public static void Standard_Analyzer(String str) throws Exception{
            Analyzer analyzer = new StandardAnalyzer();        
            Reader r = new StringReader(str);        
            StopFilter sf = (StopFilter) analyzer.tokenStream("", r);
            System.out.println("=====StandardAnalyzer====");
            System.out.println("分析方法:默认没有词只有字(一元分词)");
            Token t;        
           while ((t = sf.next()) != null) {        
                  System.out.println(t.termText());        
            }      
      }
     public static void CJK_Analyzer(String str) throws Exception{
            Analyzer analyzer = new CJKAnalyzer();        
            Reader r = new StringReader(str);        
            StopFilter sf = (StopFilter) analyzer.tokenStream("", r);
            System.out.println("=====CJKAnalyzer====");
            System.out.println("分析方法:交叉双字分割(二元分词)");
            Token t;        
           while ((t = sf.next()) != null) {        
                  System.out.println(t.termText());        
            }      
      }
     public static void Chiniese_Analyzer(String str) throws Exception{
            Analyzer analyzer = new ChineseAnalyzer();        
            Reader r = new StringReader(str);        
            TokenFilter tf = (TokenFilter) analyzer.tokenStream("", r);
            System.out.println("=====chinese analyzer====");
            System.out.println("分析方法:基本等同StandardAnalyzer(一元分词)");
while ((t = tf.next()) != null) {
System.out.println(t.termText());
}
}
public static void ik_CAnalyzer(String str) throws Exception{
// Analyzer analyzer = new MIK_CAnalyzer();
Analyzer analyzer = new IK_CAnalyzer();
Reader r = new StringReader(str);
TokenStream ts = (TokenStream)analyzer.tokenStream("", r);
System.out.println("=====IK_CAnalyzer====");
System.out.println("分析方法:字典分词,正反双向搜索");
Token t;
while ((t = ts.next()) != null) {
System.out.println(t.termText());
}
}
public static void main(String[] args) throws Exception{
String str = string;
System.out.println("我们测试的字符串是:"+str);
Standard_Analyzer(str);
CJK_Analyzer(str);
Chiniese_Analyzer(str);
ik_CAnalyzer(str);
}
}
分词结果如下:
我们测试的字符串是:中华人民共和国在1949年建立,从此开始了新中国的伟大篇章。
=====StandardAnalyzer====
分析方法:默认没有词只有字(一元分词)
中
华
人
民
共
和
国
在
1949
年
建
立
从
此
开
始
了
新
中
国
的
伟
大
篇
章
=====CJKAnalyzer====
分析方法:交叉双字分割(二元分词)
中华
华人
人民
民共
共和
和国
国在
1949
年建
建立
从此
此开
开始
始了
了新
新中
中国
国的
的伟
伟大
大篇
篇章
=====chinese analyzer====
分析方法:基本等同StandardAnalyzer(一元分词)
中
华
人
民
共
和
国
在
年
建
立
从
此
开
始
了
新
中
国
的
伟
大
篇
章
=====IK_CAnalyzer====
分析方法:字典分词,正反双向搜索
中华人民共和国
中华人民
中华
华人
人民共和国
人民
人
共和国
共和
1949年
建立
从此
开始
新中国
中国
伟大
大篇
篇章
如果 ik_CAnalyzer(String str) 里采用
Analyzer analyzer = new MIK_CAnalyzer();
那么该方法的分词结果是:
中华人民共和国
1949年
建立
从此
开始
新中国
伟大
大篇
篇章
可以看到各种分词结果各不相同,根据应用的需要可以选择合适的分词器。
关于IKAnalyzer的介绍可以参考:
http://blog.csdn.net/dbigbear/archive/2007/01/24/1492380.aspx
文章来源:永恒论坛-http://www.yyhweb.com
http://www.yyhweb.com/Article.htm?cId=2&fId=3&aId=88
lucene分词多种方法的更多相关文章
- Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
		Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ... 
- Lucene系列三:Lucene分词器详解、实现自己的一个分词器
		一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ... 
- CSS导航菜单水平居中的多种方法
		CSS导航菜单水平居中的多种方法 在网页设计中,水平导航菜单使用是十分广泛的,在CSS样式中,我们一般会用Float元素或是「display:inline-block」来解决.而今天主要讲解如何让未知 ... 
- 用 Python 排序数据的多种方法
		用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ... 
- js判断移动端是否安装某款app的多种方法
		本文实例讲解了js判断移动端是否安装某款app的多种方法,分享给大家供大家参考,具体内容如下 第一种方法: 一:判断是那种设备 ? || u.indexOf(; //android终端或者uc浏览器 ... 
- Gradle学习系列之二——创建Task的多种方法
		在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ... 
- SQL语句的添加、删除、修改多种方法
		SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔------- ... 
- 给ul中的li添加事件的多种方法
		给ul中的li添加事件的多种方法 这是一个常见,而且典型的前端面试题 <ul> <li>11111</li> <li>22222</li> ... 
- PHP获取时间日期的多种方法
		分享下PHP获取时间日期的多种方法. <?php echo "今天:".date("Y-m-d")."<br>"; ... 
随机推荐
- HDOJ(HDU) 1799 循环多少次?(另类杨辉三角)
			Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次 ... 
- HDU2050(分平面问题)
			分平面问题: 一.n条直线最多分平面问题. n条直线最多可以把平面分成多少个区域? 此类问题主要采用递归的思想.当有n-1条直线时,平面最多被分成了f(n-1)块区域.如果要使第n条直线分的区域最多, ... 
- C++ Template Specialization (模板特化)
			个人理解这个东西说白了就是当模板类(或函数)的类型参数为某特定值时用对应的特化定义代之. 看个例子吧 #include <iostream> using namespace std; te ... 
- 自定义UINavigationItem的两种方法以及相应的隐藏方法
			第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"]; UIBarButtonItem *barbtn=[[[U ... 
- SAE 搭建 WordPress
			WordPress,是国外一款使用PHP语言开发的开源博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的博客站点,也可以把 WordPress 当作一个内容管理系统(CMS)来使用 ... 
- jquery实现停留半秒后再选择
			jquery实现tab停留半秒后,选中菜单.切换tab下的内容: var showHandler=null; function init(){ $("#tab_ul").find( ... 
- PermGen space 与 Java heap space
			1.java.lang.OutOfMemoryError: PermGen spacePermGen space的全称是Permanent Generation space,是指内存的永久保存区域Ou ... 
- js:jquery multiSelect 多选下拉框实例
			<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- yii cgridview 默认的筛选如何做成选择框
			效果图 参照 http://www.yiiframework.com/doc/api/1.1/CGridColumn http://www.yiiframework.com/doc/api/1.1/C ... 
- Sending Signals to Processes with kill, killall, and pkill
			The Linux kernel allows many signals to be sent to processes. Use man 7 signals for a complete overv ... 
