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

释放双眼,带上耳机,听听看~!

原文:Lucene.Net 2.3.1开发介绍 —— 二、分词(五)

2.1.3 二元分词

**** 

上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只要出现这个字,不管它出现在什么位置。这就产生了上一小节开头讲的,对准确性产生了极大干扰。比如,如果有一段这样的话:“这是一个
英雄!他有无法用
词汇形容的孤
单,但是他并没有用言
语来表达。”这句话包含了“英 语 单 词”这四个字,但是却和“英语单词”一点关系都没有。首先想到的解决方法,就是把句子按词来划分,那么就能有效的降低干扰。最简单的解决方法,莫过于每两个字组成一个部分。

 

下面来构造核心算法。首先我们期望,只有中文(广义上指双字节文字,比如日文,韩文也在这个范围。)是按照二元拆分,而符号则是单符号拆分,对于英文则保持原样。因此,需要一个判断当前字符类型的函数。首先,构造一个枚举,如代码2.1.3.1。

 

 

代码 2.1.3.1

 

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

///
 

<summary>

///
 Char类型枚举,用于分词中类型状态比较

///
 

</summary>

public
 
enum
 CharType
{
None,   
//
默认值,不可识别类型

    English,    
//
拉丁字符,用英文标识

    Chinese,    
//
CJK字符,以中文代表

    Number,     
//
阿拉伯数字

    Control     
//
控制符号,指控制符号已经各种标点符号等

}

 

接下来需要有一个函数能够识别字符,把字符类型转换成我们需要的CharType。

 

 

代码 2.1.3.2

 

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

 1Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
/**/
///
 

<summary>

 2
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
///
 获取Char类型

 3
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
///
 

</summary>

 4
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
///
 
<param name="c">
字符

</param>

 5
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
///
 
<returns>
返回类型
</returns>

 6Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
public
 
static
 CharType GetCharType(
char
 c)

 7
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 8
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)    
switch
 (
char
.GetUnicodeCategory(c))

 9
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)    
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

10
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
//
大小写字符判断为英文字符

11
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
case
 System.Globalization.UnicodeCategory.UppercaseLetter:

12
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
case
 System.Globalization.UnicodeCategory.LowercaseLetter:

13
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            
return
 CharType.English;

14
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
//
其它字符判断问中文(CJK)

15
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
case
 System.Globalization.UnicodeCategory.OtherLetter:

16
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            
return
 CharType.Chinese;

17
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
//
十进制数字

18
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
case
 System.Globalization.UnicodeCategory.DecimalDigitNumber:

19
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            
return
 CharType.Number;

20
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
//
其他都认为是符号

21
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
default
:

22
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            
return
 CharType.Control;

23
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)    }

24
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)}

 

代码2.1.3.2粗略完成了我们想要的功能。现在就可以构造我们想要的算法了。

 

 

代码 2.1.3.3

 

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

  1Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
using
 System;

  2
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
using
 System.Collections.Generic;

  3
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
using
 System.Text;

  4
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
using
 Lucene.Net.Analysis;

  5
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
using
 System.IO;

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

  7
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
namespace
 Test.Analysis

  8
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

  9
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)    
public
 
class
 DoubleTokenizer : Tokenizer

 10
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)    
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 11
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
/**/
///
 

<summary>

 12
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 保持传入的流

 13
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 

</summary>

 14Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
private
 TextReader reader;

 15
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
/**/
///
 

<summary>

 16
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 控制分词器只打开一次

 17
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 

</summary>

 18Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
private
 
bool
 done 

 
true
;

 19
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
/**/
///
 

<summary>

 20
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 保存分词结果

 21
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 

</summary>

 22Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
private
 List
<
Token

 tokenlist;

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

 24
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
public
 DoubleTokenizer(TextReader reader)

 25
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 26
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            
this
.reader 

 reader;

 27
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        }

 28
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
/**/
///
 

<summary>

 29
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 上一个字的类型

 30
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 

</summary>

 31Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
private
 CharType lastype 

 CharType.None;

 32
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
/**/
///
 

<summary>

 33
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 当前读取到分词的记录数

 34
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 

</summary>

 35Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
private
 
int
 ptr 

 
0
;

 36
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
/**/
///
 

<summary>

 37
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 重写Next方法

 38
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 

</summary>

 39
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 
<param name="result"></param>

 40
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
///
 
<returns></returns>

 41Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
        
public
 
override
 Token Next(Token result)

 42
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)        
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 43
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            
if
 (done)   
//
第一次可以运行,运行后将被设置为false,在一个实例中只会运行一次

 44
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
            
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 45
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                done 

 
false
;

 46
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
string
 text 

 reader.ReadToEnd();

 47
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
//
输入为空,则返回结束符号

 48
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                
if
 (
string
.IsNullOrEmpty(text))

 49
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
return
 
null
;

 50
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
//
初始化分词结果

 51
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                tokenlist 

 
new
 List
<
Token

();

 52
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
//
缓冲器,主要用于暂时保存英文数字字符。

 53
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                StringBuilder buffer 

 
new
 StringBuilder();

 54
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                Token token;

 55
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
for
 (
int
 i 

 
0
; i 
<
 text.Length; i
++
)

 56
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 57
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
char
 nowchar 

 text[i];

 58
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
char
 nextchar 

 
new
 
char
();

 59
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    CharType nowtype 

 GetCharType(nowchar);

 60
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
if
 (i 
<
 text.Length 

 
1
)  
//
取下一个字符

 61
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                        nextchar 

 text[i 
+
 
1
];

 62
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
//
状态转换

 63
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                    
if
 (nowtype 
!=
 lastype)

 64
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 65
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        lastype 

 nowtype;

 66
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
if
 (buffer.Length 

 
0
)

 67
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 68
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            token 

 
new
 Token(buffer.ToString(), i 

 buffer.Length, i);

 69
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            tokenlist.Add(token);

 70
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            buffer.Remove(
0
, buffer.Length);

 71
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        }

 72
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    }

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

 74
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
switch
 (nowtype)

 75
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 76
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
case
 CharType.None:

 77
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
case
 CharType.Control:

 78
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            
goto
 SingleChar;

 79
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
case
 CharType.Chinese:

 80
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            
break
;

 81
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
case
 CharType.English:

 82
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
case
 CharType.Number:

 83
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            buffer.Append(nowchar);

 84
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                            
continue
;

 85
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    }

 86
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
//
处理连续两个中文字符

 87
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                    
if
 (GetCharType(nextchar) 

 CharType.Chinese)

 88
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
{

 89
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        token 

 
new
 Token(nowchar.ToString() 
+
 nextchar.ToString(), i, i 
+
 
2
);

 90
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        tokenlist.Add(token);

 91
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        i
++
;

 92
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                        
continue
;

 93
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    }

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

 95
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                SingleChar:     
//
处理单个字符

 96
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                    token 

 
new
 Token(nowchar.ToString(), i, i 
+
 
1
);

 97
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    tokenlist.Add(token);

 98
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                    
continue
;

 99
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                }

100
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)                
//
返回第一个分词结果,并且把指针移向下一位

101
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
                
return
 tokenlist[ptr
++
];

102
Lucene.Net 2.3.1开发介绍 —— 二、分词(五)            }

103

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索