Apache Solr 中文分词

article/2025/9/10 15:59:00
中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空 格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这 一层上,中文比之英文要复杂的多、困难的多。
           存在中文分词技术是由于中文在基本文法上有其特殊性,具体表现在:
           1.与英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,词语之间没有分隔。 古代汉语中除了连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词书写的必要。而现代汉语中双字或多字词居多,一个字不再等同于一个词。
           2.在中文里,“词”和“词组”边界模糊
           现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和短语的边界很难去区分。
           例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准,同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现混乱,难度很大。
           中文分词的方法其实不局限于中文应用,也被应用到英文处理,如手写识别,单词之间的空格就很清楚,中文分词方法可以帮助判别英文单词的边界。
           
           中文分词对于搜索引擎来说,最重要的并不是找到所有结果,因为在上百亿的网页中找到所有结果没有太多的意义,没有人能看得完,最重要的是把最相关的结果排 在最前面,这也称为相关度排序。中文分词的准确与否,常常直接影响到对搜索结果的相关度排序。从定性分析来说,搜索引擎的分词算法不同,词库的不同都会影 响页面的返回结果

            常见的开源中文分词技术主要有
         

智呈分词


  功能性能
功能描述:
1.新词自动识别
对词典中不存在的词,可以自动识别,对词典的依赖较小;
2.词性输出
分词结果中带有丰富的词性;
3.动态词性输出
分词结果中的词性并非固定,会根据不同的语境,赋予不同的词性;
4.特殊词识别
比如化学、药品等行业词汇,地名、品牌、媒体名等;
5.智能歧义解决
根据内部规则,智能解决常见分词歧义问题;
6.多种编码识别
自动识别各种单一编码,并支持混合编码;
7.数词量词优化
自动识别数量词;
性能介绍:
处理器:AMD Athlon II x2 250 3GHZ
单线程大于833KB/s,多线程安全。

MFSOU中文分词PHP扩展

一个PHP函数实现中文分词。使分词更容易,使用如下图:
SCWS调用示例搜索引擎之阿堂Solr学习笔记系列2(基础篇:中文分词)

SCWS

Hightman 开发的一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典,并辅以一定的专有名称,人名,地名,数字年 代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒,大概是1.5MB文本/秒,支持PHP4和 PHP 5。

FudanNLP

FudanNLP主要是为中文 自然语言处理而开发的工具包,也包含为实现这些任务的 机器学习算法和数据集。本工具包及其包含数据集使用LGPL3.0许可证。开发语言为Java。功能包括中文分词等,不需要字典支持。

ICTCLAS

这 是最早的中文开源分词项目之一,ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中 都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,API不超过200KB,各种词典数据压缩后不到 3M.ICTCLAS全部采用C/C++编写,支持Linux、FreeBSD及Windows系列 操作系统,支持C/C++、C#、Delphi、Java等主流的开发语言。

HTTPCWS

HTTPCWS 是一款基于 HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展。

CC-CEDICT

一个中文词典开源项目,提供一份以汉语拼音为中文辅助的汉英辞典,截至2009年2月8日,已收录82712个单词。其词典可以用于中文分词使用,而且不存在版权问题。Chrome中文版就是使用的这个词典进行中文分词的。

IK

IKAnalyzer是一个开源的,基于 java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

Paoding

Paoding(庖丁解牛分词)基于Java的开源中文分词组件,提供lucene和solr 接口,具有极  高效率和  高扩展性。引入隐喻,采用完全的 面向对象设计,构思先进。
高效率:在PIII 1G内存个人机器上, 1秒可准确分词  100万汉字。
采用基于  不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。
能够对未知的词汇进行合理解析。
仅支持 Java语言。

MMSEG4J

MMSEG4J基于Java的开源中文分词组件,提供lucene和solr 接口:
1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
2.MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。 mmseg4j 已经实现了这两种分词算法。

盘古分词

盘古分词是一个基于.net 平台的开源中文分词组件,提供lucene(.net 版本) 和HubbleDotNet的接口
高效:Core Duo 1.8 GHz 下单线程 分词速度为 390K 字符每秒
准确:盘古分词采用字典和统计结合的分词算法,分词准确率较高。
功能:盘古分词提供中文人名识别,简繁混合分词,多元分词,英文词根化,强制一元分词,词频优先分词, 停用词过滤,英文专名提取等一系列功能。

Jcseg

jcseg是使用Java开发的一个中文分词器,使用流行的mmseg算法实现。 [3]
1。mmseg四种过滤算法,分词准确率达到了98.4%以上。
2。支持自定义词库。在lexicon文件夹下,可以随便添加/删除/更改词库和词库内容,并且对词库进行了分类,词库整合了《现代汉语词典》和cc-cedict辞典。
3。词条拼音和同义词支持,jcseg为所有词条标注了拼音,并且词条可以添加同义词集合,jcseg会自动将拼音和同义词加入到分词结果中。
4。中文数字和分数识别,例如:"四五十个人都来了,三十分之一。"中的"四五十"和"三十分之一",并且jcseg会自动将其转换为对应的阿拉伯数字。
5。支持中英混合词的识别。例如:B超,x射线。
6。支持基本单字单位的识别,例如2012年。
7。良好的英文支持,自动识别电子邮件,网址,分数,小数,百分数……。
8。智能圆角半角转换处理。
9。特殊字母识别:例如:Ⅰ,Ⅱ
10。特殊数字识别:例如:①,⑩
11。配对标点内容提取:例如:最好的Java书《java编程思想》,‘畅想杯黑客技术大赛’,被《,‘,“,『标点标记的内容。
12。智能中文人名识别。中文人名识别正确率达94%以上。
jcseg佩带了jcseg.properties配置文档,使用文本编辑器就可以自主的编辑其选项,配置适合不同应用场合的分词应用。例如:最大匹配分词数,是否开启中文人名识别,是否载入词条拼音,是否载入词条同义词……。

friso

friso是使用c语言开发的一个中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入到其他程序中,例如:MySQL,PHP等。并且提供了一个php中文分词扩展robbe。
1。只支持UTF-8编码。【源码无需修改就能在各种平台下编译使用,加载完20万的词条,内存占用稳定为14M。】。
2。mmseg四种过滤算法,分词准确率达到了98.41%。
3。支持自定义词库。在dict文件夹下,可以随便添加/删除/更改词库和词库词条,并且对词库进行了分类。
4。词库使用了friso的Java版本jcseg的简化词库。
5。支持中英混合词的识别。例如:c语言,IC卡。
7。很好的英文支持,电子邮件,网址,小数,分数,百分数。
8。支持阿拉伯数字基本单字单位的识别,例如2012年,5吨,120斤。
9。自动英文圆角/半角,大写/小写转换。
并且具有很高的分词速度:简单模式:3.7M/秒,复杂模式:1.8M/秒。

     Ok,上面说了这么多,下面阿堂以一个IKAnlyzer中文分词演示一下

      首先,我以solr自带的英文分词技术进行测试

    搜索引擎之阿堂Solr学习笔记系列2(基础篇:中文分词)

搜索引擎之阿堂Solr学习笔记系列2(基础篇:中文分词)

         通过上面阿堂的测试,很显然solr自带的分词type解析查询是不准确的,对中文词语分词不准确,句子中的每一个字都分成一个词了。

            E:\systemcondition\apache-tomcat-7.0.37\solr_home\solr\conf\schema.xml   ( text_general对应的type配置在schema.xml文件中

          上面对应的 text_general具体描述如下

搜索引擎之阿堂Solr学习笔记系列2(基础篇:中文分词)


         然后,我在       E:\systemcondition\apache-tomcat-7.0.37\solr_home\solr\conf\schema.xml文件中增加 fieldType=textik   (当然还要在sorl对应的web项目的 E:\systemcondition\apache-tomcat-7.0.37\webapps\solr\WEB-INF\lib 目录下,放置 IKAnalyzer.jar 包,我在上篇文章  基础篇:安装篇 中 已经提到了,这里就不重复了)
    
    搜索引擎之阿堂Solr学习笔记系列2(基础篇:中文分词)


    
      〈fieldType name="textik" class="solr.TextField" > 
      〈analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
        〈analyzer type="index">   
          〈tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>   
           〈filter class="solr.StopFilterFactory"   
                    ignoreCase="true" words="stopwords.txt"/>   
            〈filter class="solr.WordDelimiterFilterFactory"   
                    generateWordParts="1"   
                    generateNumberParts="1"   
                    catenateWords="1"   
                    catenateNumbers="1"   
                    catenateAll="0"   
                    splitOnCaseChange="1"/>   
            〈filter class="solr.LowerCaseFilterFactory"/>   
            〈filter class="solr.EnglishPorterFilterFactory"   
                protected="protwords.txt"/>   
            〈filter class="solr.RemoveDuplicatesTokenFilterFactory"/>   
        〈/analyzer>
        〈analyzer type="query">   
            〈tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>   
           〈!--
          〈filter class="solr.StopFilterFactory"   
                    ignoreCase="true" words="stopwords.txt"/>   
            〈filter class="solr.WordDelimiterFilterFactory"   
                    generateWordParts="1"   
                    generateNumberParts="1"   
                    catenateWords="1"   
                    catenateNumbers="1"   
                    catenateAll="0"   
                    splitOnCaseChange="1"/>
           〈filter class="solr.LowerCaseFilterFactory"/>   
            〈filter class="solr.EnglishPorterFilterFactory"   
                protected="protwords.txt"/>   
           〈filter class="solr.RemoveDuplicatesTokenFilterFactory"/>  --> 
        〈/analyzer>          
     〈/fieldType> 

   
                 然后,停掉tomcat后,再重启 tomcat,继续测试如下
                搜索引擎之阿堂Solr学习笔记系列2(基础篇:中文分词)

         
           从上述测试图中,我们不难看出,阿堂配置的中文分词IKAnalyzer已经完全起到作用了,已经符合我们中文分词的习惯了。 至此,中文分词 IKAnalyzer技术已经成功配置到solr服务器中了。

           如果你理解上述过程后,那么阿堂要恭喜你已经基本掌握使用中文分词技术的使用了。当然,其它开源的中文分词的使用与此完全类似,只是jar包不同,实现类不同罢了。

http://chatgpt.dhexx.cn/article/T183E1g3.shtml

相关文章

【NLP】十分钟快览自然语言处理学习总结

转自:https://www.cnblogs.com/baiboy/p/learnnlp.html 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛。笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文章全部看了一遍做个整理…

复旦大学邱锡鹏教授带你梳理深度学习知识脉络(直播彩蛋)

Datawhale 作者:邱锡鹏,复旦大学教授 寄语:本文梳理了深度学习知识体系,分为机器学习、神经网络和概率图模型,同时对机器学习算法类型、深度学习原理框架等进行了梳理,帮助大家更好地学习和入手深度学习。…

npy格式的文件生成图像展示

import numpy as np import cv2 import matplotlib.pyplot as pltimage np.load("/root/userfolder/Dataset/LR_T1_T_3X_29.npy") for i in range(0,image.shape[0]):plt.imshow(image[i,:,:])cv2.imwrite(str(i)".png",image[i,:,:])plt.show() 【注意】…

CFree也能进行游戏编程!

有一本C入门书说,在Windows平台下,Visual C几乎成了C程序员的唯一选择。但是你可曾想到这一点?Visual C实在是太大了。我们有时候不得不为了更改游戏的一个很小的特性并且进行测试而在自己已经很慢的电脑上装上这个有大过1G的软件。我想安装的…

Mac sourceTree 注册码分享(sourcetree.license 许可证)

感谢大神的大腿,分享给使用Mac版sourceTree的小伙伴,最下边有大神分享的 sourcetree.license 许可证,下载可以直接使用,无须翻墙 https://www.jianshu.com/p/21733dfde911 网盘地址:https://pan.baidu.com/s/1c9nIQM…

C语言基础入门:C-Free 5下载和安装详细教程

C-Free 5 下载 C-Free 5 官网:http://www.programarts.com/cfree_ch/ 1. 点击下载 2. 选择下载C-Free 5.0 专业版 3. 安装包下载完成 C-Free 5 安装 双击刚下载的安装包,然后Next 同意协议,然后Next 安装路径不可以有空格&#xff0…

CFree注册码及破解过程【转】

C-Free官网: http://www.programarts.com/ ‍C-Free 5.0真是一个很棒的编程软件,可今天用着用着却让我注册,下面的注册码分享给大家: 用户名:tianfang 电子邮件:quart163.com 注册码:2NnUqd3s…

迅雷API:实现文件下载

今天到迅雷公司的SDK文档网站上逛了逛,竟然发现它们已经提供了完备的API接口,我心中不禁大喜,但是SDK资料中的原版开发文件已经很难找到了,幸运的是我在github上搜索到了所需的文件,在这里我已经打包完毕,点…

spring boot结合FastDFSClient做下载文件注意事项

spring boot结合FastDFSClient做下载文件注意事项 1.后台下载方法走完后,前端页面浏览器一直没出现下载框。 2.ie浏览器兼容问题。 下面的FastDFSClient类依赖fdfsclient-jar-with-dependencies.jar包 下面是后台代码。 // An highlighted block /*** 下载* retu…

导入.dmp文件的操作及一些简单错误解决

一、如何导入.dmp文件 打开cmd,输入命令:imp 用户名/密码实例名 filedmp文件路径 fully 二、出现报错 解决方法: 1、先查看dmp文件的版本号 2、查看当前Oracle的版本 在sqlplus中使用命令:select * from v$version; 效果&#…

VC++实现打开文件和打开所在文件夹的功能(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)

迅雷任务出错怎么办,如何解决迅雷任务出错

如果极速迅雷WIN10打不开或者闪退,到文件安装目录的program下,修改thunder.exe 为其他名字即可 例如 迅雷.exe 很多朋友在使用迅雷下载文件时提示“任务出错”这种情况。下面方法可能不适用于所有情况 我的是极速迅雷。 第一种方法 1.打开迅雷&#…

关闭迅雷更新到新版本的提示

每次打开迅雷都会自动检查是否是最新版本,如果不是最新版本,迅雷会一直重复弹窗弹出更新到新版本的提示: 解决方案 简介:迅雷提示升级是因为每次迅雷主程序启动时都会同时启动一个叫XLLiveUD.exe的程序,这个程序会检…

迅雷软件一直出现崩溃问题的常见解决方法

迅雷是很多人必备的下载软件,但是现在的迅雷功能越来越臃肿,所以经常出现崩溃的情况,那么如何解决迅雷崩溃的问题呢?本文将介绍常见的几种解决方法。 解决方法 方法一 利用360软件管家查看有什么问题,如果还是没有问题…

MATLAB2018a解压文件损坏,文件解压失败与压缩文件文件已经损坏的解决办法

压缩文件以减少文件大小和提高传送速度的特点而广受用户欢迎,压缩文件时一般需要电脑安装压缩软件。我们在解压的过程中电脑有的时候会提示:此解压失败或压缩文件文件已经损坏?下面小编就为大家整理了解压文件出错常见解决办法。 解决办法1&a…

java 内部错误2753_重新安装java出现错误的解决方法

之前手贱,没有从控制面板删除jre,而是把其目录下的文件永久删除。结果引起注册表出错,再重新安装的时候不停地提示错误,经历了三个错误。。折腾了挺久的。现在把它写下来给大家参考 1.第一次想重新安装却一直提示“已安装”&#…

LWIP的大文件下载数据错误

前段时间在做stm32 web下载文件的功能,遇到了一个问题。使用不同的浏览器下载得到的文件数据有所差异。通过具体分析发现使用谷歌和迅雷下载得到的文件是正确的,而使用360,搜狗之类的浏览器得到的文件数据会丢失一个包的数据,而丢…

用迅雷或者IDM下载下载百度网盘文件方法

百度网盘限速让大家在下载资料时很头疼,今天分享一个利用插件快速下载百度网盘里的资料。 连接网址: http://www.cnplugins.com/office/tampermonkey/download.html 参考网址: http://www.cnplugins.com/tool/baiduyun-tampermonkey.html…

Qt 之 模仿迅雷 根据Url获取文件信息——下

一、简述 在上篇 Qt 之 模仿迅雷 根据Url获取文件信息——上 文章中简单介绍了一下几个版本迅雷的界面变化,同时展示了这两天模仿迅雷新建任务窗口做的一个小例子。在这一篇中将讲解如何实现迅雷新建任务窗口。 首先简单看一下效果图。 二、代码之路 看代码之前需要看一下Q…

node 实现文件下载,web打开迅雷下载文件

node实现文件下载 方法一: const express require(express); const router express.Router(); const fs require(fs); const path require(path); const {errorMsg} require("../../util/apiUtils");router.get(/:fileName, async (req, res) >…