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 <chmetcnv w:st="on" unitname="”" sourcevalue="69" hasspace="False" negative="False" numbertype="1" tcsc="0">69<span><span>”</span></span></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/

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

中文分词效果测试代码
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingLucene.Net.Analysis.Standard;
usingLucene.Net.Analysis;
usingLucene.Net.Index;
usingLucene.Net.Documents;
usingSystem.IO;
usingLucene.Net.Analysis.Cn;
usingLucene.Net.Analysis.CJK;
//date:11-02-2007
//homepage:http://www.cnblogs.com/xuanfeng
//author:peizunyou
namespaceTokenizerTest
{
classTokenizerTest
{
staticvoidMain(string[]args)
{
stringtestText="我们是中国人;我们是人;wearechiness;172.16.34.172;youpeizun@126.com;#$*;85*34;5869";
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();
}

staticvoidTestStandardTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);

StandardTokenizerst
=newStandardTokenizer(tr);

while(st.Next()!=null)
{

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

Console.WriteLine();
}

staticvoidTestCJKTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);
intend=0;
CJKAnalyzercjkA
=newCJKAnalyzer();
TokenStreamts
=cjkA.TokenStream(tr);
while(end<text.Length)
{
Lucene.Net.Analysis.Tokent
=ts.Next();
end
=t.EndOffset();
Console.Write(t.TermText()
+"/");
}

Console.WriteLine();
}

staticvoidTestChinessTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);
ChineseTokenizerct
=newChineseTokenizer(tr);
intend=0;
Lucene.Net.Analysis.Tokent;
while(end<text.Length)
{
t
=ct.Next();
end
=t.EndOffset();
Console.Write(t.TermText()
+"/");
}

Console.WriteLine();

}


staticvoidTestLowerCaseTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);
SimpleAnalyzersA
=newSimpleAnalyzer();
//SimpleAnalyzer使用了LowerCaseTokenizer分词器
TokenStreamts=sA.TokenStream(tr);
Lucene.Net.Analysis.Tokent;
while((t=ts.Next())!=null)
{
Console.Write(t.TermText()
+"/");
}

Console.WriteLine();
}

staticvoidTestWhitespaceTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);

WhitespaceAnalyzersA
=newWhitespaceAnalyzer();
TokenStreamts
=sA.TokenStream(tr);
Lucene.Net.Analysis.Tokent;
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 <chmetcnv w:st="on" unitname="”" sourcevalue="69" hasspace="False" negative="False" numbertype="1" tcsc="0">69<span><span>”</span></span></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/

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

中文分词效果测试代码
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingLucene.Net.Analysis.Standard;
usingLucene.Net.Analysis;
usingLucene.Net.Index;
usingLucene.Net.Documents;
usingSystem.IO;
usingLucene.Net.Analysis.Cn;
usingLucene.Net.Analysis.CJK;
//date:11-02-2007
//homepage:http://www.cnblogs.com/xuanfeng
//author:peizunyou
namespaceTokenizerTest
{
classTokenizerTest
{
staticvoidMain(string[]args)
{
stringtestText="我们是中国人;我们是人;wearechiness;172.16.34.172;youpeizun@126.com;#$*;85*34;5869";
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();
}

staticvoidTestStandardTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);

StandardTokenizerst
=newStandardTokenizer(tr);

while(st.Next()!=null)
{

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

Console.WriteLine();
}

staticvoidTestCJKTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);
intend=0;
CJKAnalyzercjkA
=newCJKAnalyzer();
TokenStreamts
=cjkA.TokenStream(tr);
while(end<text.Length)
{
Lucene.Net.Analysis.Tokent
=ts.Next();
end
=t.EndOffset();
Console.Write(t.TermText()
+"/");
}

Console.WriteLine();
}

staticvoidTestChinessTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);
ChineseTokenizerct
=newChineseTokenizer(tr);
intend=0;
Lucene.Net.Analysis.Tokent;
while(end<text.Length)
{
t
=ct.Next();
end
=t.EndOffset();
Console.Write(t.TermText()
+"/");
}

Console.WriteLine();

}


staticvoidTestLowerCaseTokenizer(stringtext)
{
TextReadertr
=newStringReader(text);
SimpleAnalyzersA
=newSimpleAnalyzer();
//SimpleAnalyzer使用了LowerCaseTokenizer分词器
TokenStreamts=sA.TokenStream(tr);
Lucene.Net.Analysis.Tokent;
while((t=ts.Next())!=null)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值