DotLucene源码浅读笔记(1) : Lucene.Net.Analysis 【转】
本系列笔记将以DotLucene的命名空间组织行文,阅读的DotLucene版本是1.9.RC1,并且以更好的使用而非研究为目的阅读。也就是说要避难就易拉。
0), DotLucene主要命名空间概览:
命名空间 |
功能说明 |
Lucene.Net.Analysis |
语言分析器,主要用于切词,支持中文主要是扩展此类 |
Lucene.Net.Documents |
索引存储时的文档结构管理,类似关系型数据库的表结构 |
Lucene.Net.Index |
索引管理,包括索引建立、删除等 |
Lucene.Net.QueryParsers |
查询分析器,实现查询关键词间的运算,如与、或、非等 |
Lucene.Net.Search |
检索管理,根据查询条件,检索得到结果 |
Lucene.Net.Store |
数据存储管理,主要包括一些底层的I/O操作 |
Lucene.Net.Util |
一些公用类 |
1), Lucene.Net.Analysis命名空间分析。
在Lucene.Net.Analysis下,类的关系,可以看成有三个继承体系:
词法分析器(Analyzer) :词法过滤和分析的类,实际上是对分词器, 过滤器的综合包装类。
分词器(Tokenizer):对文本进行分词,可能是单字,词,二元切分等等。
过滤器(TokenFilter):对由分词器分词后的Token进行过滤,比如无意词(a ,是,的等等)或者其他的指定的需要过滤的词
下面看看每一个继承体系都有那些相关类:
词法分析器(Analyzer)的相关类类关系图:
分词器(Tokenizer) 的相关类类关系图:
过滤器(TokenFilter) 的相关类类关系图:
上面的三个类关系体系里涉及到的主要类(概念)的简单说明:
类名 |
功能说明 |
Analyzer |
分析器基类,词法过滤和分析的类,即把文本分解成TokenStream,即Token的序列。Analyzer只是做包装,主要还是Tokenizer在起作用 |
StopAnalyzer |
Analyzer扩展类之一,SimpleAnalyzer功能基础上加上过滤词功能 |
StandardAnalyzer |
Analyzer扩展类之一,也是最常用的分析器,支持中文,日文等,单字切分。 |
SimpleAnalyzer |
Analyzer扩展类之一,将除去字符之外的符号全部过滤掉,并且将所有的字符小写(大写)化 |
Token |
DotLucene最基本的单位,以单字切分则每个单字为一个Token,如果以中文分词来切分则每个词为一个Token |
TokenStream |
Token的序列 |
Tokenizer |
继承于TokenStream,用于分词。一般扩展的自定义的分词都应该继承这个类 |
StandardTokenizer |
Tokenizer扩展类之一,也是最常用的,支持中文,基于单字切分 |
TokenFilter |
继承于TokenStream的子类,用于过滤。一般拓展的自定义的过滤类都应该继承该类 |
StandardFilter |
TokenFilter拓展类之一,过滤英文字符的复数和dot(.)号. |
LowerCaseFilter |
对所有英文小写化 |
StopFilter |
过滤掉指定的过滤词 |
在所有上面这个类之中,我们经常用的也是所有Analyzer中最复杂的就是StandardAnalyzer(本身不复杂,其调用的分词器复杂),下面对这个类做一个简单的分析:
StandardAnalyzer最核心,最主要的方法:
public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
{
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
result = new StopFilter(result, stopSet);
return result;
}
就是调用StandardTokenizer分词器对文本分词。然后调用三个过滤器(作用表格有写),其中的StandardTokenizer类及相关的类比较复杂,目前还没有完全理解。所以下面的文字是需要用批判眼光来阅读的。说白了,我是一边猜,一边看源码。以求的最准确的理解。
先做个简单的测试,通过结果来分析:
string sTemp = "我们是中国人,We are chinese";
Analyzer analyzer = new StandardAnalyzer() ;
StringReader sr = new StringReader(sTemp);
TokenStream ts = analyzer.TokenStream(sr);
Lucene.Net.Analysis.Token token = null;
while ((token = ts.Next()) != null)
{
this.txtResult.Text += token.ToString();
}
txtResult是Winform的TextBox,输出结果如下:
(我,0,1,type=<CJ>)(们,1,2,type=<CJ>)(是,2,3,type=<CJ>)(中,3,4,type=<CJ>)(国,4,5,type=<CJ>)(人,5,6,type=<CJ>)(we,7,9,type=<ALPHANUM>)(chinese,14,21,type=<ALPHANUM>)
拿(我,0,1,type=<CJ>)来分析,因为是单字切分,所以分解成了一个一个的字。其中0,1表示”我”这个字在文本中StartOffset,EndOffset,最后的type表示文字的类型是英文,数字,还是是中文等等。在rc1.9中支持的type可以在Lucene.Net.Analysis.Standard下的StandardTokenizerConstants类看到。而CJ代表的是中文和日文的集合。不仅仅代表中文哦。
分析到这里,我有一个疑问。DotLucene是怎么区别不同的文字的呢?那就是根据unicode编码的范围区别不同的文字。不过这句话,是我猜出来,但我始终没能在DotLucene源码中找到能支持我这句话的原代码。所以猜测始终还是猜测。鉴于本次阅读DotLucene的目的是为了更好的使用,而非研究,所以对Lucene.Net.Analysis命名空间的分析只能就此打住。
后记:
据我所知,现在已经有很多种第三方的Analyzer。SourceForce上的有一个ChineseAnalyzer,基于二元分词算法实现中文分词。还有基于词库实现中文分词的Analyzer,一般认为。使用针对中文优化过的Analyzer可以提高搜索准确度,但是对于大多数的搜索应用,StandardAnalyzer 绝对够用,好用。为什么呢?打个比方,拿”国际经济”四个字来说,如果是StandardAnalyzer的话,无论搜索 国际,经济,还是国际经济都能搜索到。但是如果用中文分词,那就难说。那就看你的中文分词怎么分 “国际经济’拉(二元分词算法的Analyzer不需要考虑这个问题)。我在给CS做的搜索系统,也是用StandardAnalyzer,绝对不用其他的Analyzer。以上纯属个人拙见。
转载于:https://www.cnblogs.com/ddlzq/archive/2009/12/27/1633549.html
DotLucene源码浅读笔记(1) : Lucene.Net.Analysis 【转】相关推荐
- DotLucene源码浅读笔记(1) : Lucene.Net.Analysis
本系列笔记将以DotLucene的命名空间组织行文,阅读的DotLucene版本是1.9.RC1,并且以更好的使用而非研究为目的阅读.也就是说要避难就易拉. 0), DotLucene主要命名空间概览 ...
- Spark Mlib TFIDF源码详读 笔记
2019独角兽企业重金招聘Python工程师标准>>> 在提取文本特征时,经常用到TF-IDF算法.Spark Mlib实现了该算法.下面是Spark Mlib中,TF_IDF算法调 ...
- socketserver 源码浅读
import SocketServer class MyServer(SocketServer.BaseRequestHandler):def handle(self): #函数名必须是handle, ...
- Java 之 LongAdder 源码浅读
LongAdder 是什么? AtomicInteger 在低并发场景下可以效率性能还可以,但是在高并发下场景下,大量线程空转会造成 CPU 极具飙升.所以这里提出了 LongAdder,解决高并发场 ...
- 若川邀你进 源码共读 群~长期交流学习
大家好,我是若川.这是一个愉快的周六~ 估计还是有很多读者不知道我.若川名字由来是取自:上善若水,海纳百川.顺便放两篇文章.我读源码的经历,跟各位读者朋友分享下公众号运营策略 加我微信进 源码共读 群 ...
- 祝大家七夕快乐,邀你源码共读,顺带发点红包
大家好,我是若川.这是一个普通的周六.只不过又叫七夕节,祝大家七夕节快乐~所以就不更新技术文了. 估计还是有很多读者不知道我.若川名字由来是取自:上善若水,海纳百川.顺便放两篇文章.我读源码的经历,跟 ...
- 我与掘金合作出了源码共读第一期,首发超400人报名,快来参与~
大家好,我是若川. 最近有不少新朋友关注我.对我不是很了解的,或许可以读我的2021年度总结.诚邀各位新老读者朋友参加源码共读活动. 同时我和掘金合作,共同出了源码共读第一期,11月25日--12月2 ...
- 2015.07.20MapReducer源码解析(笔记)
MapReducer源码解析(笔记) 第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读取的 ...
- 4月,诚邀你参加源码共读,学会看源码,打开新世界!开阔视野
大家好,我是若川.很多关注我的新朋友可能不知道我组织了源码共读活动~ 也有很多人不知道我是谁.有人以为我是80后.有人以为我是全职自媒体等等.若川的 2021 年度总结,弹指之间 这篇文章写了我是16 ...
最新文章
- 请使用 WITH MOVE 选项来标识该文件的有效位置。
- 构建高性能的ASP.NET应用(五)-如何开始寻找性能瓶颈
- Dataframe花样切片~(Python)
- Oracle sqlplus 各种登录方式
- IScroll5 上拉加载更多 及 item点击处理。
- bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】
- 有没有高效的记视频笔记方法?--天若OCR文字识别记视频笔记
- Nvidia DX10 Lighting例子解析
- linux之一些比较新但是常用的命令(expr ag tree cloc stat tmux axel)
- P2774-方格取数问题【网络流,最大流,最小割】
- 字符集和编码规范:ASCII,Unicode和UTF-8, latin1,BIG5,GBK
- 首提 Database Plus 新理念,SphereEx 获数百万美元天使融资,接棒 ShardingSphere 打造新型分布式生态
- Vision Transformer太火!这门开源课也火了!十小时现场coding带你玩转ViT 爆款SOTA算法!...
- Java案例:简易记事本
- Docker多机创建mysqlCluster 8.0群集
- 计算机在化学中的应用与探索,计算机在化学中的应用
- Android开发笔记(一百三十一)水波图形与水波动画
- python优先队列,队列和栈
- 什么是 Service Mesh?
- 将文件放到Android模拟器的SD卡
热门文章
- as3 htmlText 的bug
- Centos6.4下zabbix的安装配置
- python3下的IE自动化模块PAMIE
- 纽约时报:昔日王者Digg能否实现中兴?【独家】
- python watchdog休眠_python watchdog
- python软件设计数据分析统计服_Python 和 R 数据分析/挖掘工具互查
- c++ 字典_再来瞄一眼字典与集合?
- 会议指南二维码生成_包装和准备技术会议的指南
- raspberry pi_如何将Raspberry Pi配置为微控制器
- Docker 1.0对OpenStack意味着什么