Lucene.net中文分词探究

一、 中文分词方式:

中文分词几种常用的方式:

A. 单字分词

单字分词,顾名思义,就是按照中文一个字一个字地进行分词。如:我们是中国人,效果:我 \ 们 \ 是 \ 中 \ 国 \ 人。

B. 二分法

二分法,就是按两个字进行切分。如:我们是中国人,效果:我们 \ 们是 \ 是中 \ 中国 \ 国人。

C. 词库分词

词库分词,就是按某种算法构造词然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法如:我们是中国人,通成效果为:我们 \ 是 \ 中国 \ 中国人。

二、 Lucene.net 中五种中文分词效果探究

在 Lucene.net 中有很多种分词器,不同分词器使用了不同的分词算法,有不同的分词效果,满足不同的需求!在这里主要是看看其中五中分词器用来对中文切词的效果。五中分词器分别为: StandardTokenizer ,CJKTokenizer ,ChinessTokenizer ,LowerCaseTokenizer ,WhitespaceTokenizer;

   下面就来测试一下它们切词的效果:

   测试目标:是否支持中文词语,英文单词,邮件,IP 地址,标点符号,数字,数学表达式的切割。
   测试文字:“我们是中国人; 我们 是 人;we are chiness; 172.16.34.172;youpeizun@126.com;#$*;85*34;58 <st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="69" numbertype="1" negative="False" unitname="”" w:st="on">69” </st1:chmetcnv>

 

测试StandardTokenizer 的分词情况如下:

我/ 们/ 是/ 中/ 国/ 人/ 我/ 们/ 是/ 人/ we/ are/ chiness/ 172.16.34.172/ youpeizun@126.com/ 85/ 34/ 58/ 69/

测试CJKTokenizer 的分词情况如下:

我们/ 们是/ 是中/ 中国/ 国人/ 我们/ 是/ 人/ we/ chiness/ 172/ 16/ 34/ 172/ youpe

izun/ 126/ com/ #/ 85/ 34/ 58/ 69/

测试ChinessTokenizer 的分词情况如下:

我/ 们/ 是/ 中/ 国/ 人/ 我/ 们/ 是/ 人/ we/ are/ chiness/ 172/ 16/ 34/ 172/ youp

eizun/ 126/ com/ 85/ 34/ 58/ 69/

测试LowerCaseTokenizer 的分词情况如下:

我们是中国人/ 我们/ 是/ 人/we/are/chiness/youpeizun/com/

测试WhitespaceTokenizer 的分词情况如下:

我们是中国人;/ 我们/ 是/ 人;we/are/chiness;/172.16.34.172;youpeizun@126.com;#$*;85*

34;58/69/

 

测试代码:
一、 中文分词方式:

中文分词效果测试代码
using  System;
using  System.Collections.Generic;
using  System.Text;
using  Lucene.Net.Analysis.Standard;
using  Lucene.Net.Analysis;
using  Lucene.Net.Index;
using  Lucene.Net.Documents;
using  System.IO;
using  Lucene.Net.Analysis.Cn;
using  Lucene.Net.Analysis.CJK;
// date:11-02-2007
// home page: http://www.cnblogs.com/xuanfeng
// author:peizunyou
namespace  TokenizerTest
{
    
class  TokenizerTest
    
{
        
static   void  Main( string [] args)
        
{
            
string  testText  =   " 我们是中国人; 我们 是 人;we are chiness; 172.16.34.172;youpeizun@126.com;#$*;85*34;58 69 " ;
            Console.WriteLine(
" 测试文字: " + testText);
            Console.WriteLine(
" 测试StandardTokenizer的分词情况如下: " );
            TestStandardTokenizer(testText);
            Console.WriteLine(
" 测试CJKTokenizer的分词情况如下: " );
            TestCJKTokenizer(testText);
            Console.WriteLine(
" 测试ChinessTokenizer的分词情况如下: " );
            TestChinessTokenizer(testText);
            Console.WriteLine(
" 测试LowerCaseTokenizer的分词情况如下: " );
            TestLowerCaseTokenizer(testText);
            Console.WriteLine(
" 测试WhitespaceTokenizer的分词情况如下: " );
            TestWhitespaceTokenizer(testText);
            Console.Read();
        }

        
static    void  TestStandardTokenizer( string  text)
        
{
            TextReader tr 
=   new  StringReader(text);

            StandardTokenizer st 
=   new  StandardTokenizer(tr);
         
            
while  (st.Next()  !=   null )
            
{

                Console.Write(st.token.ToString()
+ " " );
            }

            Console.WriteLine();
        }

        
static   void  TestCJKTokenizer( string  text)
        
{
            TextReader tr 
=   new  StringReader(text);
            
int  end  =   0 ;
            CJKAnalyzer cjkA 
=   new  CJKAnalyzer();
            TokenStream ts 
=  cjkA.TokenStream(tr);
            
while (end < text.Length)
            
{
                Lucene.Net.Analysis.Token t 
=  ts.Next();
                end 
=  t.EndOffset();
                Console.Write(t.TermText()
+ " " );
            }

            Console.WriteLine();
        }

        
static   void  TestChinessTokenizer( string  text)
        
{
            TextReader tr 
=   new  StringReader(text);
            ChineseTokenizer ct 
=   new  ChineseTokenizer(tr);
            
int  end  =   0 ;
            Lucene.Net.Analysis.Token t;
            
while (end < text.Length)
            
{
                t 
=  ct.Next();
                end 
=  t.EndOffset();
                Console.Write(t.TermText()
+ " " );
            }

            Console.WriteLine();
        
        }

        
        
static   void  TestLowerCaseTokenizer( string  text)
        
{
            TextReader tr 
=   new  StringReader(text);
            SimpleAnalyzer sA 
=   new  SimpleAnalyzer();
            
// SimpleAnalyzer使用了LowerCaseTokenizer分词器
            TokenStream ts  =  sA.TokenStream(tr);
            Lucene.Net.Analysis.Token t;
            
while ((t = ts.Next()) != null )
            
{
                Console.Write(t.TermText()
+ " / " );
            }

            Console.WriteLine();
        }

        
static   void  TestWhitespaceTokenizer( string  text)
        
{
            TextReader tr 
=   new  StringReader(text);
   
            WhitespaceAnalyzer sA 
=   new  WhitespaceAnalyzer();
            TokenStream ts 
=  sA.TokenStream(tr);
            Lucene.Net.Analysis.Token t;
            
while  ((t  =  ts.Next())  !=   null )
            
{
                Console.Write(t.TermText() 
+   " / " );
            }

            Console.WriteLine();
        }

    }

}

 

中文分词几种常用的方式:

A. 单字分词

单字分词,顾名思义,就是按照中文一个字一个字地进行分词。如:我们是中国人,效果:我 \ 们 \ 是 \ 中 \ 国 \ 人。

B. 二分法

二分法,就是按两个字进行切分。如:我们是中国人,效果:我们 \ 们是 \ 是中 \ 中国 \ 国人。

C. 词库分词

词库分词,就是按某种算法构造词然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法如:我们是中国人,通成效果为:我们 \ 是 \ 中国 \ 中国人。

二、 Lucene.net 中五种中文分词效果探究

在 Lucene.net 中有很多种分词器,不同分词器使用了不同的分词算法,有不同的分词效果,满足不同的需求!在这里主要是看看其中五中分词器用来对中文切词的效果。五中分词器分别为: StandardTokenizer ,CJKTokenizer ,ChinessTokenizer ,LowerCaseTokenizer ,WhitespaceTokenizer;

   下面就来测试一下它们切词的效果:

   测试目标:是否支持中文词语,英文单词,邮件,IP 地址,标点符号,数字,数学表达式的切割。
   测试文字:“我们是中国人; 我们 是 人;we are chiness; 172.16.34.172;youpeizun@126.com;#$*;85*34;58 <st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="69" numbertype="1" negative="False" unitname="”" w:st="on">69” </st1:chmetcnv>

 

测试StandardTokenizer 的分词情况如下:

我/ 们/ 是/ 中/ 国/ 人/ 我/ 们/ 是/ 人/ we/ are/ chiness/ 172.16.34.172/ youpeizun@126.com/ 85/ 34/ 58/ 69/

测试CJKTokenizer 的分词情况如下:

我们/ 们是/ 是中/ 中国/ 国人/ 我们/ 是/ 人/ we/ chiness/ 172/ 16/ 34/ 172/ youpe

izun/ 126/ com/ #/ 85/ 34/ 58/ 69/

测试ChinessTokenizer 的分词情况如下:

我/ 们/ 是/ 中/ 国/ 人/ 我/ 们/ 是/ 人/ we/ are/ chiness/ 172/ 16/ 34/ 172/ youp

eizun/ 126/ com/ 85/ 34/ 58/ 69/

测试LowerCaseTokenizer 的分词情况如下:

我们是中国人/ 我们/ 是/ 人/we/are/chiness/youpeizun/com/

测试WhitespaceTokenizer 的分词情况如下:

我们是中国人;/ 我们/ 是/ 人;we/are/chiness;/172.16.34.172;youpeizun@126.com;#$*;85*

34;58/69/

 

测试代码:
测试代代码下载

中文分词效果测试代码
using  System;
using  System.Collections.Generic;
using  System.Text;
using  Lucene.Net.Analysis.Standard;
using  Lucene.Net.Analysis;
using  Lucene.Net.Index;
using  Lucene.Net.Documents;
using  System.IO;
using  Lucene.Net.Analysis.Cn;
using  Lucene.Net.Analysis.CJK;
// date:11-02-2007
// home page: http://www.cnblogs.com/xuanfeng
// author:peizunyou
namespace  TokenizerTest
{
    
class  TokenizerTest
    
{
        
static   void  Main( string [] args)
        
{
            
string  testText  =   " 我们是中国人; 我们 是 人;we are chiness; 172.16.34.172;youpeizun@126.com;#$*;85*34;58 69 " ;
            Console.WriteLine(
" 测试文字: " + testText);
            Console.WriteLine(
" 测试StandardTokenizer的分词情况如下: " );
            TestStandardTokenizer(testText);
            Console.WriteLine(
" 测试CJKTokenizer的分词情况如下: " );
            TestCJKTokenizer(testText);
            Console.WriteLine(
" 测试ChinessTokenizer的分词情况如下: " );
            TestChinessTokenizer(testText);
            Console.WriteLine(
" 测试LowerCaseTokenizer的分词情况如下: " );
            TestLowerCaseTokenizer(testText);
            Console.WriteLine(
" 测试WhitespaceTokenizer的分词情况如下:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值