DotLucene源码浅读: Lucene.Net.Analysis

面试中常考的数学题——截木棍、圆上取点、赛马、红蓝墨水,测试毒药、坐到正确座位问题 文章目录1.将一根木棒截成三段,问能够组成三角形的概率;2.在圆上任取三点,问能够组成锐角、直角、钝角三角形的概率;3.共有25匹马,找出最快的3匹,只有5个赛道,每次比赛只能得到5匹马的速度排序,最少需要多少次比赛;4 有两瓶红蓝墨水,体积一样,现在从红墨水中舀一勺加入蓝墨水中,搅拌均匀后,在从蓝墨水中舀一勺加到红墨水中,试问这两瓶墨水哪瓶纯度更高。 1.将一根木棒截成三段,问能够组成三角形的概率; 来源:https://blog.csdn.net/weixin_41245919/article/deta 阅读详情

本系列笔记将以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();

            }

txtResultWinformTextBox,输出结果如下:

(,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表示这个字在文本中StartOffsetEndOffset,最后的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。以上纯属个人拙见。

 

手把手入门YOLO到改进优化教程 | 【P2基础篇】数据标注+环境搭建+模型训练 本节以 YOLO自定义目标检测训练为主线,带你从零开始完成 数据标注 → 环境搭建 → 模型训练 → 结果的流程。使用labelImg制作符合YOLO格式的自定义数据集。在Windows基于 Python + Conda 创建独立虚拟环境,安装 PyTorch + CUDA + ultralytics,配置 PyCharm 运行环境。本节不仅使用自定义数据集进行演示,同时也用公开数据集训练 YOLO,查看训练日志与可视化结果(PR、P/R/F1 曲线等)等。 阅读详情

相关推荐

Lucene.Net.Analysis.Cn.dll

C# Lucene.Net .Analysis.Cn.dll和Lucene.Net.dll两个文件

DotLucene源码笔记(1) : Lucene.Net.Analysis

本系列笔记将以DotLucene的命名空间组织行文,阅DotLucene版本是1.9.RC1,并且以更好的使用而非研究为目的阅。也就是说要避难就易拉。0), DotLucene主要命名空间概览: 命名空间 功能说

jxufewbt的专栏 1172

Lucene.Net.Analysis.MMSeg:基于Chih-Hao Tsai的MMSeg算法(http

Lucene.Net.Analysis.MMSeg 基于芷浩仔的MMSeg算法( )实现的中文分词器,并实现lucene.net的分析器以方便在Lucene.Net中使用。本代码来源于王员外( )基于Java版的翻译,升级到了最新版本Lucene.Net(≥3.0.3),并包含简单示例和NuGet安装包。 NuGet地址 使用 一共三种搜索模式供选择: 简单分析器 Analyzer analyzer = new SimpleAnalyzer (); MaxWordAnalyzer Analyzer analyzer = new MaxWordAnalyzer (); 复杂分析仪 Analyzer analyzer = new ComplexAnalyzer (); 具体使用方法,请参考代码中的示例和lucene.net的文档

Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来。目前Lucene.Net的分词库很不完善,实际应用价值不高。唯一能用在实际场合的StandardAnalyzer类,效果也不是很好。内置在Lucene.Net里的分词都被放在项目的Analysis目录下,也就是Lucene.Net.Analysis命名空间下。分词类的命名一般都是以“Analyzer”结束,比如StandardAn...

weixin_34217711的博客 207

测试分词工具Lucene.Net.Analysis.PanGu(盘古分词)

学习盘古分词Lucene.Net.Analysis.PanGu包的基本用法、

gc_2299的博客 1012

探索 Lucene.Net.Analysis.PanGu:基于潘 Dickens 的 .NET 全文检索库

探索 Lucene.Net.Analysis.PanGu:基于潘 Dickens 的 .NET 全文检索库 去发现同类优质开源项目:https://gitcode.com/ 项目简介 在软件开发中,全文搜索引擎已经成为数据检索和信息提取的关键工具。 是一个专为 .NET 开发者设计的 Lucene.NET 扩展,它引入了高效的潘 Dickens 分词算法,为你的全文检索应用带来更准确、更快速的搜索...

gitblog_00015的博客 453

Lucene代码分析2

2021SC@SDUSC 我在小组中分配的任务为对Lucene中的Analysis和codecs进行分析 我阅DotLucene版本是1.9.RC1 该文章主要对Analysis进行初步分析 Analysis包的主要功能为:语言分析器,主要用于切词,支持中文主要是扩展此类 1),Lucene.Net.Analysis命名空间分析。 在Lucene.Net.Analysis下,类的关系,可以看成有三个继承体系: 词法分析器(Analyzer) :词法过滤和分析的类,实际上是对分词器, 过滤.

qq_45878116的博客 159

DotLucene源码笔记(1) : Lucene.Net.Analysis 【转】

本系列笔记将以DotLucene的命名空间组织行文,阅DotLucene版本是1.9.RC1,并且以更好的使用而非研究为目的阅。也就是说要避难就易拉。 0), DotLucene主要命名空间概览: 命名空间 功能说明 Lucene.Net.Analysis 语言分析器,主要用于切词,支持中文主要是扩展此类 Lucene.Net.Documen...

weixin_30668887的博客 86

Lucene.net源码笔记(1) : Lucene.Net.Analysis

本系列笔记将以DotLucene的命名空间组织行文,阅DotLucene版本是1.9.RC1,并且以更好的使用而非研究为目的阅。也就是说要避难就易拉。0), DotLucene主要命名空间概览: 命名空间 功能说明

kwklover 1492

Lucene.net 搜索引擎技术(Analysis包/token详解)

在一个朋友的介绍下开始接触lucene,在网上看了大量的资料,觉得搜索引擎的门槛太高,几乎放弃了对他的了解和学习。对于中文的搜索关键是如何创建中文分词!由于Lucene.Net.Analysis.Cn支持中文分词,我们做一个简单的token事例。using System;using System.Collections;using System.ComponentModel;using Syste

Cendy.Chen的专栏 3165

lucene.net学习六——多Field多索引文件的查询

在实际的需求中,我们需要输入一个关键语句,希望能搜索到标题中含有此关键词或者内容中也还有此关键语句的文章,这就是一个多Field查询的问题 当然多Field之间的关系可能为“与”也有可能为“或”。一般情况下,都在同一个目录索引下搜索,但是如果索引被分成很多文件,存在不同的地方,因此又会有一个多索引文件搜索的问题。下面通过代码演示: 首先编写建索引的代码: using System;usi...

weixin_30823001的博客 147

lucene.NET详细使用与优化详解

lucene.NET详细使用与优化详解 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 1.2 lucene能做什么 要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底

LYBWWP 3447

Lucene.Net C#分词操作帮助类

using Lucene.Net.Analysis; using Lucene.Net.Analysis.PanGu; using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.QueryParsers; using Lucene.Net.Search; using Lucene.Net.Store; using System; using System.Collections.Generic; using System.IO.

风生晚凉的博客 578

lucenelucene.NET详细使用与优化详解

1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者googleDesktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。1.2 lucene能做什么要 回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你 ...

weixin_30902675的博客 365

python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)

python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行!python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大作业&毕业设计)python实现基于OpenCV双目视觉测量被摄物体的尺寸项目源码+文档说明(期末大

上一篇: lucene系统结构分析
下一篇: google何时灭亡?互联网的预言
iptvspace
博客等级 码龄18年 21粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值