• 中文分词器性能比较


     

    摘要:本篇是本人在Solr的基础上,配置了中文分词器,并对其进行的性能测试总结,具体包括

    使用mmseg4j、IKAnalyzer、Ansj,分别从创建索引效果、创建索引性能、数据搜索效率等方面进行衡量。

    具体的Solr使用方法假设读者已有了基础,关于Solr的性能指标见前期Solr博文

    前提:       Solr提供了一整套的数据检索方案,一台四核CPU16G内存的机器,千兆网络
    需求:       1、对Solr创建索引的效率有一定的要求。

                 2、中文分词速度要快,搜索速度也要快

                 3、中文分词准确率有一定的要求

    说明:      以下是在Solr上分别配置不同的中文分词器,它们之间的比较


    1.      中文分词

    1.1  中文分词器概述

    名称

    最近更新

    速度(网上情报)

    扩展性支持、其它

    mmseg4j

    2013

    complex 60W/s (1200 KB/s)

    simple 100W/s (1900 KB/s)

    使用sougou词库,也可自定义

    (complexsimpleMaxWord)

    IKAnalyzer

    2012

    IK2012 160W/s (3000KB/s)

    支持用户词典扩展定义、支持自定义停止词

    (智能细粒度)

    Ansj

    2014

    BaseAnalysis 300W/s

    hlAnalysis 40W/s

    支持用户自定义词典,可以分析出词性,有新词发现功能

    paoding

    2008

    100W/s

    支持不限制个数的用户自定义词库

     

    注意:

    中文分词器可能与最新版本Lucene不兼容,配置好运行时出现TokenStream contractviolation错误,对于mmseg4j需要更改com.chenlb.mmseg4j.analysis.MMSegTokenizer源码,添加super.reset()reset()内,重新编译后替换原jar

     

    1.2  mmseg4j

    创建索引效果:

    FieldValue内容:

    京華时报ぼおえ2009123日报道,뭄내ㅠㅛㅜ치ㅗ受一股来自中西伯利亚的强冷空气影响,本市出现大风降温天气,白天最高气温只有零下7摄氏度celsius degree,同时伴有67级的偏北风。

    在词库中补充:

    京華、뭄내ぼおえ受一股来

     

    类型

    结果

    textMaxWord

    京華|时报||||2009||1||23||报道|||||||||一股||||西|||||||空气|影响|本市|出现|大风|降温|天气|白天|最高|气温|只有|零下|7|摄氏||celsius|degree|同时|伴有|6||7||||北风

    textComplex

    京華|时报|ぼおえ|2009||1||23||报道|뭄내ㅠㅛ||||受一股来|||西伯利亚|||冷空气|影响|本市|出现|大风|降温|天气|白天|最高气温|只有|零下|7|摄氏度|celsius|degree|同时|伴有|6||7||||北风

    textSimple

    京華|时报|ぼおえ|2009||1||23||报道|뭄내ㅠㅛ||||受一股来||中西||||||冷空气|影响|本市|出现|大风|降温|天气|白天|最高气温|只有|零下|7|摄氏度|celsius|degree|同时|伴有|6||7||||北风

     

    创建索引效率:

    17个各种类型字段,在solr博文中字段基础上,选一空string类型字段改为新类型,并写入文本内容(原纯文本Size约为400BSolrInputDocument对象Size约为1130B)。

    文本内容以词库中任选20词拼成的句子,每词大约3字,一句大约60字。

    总数据量为2000W条数据,与2.2节相同配置。

    字段类型

    创建时间(s)

    索引大小(GB)

    网络(MB/s)

    速率(W/s)

    textMaxWord

    3115

    4.95

    6.0

    0.64 (38W/s)

    textComplex

    4860

    4.3

    5.0

    0.41 (25W/s)

    textSimple

    3027

    4.32

    6.5

    0.66 (40W/s)

    string

    2350

    9.08

    8.0

    0.85 (57W/s)

     

    速度:在与“solr博文http://www.cnblogs.com/wgp13x/p/3742653.html”中1.2节相同配置的情况下,分词索引创建速度要差于不使用分词的。

    大小:分词索引大小要小于不使用分词的,经测试分词字段配置成autoGeneratePhraseQueries="false"对索引大小几乎没有影响

     

    数据搜索效率:

    文本内容以词库中任选20词拼成的句子,每词大约3字,一句大约60字,总数据量为2000W条数据。

    字段类型

    关键词

    搜索时间(ms)

    结果()

    textMaxWord

    一不做二不休

    180

    2556

    textComplex

    一不做二不休

    59

    2648

    textSimple

    一不做二不休

    62

    2622

    string

    *一不做二不休*

    20000

    2689

    textMaxWord

    一个国家两种制度

    22

    2620

    textComplex

    一个国家两种制度

    12

    2687

    textSimple

    一个国家两种制度

    10

    2670

    string

    *一个国家两种制度*

    15500

    2657

    textMaxWord

    一些

    24

    15999

    textComplex

    一些

    11

    2687

    textSimple

    一些

    9

    2665

    string

    *一些*

    14200

    15758

    textMaxWord

    转辗反侧

    15

    2622

    textComplex

    转辗反侧

    5

    2632

    textSimple

    转辗反侧

    9

    2676

    string

    *转辗反侧*

    15600

    2665

     

    补充:

    对于非中文、数字、英文词汇,包括繁体字,在词典中加入新词汇即可。

    mmseg4j对于“都是先从容易的做起”,不能把“容易”分出来,分词结果为“都是||从容|||做起”。

    网上推荐使用textMaxWord类型分词。

     

    1.3  IKAnalyzer

    创建索引效果:

    FieldValue内容、在词库中补充均同1.2

    分词字段配置autoGeneratePhraseQueries="false"

     

    类型

    结果

    细粒度

    京華|时报|ぼおえ|2009||1||23|日报||报道|뭄내ㅠㅛ||||受一股来|一股|||来自|中西|西伯利亚|西伯|伯利|||强冷空气|冷空气|空气|影响|本市|出现|大风|降温|天气|白天|最高|高气|气温|只有||零下|||7|摄氏度|摄氏||celsius|degree|同时|伴有||6||7|||偏北风|偏北|北风

     

    创建索引效率:

    字段类型

    创建时间(s)

    索引大小(GB)

    网络(MB/s)

    速率(W/s)

    细粒度

    3584

    5.06

    6.0

    0.56 (33W/s)

     

    速度:与1.2比较,分词索引创建速度要略差于使用mmseg4j分词的。

    大小:分词索引大小要略大于使用mmseg4j分词的。

     

    数据搜索效率:

    字段类型

    关键词

    搜索时间(ms)

    结果()

    细粒度

    一不做二不休

    400

    5949255

    细粒度

    一个国家两种制度

    500

    6558449

    细粒度

    一些

    300

    5312103

    细粒度

    转辗反侧

    15

    10588

     

    补充:

    mmseg4jtextMaxWord,“一不做二不休”被分为:一|不做|二不|不休;

    IKAnalyzer中细粒度,“一不做二不休”被分为:一不做二不休||不做|二不休||不休;

    因此同样使用autoGeneratePhraseQueries="false",“一不做二不休”搜索,IKAnalyzer搜索出来的结果要远多于mmseg4j

    1.4  Ansj

    创建索引效果:

    FieldValue内容同1.2,没有补充词库。

     

    <fieldType name="text_ansj"class="solr.TextField">

                                <analyzertype="index">

                                         <tokenizerclass="org.ansj.solr.AnsjTokenizerFactory" conf="ansj.conf"rmPunc="true"/>

                                </analyzer>

                                <analyzertype="query">

                                         <tokenizerclass="org.ansj.solr.AnsjTokenizerFactory" analysisType="1"rmPunc="true"/>

                                </analyzer>

    </fieldType>

     

    结果

    京华|时报||||2009|1|23|报道||||||||||一股|来自||西伯利亚|||强冷空气|冷空气|影响||本市|出现|大风|降温|天气||白天|最高|气温||只有||零下|7摄氏度|摄氏|摄氏度|celsius||degree||同时||伴有||6||7|||偏北风|北风|

     

        “京華”二字被分词后变成了“京华”,据朋友介绍,它有将生僻字改字的Bug

     

    创建索引效率:

    字段类型

    创建时间(s)

    索引大小(GB)

    网络(MB/s)

    速率(W/s)

    细粒度

    3815

    5.76

    5.2

    0.52 (31W/s)

     

    速度:与1.21.3比较,分词索引创建速度要略差于使用mmseg4jIKAnalyzer分词的。

    大小:分词索引大小要略大于使用mmseg4jIKAnalyzer分词的。

     

    数据搜索效率:

    关键词

    搜索时间(ms)

    结果()

    一不做二不休

    200

    2478

    一个国家两种制度

    15

    0

    一些

    25

    15665

    转辗反侧

    6

    2655

     

    1.5  总结

    按分词后的结果进行搜索,若在分词字段配置autoGeneratePhraseQueries="false",则是搜索条件先分词,再使用分词在结果中搜索,默认的是trueautoGeneratePhraseQueries="false"对创建索引速度没影响,对搜索结果有影响。也可以修改SolrQueryPasser,对于输入的一个字符串,先进行相应分词,再使用分词结果在索引集中搜索。

    精确或模糊*搜索,都是以词为单位搜索。精确搜索是指返回所有包含分词的结果。

    分词器能对wordletterdigit等进行识别。

    对于不使用分词的String类型进行搜索,只能通过模糊搜索*,搜到连字,以字为单位搜索。

    在分词索引内搜索,速度较快;不分词,需要遍历所有文档,速度较慢。

    如果需要分词的话,那分词速度是主要瓶颈。

    综合考虑,mmseg4j是首选的中文分词器。

     

    如有需要具体的测试代码,可以跟本人联系。



    作者:Angel 
    欢迎转载或分享,但请务必声明文章出处。
    如果文章对您有帮助,希望你能推荐关注

    王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。

    Email:aitanjupt@hotmail.com

    QQ:289770363 

  • 相关阅读:
    关于SQLServer数据库中字段值为NULL,取出来该字段放在DataTable中,判断datatable中该字段值是否为NULL的三种方法
    关于web程序中使用KindEditor向数据库插入带有格式的数据时出现的问题
    使用再生龙对ubuntu16.04系统完全备份与还原
    mysql数据库操作指令汇总
    ubuntu安装supervisor以及使用supervisor启动.net core进程
    c#小数取整
    nuget.server搭建及实际测试
    mysql主从同步+mycat读写分离+.NET程序连接mycat代理
    EasyNVR-流媒体服务详解
    Js实现子窗体给父窗体的元素赋值
  • 原文地址:https://www.cnblogs.com/wgp13x/p/3748764.html
Copyright © 2020-2023  润新知