Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
原文:Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来。目前Lucene.Net的分词库很不完善,实际应用价值不高。唯一能用在实际场合的StandardAnalyzer类,效果也不是很好。内置在Lucene.Net里的分词都被放在项目的Analysis目录下,也就是Lucene.Net.Analysis命名空间下。分词类的命名一般都是以“Analyzer”结束,比如StandardAnalyzer,StopAnalyzer,SimpleAnalyzer等。全部继承自Analyzer类。而它们一般各有一个辅助类,一般以”“Tokenizer”结尾,分词的逻辑大都在辅助类完成。
使用Lucene.Net,要很好地使用Lucene.Net,必须理解分词,甚至能自己扩展分词。如果只使用拉丁语系,那么使用内置的分词可能足够了,但是对于中文肯定是不行的。目前中文方面的分词分为单字分词,二元分词,词库匹配,语义理解这几种。StandardAnalyzer类就是按单字分,二元分就是把两个字作为一组拆分,而词库的话肯定是有一个复杂的对比过程,语义理解的就更加复杂了。这是分词的方式,而匹配的方式也分为正向和逆向两种,一般逆向要优于正向,但是写起来也要复杂一些。
1、内置分词器
本节将详细介绍Lucene.Net内置分词的效果,工作过程,及整体结构。
1.1、分词效果
1.1.1 如果得到分词效果
如果得到分词效果?有效的方式就是进行测试。这里将引入自动测试的方法,这样更加便于测试,将使用NUnit来完成。Nunit的简单实用方法见附录二。
创建一个新的项目,命名为Test。步骤如图 1.1.1.1 - 1.1.1.2
图1.1.1.1
图 1.1.1.2
点确定,就加入了新项目Test,选择类库模板。再引用Nunit.framework类库。如图 1.1.1.3。
图 1.1.1.3
再按第一章节的步骤引入Lucene.Net类库。先来试试SimpleAnalyzer类的效果。在Test项目中添加SimpleAnalyzerTest,代码 1.1.1.1。
代码 1.1.1.1
Code 1using System; 2using System.Collections.Generic; 3using System.Text; 4using NUnit.Framework; 5using Lucene.Net.Analysis; 6using System.IO; 7namespace Test 8{ 9 [TestFixture]10 public class SimpleAnalyzerTest11 {12 [Test]13 public void ReusableTokenStreamTest()14 {15 string testwords = "我是中国人,I can speak chinese!";1617 SimpleAnalyzer simple = new SimpleAnalyzer();18 TokenStream ts = simple.ReusableTokenStream("", new StringReader(testwords));19 Token token;20 while ((token = ts.Next()) != null)21 {22 Console.WriteLine(token.TermText());23 }24 ts.Close();25 }26 }27}28
运行结果:
我是中国人
i
can
speak
chinese
查看这个结果,基本可以确定,SimpleAnalyzer分词就是以空格或符号为断点,把句子分析出来。对于英文大写还会执行一个转换到小写的操作。
1.1.2 内置分词的分词效果
按照1.1.1节介绍的方式,就可以分析分析效果了。不过这样写出来的测试代码过于麻烦,改造一下。
(1)、在Test项目中新建Analysis目录;
(2)、在Analysis下建立TestData类,代码1.1.2.1;
代码1.1.2.1
Code 1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Test.Analysis 6{ 7 public class TestData 8 { 9 public static string TestWords = "我是中国人,I can speak chinese!";10 }11}12
(3)、建立TestFactory类,代码1.1.2.2
代码1.1.2.2
Code 1using System; 2using System.Collections.Generic; 3using System.Text; 4using Lucene.Net.Analysis; 5using System.IO; 6 7namespace Test.Analysis 8{ 9 public class TestFactory10 {11 public static void TestFunc(Analyzer analyzer)12 {13 TokenStream ts = analyzer.ReusableTokenStream("", new StringReader(TestData.TestWords));14 Token token;15 while ((token = ts.Next()) != null)16 {17 Console.WriteLine(token.TermText());18 }19 ts.Close();20 }21 }22}
(4)、建立AllAnalysisTest类,代码1.1.2.3
代码1.1.2.3
Code 1using System; 2using System.Collections.Generic; 3using System.Text; 4using NUnit.Framework; 5using Lucene.Net.Analysis; 6using Lucene.Net.Analysis.Standard; 7namespace Test.Analysis 8{ 9 [TestFixture]10 public class AllAnalysisTest11 {12 [Test]13 public void TestMethod()14 {15 List<Analyzer> analysis = new List<Analyzer>() { 16 new KeywordAnalyzer(),17 new SimpleAnalyzer(),18 new StandardAnalyzer(),19 new StopAnalyzer(),20 new WhitespaceAnalyzer() };2122 for (int i = 0; i < analysis.Count; i++)23 {24 Console.WriteLine(analysis[i].ToString() + "结果:");25 Console.WriteLine("--------------------------------");26 TestFactory.TestFunc(analysis[i]);27 Console.WriteLine("--------------------------------");28 }29 }30 }31}32
(5)、运行。
对于TestWords = "我是中国人,I can speak chinese!";测试结果:
Lucene.Net.Analysis.KeywordAnalyzer结果:
--------------------------------
我是中国人,I can speak chinese!
--------------------------------
Lucene.Net.Analysis.SimpleAnalyzer结果:
--------------------------------
我是中国人
i
can
speak
chinese
--------------------------------
Lucene.Net.Analysis.Standard.StandardAnalyzer结果:
--------------------------------
我
是
中
国
人
i
can
speak
chinese
--------------------------------
Lucene.Net.Analysis.StopAnalyzer结果:
--------------------------------
我是中国人
i
can
speak
chinese
--------------------------------
Lucene.Net.Analysis.WhitespaceAnalyzer结果:
--------------------------------
我是中国人,I
can
speak
chinese!
--------------------------------
换一句话试试:更改TestData类TestWords字段值为“我是中国人,I'can speak chinese,hello world,沪江小Q!”。测试结果:
Lucene.Net.Analysis.KeywordAnalyzer结果:
--------------------------------
我是中国人,I'can speak chinese,hello world,沪江小Q!
--------------------------------
Lucene.Net.Analysis.SimpleAnalyzer结果:
--------------------------------
我是中国人
i
can
speak
chinese
hello
world
沪江小q
--------------------------------
Lucene.Net.Analysis.Standard.StandardAnalyzer结果:
--------------------------------
我
是
中
国
人
i'can
speak
chinese
沪
江
小
q
--------------------------------
Lucene.Net.Analysis.StopAnalyzer结果:
--------------------------------
我是中国人
i
can
speak
chinese
hello
world
沪江小q
--------------------------------
Lucene.Net.Analysis.WhitespaceAnalyzer结果:
--------------------------------
我是中国人,I'can
speak
chinese,hello
world,沪江小Q!
--------------------------------
对于这几种分词效果基本可以看出来了。
KeywordAnalyzer分词,没有任何变化;
SimpleAnalyzer对中文效果太差;
StandardAnalyzer对中文单字拆分;
StopAnalyzer和SimpleAnalyzer差不多;
WhitespaceAnalyzer只按空格划分。
当然,这只是个粗略的结果。
Lucene.Net 2.3.1开发介绍 —— 二、分词(一)的更多相关文章
- Lucene.Net 2.3.1开发介绍 —— 二、分词(六)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(六) Lucene.Net的上一个版本是2.1,而在2.3.1版本中才引入了Next(Token)方法重载,而ReusableStrin ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(三)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(三) 1.3 分词器结构 1.3.1 分词器整体结构 从1.2节的分析,终于做到了管中窥豹,现在在Lucene.Net项目中添加一个类关 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(四)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(二)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(二) 1.2.分词的过程 1.2.1.分词器工作的过程 内置的分词器效果都不好,那怎么办?只能自己写了!在写之前当然是要先看看内置的分词 ...
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(二)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(四)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了. 代码 4.3.4.1 Analyzer anal ...
随机推荐
- 【开源框架EGOTableViewPullRefresh的研究】
EGOTableViewPullRefresh:点击打开链接https://github.com/enormego/EGOTableViewPullRefresh RootViewController ...
- android项目中刷新activity界面
android项目中在sqlite数据库插入/更新/删除数据后: 1. 刷新当前activity界面数据(手动刷新): 在activity类下新增一个refresh()方法: /** * 刷新, 这样 ...
- Sql 参数的使用
代码片段: a)声明实例 1.声明SQLCommand实例. SqlCommand cmd = new SqlCommand(); 2.声明SqlDataAdapter实例. SqlDataAdapt ...
- C-整数划分
将正整数 n 表示成一系列正整数之和, n=n1+n2+…+nk, 其中 n1>=n2>=…>=nk>=1 , k>=1 . 正整数 n 的这种表示称为正整数 n 的划分 ...
- IOS Notification 通知中心
1. 通知中心概述 通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信.实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象. ...
- SignalR系列教程:在MVC5中使用SignalR
本章主要内容: 1:向MVC5添加SignaIr 2: 什么是集线器,如何创建集线器 3: 客户端通过jqery调用集线器 本文还是延续“SignaIR快速入门”中聊天室的例子进行讲解.首先我们通过V ...
- IntelliJ IDEA导出Java 可执行Jar包
原文:IntelliJ IDEA导出Java 可执行Jar包 保证自己的Java代码是没有问题的,在IDEA里面是可以正常运行的,然后,按下面步骤: 打开File -> Project Stru ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测下
上篇我们完成了地图的信息获取和碰撞检测,这篇我们整合到程序中. 在这之前我们改造一下Tank类,使它更加模块化,共容易理解: 1.改造后的Tank类声明如下: class Tank : public ...
- traceroute工作原理
traceroute, 也就是 trace route,跟踪路由.这个程序最早是Van Jacobson实现的.源代码在网上能够找到,只是我还没有去找.基本的原理是IP路由过程中对数据包TTL(T ...
- ORACLE实例恢复过程详细分析--使用dump、BBED等多种工具结合分析
---友情提示,内容较多,可以从博文左上的+目录选择小节方便阅读. 实验思路: --实验相关TRACE文件:http://download.csdn.net/detail/q947817003/6 ...