热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene的CJKAnalyzer分析器

Lucene的CJKAnalyzer分析器。CJKAnalyzer分析器的思想:对中文汉字,每两个字作为一个词条,例如A,B,C,D是四个中文汉字,使用CJKAnalyzer分析器分词后一共得到三个词

Lucene的CJKAnalyzer分析器。

CJKAnalyzer分析器的思想:

对中文汉字,每两个字作为一个词条,例如A,B,C,D是四个中文汉字,使用CJKAnalyzer分析器分词后一共得到三个词条如下:

AB,BC,CD。

其实,CJKAnalyzer分析器在对中文分词方面比StandardAnalyzer分析器要好一点。因为根据中文的习惯,包括搜索的时候键入关键字的习惯,中文的词(大于一个汉字)比单个汉字的频率应该高一些。

但是,在设置相同的过滤词条文本以后,CJKAnalyzer分析器的缺点就是产生了冗余会比较大,相对于StandardAnalyzer分析器来说。使用StandardAnalyzer分析器可以考虑在以字作为词条时,通过过滤词条文本来优化分词。而CJKAnalyzer分析器在给定的过滤词条文本的基础之上,获取有用的词条实际是一个在具有一定中文语言习惯的基础上能够获得最高的期望。

如果使用默认的过滤词条文本:

package org.shirdrn.lucene;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;

public class MyAnalyzer {

public static void main(String[] args) {
   try {
    File file = new File("E:\\shirdrn.txt");
    FileReader stopWords = new FileReader("E:\\stopWords.txt");
    Reader reader = new FileReader(file);   
    Analyzer a = new CJKAnalyzer();
    TokenStream ts = a.tokenStream("", reader);
    Token t = null;
    int n = 0;
    while((t = ts.next()) != null ){
     n ++ ;
     System.out.println("词条"+n+"的内容为 :"+t.termText());
    }
    System.out.println("== 共有词条 "+n+" 条 ==");
   
   } catch (Exception e) {
    e.printStackTrace();
   }
}
}

即:没有对中文词条限制,结果可以看到:

词条1的内容为 :中秋
词条2的内容为 :秋之
词条3的内容为 :之夜
词条4的内容为 :享受
词条5的内容为 :受着
词条6的内容为 :着月
词条7的内容为 :月华
词条8的内容为 :华的
词条9的内容为 :的孤
词条10的内容为 :孤独
词条11的内容为 :享受
词条12的内容为 :受着
词条13的内容为 :着爆
词条14的内容为 :爆炸
词条15的内容为 :炸式
词条16的内容为 :式的
词条17的内容为 :的思
词条18的内容为 :思维
词条19的内容为 :维跃
词条20的内容为 :跃迁
== 共有词条 20 条 ==

产生的无用的词条大概占50%左右,而且,如果被分词的文件很大,存储也有一定的开销,相对于使用StandardAnalyzer分析器。相对于使用StandardAnalyzer分析器,使用CJKAnalyzer分析器的存储开销是StandardAnalyzer分析器的两倍。

这里,无论是那种分词方式(对于StandardAnalyzer分析器和CJKAnalyzer分析器来说),都要考虑对重复的词条进行处理。

CJKAnalyzer分析器的分词工具是CJKTokenizer核心类。至于如果过滤,这和StandardAnalyzer分析器很相似,但是它只是设置了在程序中指定了一个stopTable。可以参考StandardAnalyzer分析器实现读取文件系统中的文本的实现。

Lucene的ChineseAnalyzer分析器。

ChineseAnalyzer分析器其实就是StandardAnalyzer分析器,对单个的中文汉字作为一个词条。

也可以指定一个stopTable。


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
庚的右翼cs神
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有