zoukankan      html  css  js  c++  java
  • lucene学习笔记(四)lucene分词详解

    这里写图片描述

    分词器的核心类

    这里写图片描述

    Analyzer

    • SimpleAnalyzer
    • StopAnalyzer
    • WhitespaceAnalyzer
    • StandardAnalyzer

    TokenStream

    分词器做好处理之后得到的一个流,这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元信息 
    这里写图片描述 
    在这个流中所需要存储的数据 
    这里写图片描述

    Tokenizer

    主要负责接收字符流Reader,将Reader进行分词操作。有如下一些实现类 
    这里写图片描述

    TokenFilter

    将分词的语汇单元,进行各种各样过滤 
    这里写图片描述

    Attribute

    这里写图片描述

    自定义分词器

    自定义Stop分词器

    这里写图片描述

    中文分词器

    Paoding:庖丁解牛分词器。已经没有更新了 
    mmseg:使用搜狗的词库() 
    1、导入包(有两个包:1、带dic,2、不带dic) 
    如果使用不带dic的,得自己指定词库位置 
    这里写图片描述 
    2、创建的时候使用MMSegAnalyzer分词器 
    这里写图片描述

    简单实现同义词索引

    这里写图片描述

    同义词:最重要的是要在在原来的位置上添加同义词(位置增量为0)

    当前几个主要的Lucene中文分词器的比较

    2009年的一篇文章http://www.iteye.com/news/9637

      1. 基本介绍: 
        paoding :Lucene中文分词“庖丁解牛” Paoding Analysis 
        imdict :imdict智能词典所采用的智能中文分词程序 
        mmseg4j : 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器 
        ik :采用了特有的“正向迭代最细粒度切分算法“,多子处理器分析模式
      2. * 开发者及开发活跃度*: 
        paoding :qieqie.wang, google code 上最后一次代码提交:2008-06-12,svn 版本号 132 
        imdict :XiaoPingGao, 进入了 lucene contribute,lucene trunk 中 contrib/analyzers/smartcn/ 最后一次提交:2009-07-24, 
        mmseg4j :chenlb2008,google code 中 2009-08-03 (昨天),版本号 57,log为:mmseg4j-1.7 创建分支 
        ik :linliangyi2005,google code 中 2009-07-31,版本号 41
      3. 用户自定义词库: 
        paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载 
        imdict :暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop words 
        mmseg4j :自带sogou词库,支持名为 wordsxxx.dic, utf8文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.path 
        ik : 支持api级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码, 分割。不支持自动检测。
      4. 速度(基于官方介绍,非自己测试) 
        paoding :在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字 
        imdict :483.64 (字节/秒),259517(汉字/秒) 
        mmseg4j : complex 1200kb/s左右, simple 1900kb/s左右 
        ik :linliangyi2005,google code 中 2009-07-31,版本号 41
      5. 算法和代码复杂度 
        paoding :svn src 目录一共1.3M,6个properties文件,48个java文件,6895 行。使用不用的 Knife 切不同类型的流,不算很复杂。 
        imdict :词库 6.7M(这个词库是必须的),src 目录 152k,20个java文件,2399行。使用 ICTCLAS HHMM隐马尔科夫模型,“利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分” 
        mmseg4j : svn src 目录一共 132k,23个java文件,2089行。MMSeg 算法 ,有点复杂。 
        ik : svn src 目录一共6.6M(词典文件也在里面),22个java文件,4217行。多子处理器分析,跟paoding类似,歧义分析算法还没有弄明白。
      6. 文档 
        paoding :几乎无。代码里有一些注释,但因为实现比较复杂,读代码还是有一些难度的。 
        imdict : 几乎无。 ICTCLAS 也没有详细的文档,HHMM隐马尔科夫模型的数学性太强,不太好理解。 
        mmseg4j : MMSeg 算法 是英文的,但原理比较简单。实现也比较清晰。 
        ik : 有一个pdf使用手册,里面有使用示例和配置说明。

      7. 其他 
        paoding :引入隐喻,设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。 
        imdict:进入了 lucene trunk,原版 ictclas 在各种评测中都有不错的表现,有坚实的理论基础,不是个人山寨。缺点为暂时不支持用户词库。 
        mmseg4j : 在complex基础上实现了最多分词(max-word),但是还不成熟,还有很多需要改进的地方。 
        ik : 针对Lucene全文检索优化的查询分析器IKQueryParse

      8. 结论 
        个人觉得,可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比,可以参考 mmseg4j 多分词模式与 paoding 分词效果对比 
        或者自己再包装一下,将 paoding 的词库更新检测做一个单独的模块实现,然后就可以在所有基于词库的分词算法之间无缝切换了。 
        ps,对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段,就应该使用一个最简单的分词器,按空格分词就可以了。

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/fan-yuan/p/9360429.html
Copyright © 2011-2022 走看看