中文分词器性能比较

2024-08-27 11:32
文章标签 比较 性能 中文 分词器

本文主要是介绍中文分词器性能比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:

http://www.cnblogs.com/wgp13x/p/3748764.html

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

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

 

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

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

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

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

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


1.      中文分词

1.1  中文分词器概述

名称

最近更新

速度(网上情报)

扩展性支持、其它

mmseg4j

2013

complex 60W字/s (1200 KB/s)

simple 100W字/s (1900 KB/s)

使用sougou词库,也可自定义

(complex\simple\MaxWord)

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内容:

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

在词库中补充:

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

 

类型

结果

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约为400B,SolrInputDocument对象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

 

补充:

mmseg4j中textMaxWord,“一不做二不休”被分为:一|不做|二不|不休;

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.2、1.3比较,分词索引创建速度要略差于使用mmseg4j、IKAnalyzer分词的。

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

 

数据搜索效率:

关键词

搜索时间(ms)

结果(条)

一不做二不休

200

2478

一个国家两种制度

15

0

一些

25

15665

转辗反侧

6

2655

 

1.5  总结

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

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

分词器能对word、letter、digit等进行识别。

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

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

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

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

 

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


这篇关于中文分词器性能比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111541

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Java慢查询排查与性能调优完整实战指南

《Java慢查询排查与性能调优完整实战指南》Java调优是一个广泛的话题,它涵盖了代码优化、内存管理、并发处理等多个方面,:本文主要介绍Java慢查询排查与性能调优的相关资料,文中通过代码介绍的非... 目录1. 事故全景:从告警到定位1.1 事故时间线1.2 关键指标异常1.3 排查工具链2. 深度剖析:

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运