Lucene.net中文分词探究
一、中文分詞方式:
中文分詞幾種常用的方式:
A. 單字分詞
單字分詞,顧名思義,就是按照中文一個(gè)字一個(gè)字地進(jìn)行分詞。如:我們是中國人,效果:我/們/是/中/國/人。
B. 二分法
二分法,就是按兩個(gè)字進(jìn)行切分。如:我們是中國人,效果:我們/們是/是中/中國/國人。
C. 詞庫分詞
詞庫分詞,就是按某種算法構(gòu)造詞然后去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認(rèn)為是最理想的中文分詞算法如:我們是中國人,通成效果為:我們/是/中國/中國人。
二、Lucene.net中五種中文分詞效果探究
在Lucene.net中有很多種分詞器,不同分詞器使用了不同的分詞算法,有不同的分詞效果,滿足不同的需求!在這里主要是看看其中五中分詞器用來對中文切詞的效果。五中分詞器分別為:StandardTokenizer,CJKTokenizer,ChinessTokenizer,LowerCaseTokenizer,WhitespaceTokenizer;
?? 下面就來測試一下它們切詞的效果:
?? 測試目標(biāo):是否支持中文詞語,英文單詞,郵件,IP地址,標(biāo)點(diǎn)符號,數(shù)字,數(shù)學(xué)表達(dá)式的切割。
?? 測試文字:“我們是中國人; 我們 是 人;we are chiness; 172.16.34.172;youpeizun@126.com;#$*;85*34;58 69”
| 測試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. 單字分詞
單字分詞,顧名思義,就是按照中文一個(gè)字一個(gè)字地進(jìn)行分詞。如:我們是中國人,效果:我/們/是/中/國/人。
B. 二分法
二分法,就是按兩個(gè)字進(jìn)行切分。如:我們是中國人,效果:我們/們是/是中/中國/國人。
C. 詞庫分詞
詞庫分詞,就是按某種算法構(gòu)造詞然后去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認(rèn)為是最理想的中文分詞算法如:我們是中國人,通成效果為:我們/是/中國/中國人。
二、Lucene.net中五種中文分詞效果探究
在Lucene.net中有很多種分詞器,不同分詞器使用了不同的分詞算法,有不同的分詞效果,滿足不同的需求!在這里主要是看看其中五中分詞器用來對中文切詞的效果。五中分詞器分別為:StandardTokenizer,CJKTokenizer,ChinessTokenizer,LowerCaseTokenizer,WhitespaceTokenizer;
?? 下面就來測試一下它們切詞的效果:
?? 測試目標(biāo):是否支持中文詞語,英文單詞,郵件,IP地址,標(biāo)點(diǎn)符號,數(shù)字,數(shù)學(xué)表達(dá)式的切割。
?? 測試文字:“我們是中國人; 我們 是 人;we are chiness; 172.16.34.172;youpeizun@126.com;#$*;85*34;58 69”
| 測試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();
????????}
????}
}
?
三、??????????? 五中分詞器代碼設(shè)計(jì)探究
?????? 從下面分詞器代碼設(shè)計(jì)中的靜態(tài)結(jié)構(gòu)圖可以清晰的看出其繼承關(guān)系。無論是哪個(gè)分詞器,其分詞最終實(shí)現(xiàn)的算法都是在Next()方法,想深入了解,請看其相關(guān)源碼。
Feedback
三、??????????? 五中分詞器代碼設(shè)計(jì)探究
?????? 從下面分詞器代碼設(shè)計(jì)中的靜態(tài)結(jié)構(gòu)圖可以清晰的看出其繼承關(guān)系。無論是哪個(gè)分詞器,其分詞最終實(shí)現(xiàn)的算法都是在Next()方法,想深入了解,請看其相關(guān)源碼。
Feedback
總結(jié)
以上是生活随笔為你收集整理的Lucene.net中文分词探究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的根文件系统中的proc文件夹
- 下一篇: WMI使用集锦