一、中文分詞方式:
中文分詞幾種常用的方式:
A. 單字分詞
單字分詞,顧名思義,就是按照中文一個字一個字地進行分詞。如:我們是中國人,效果:我/們/是/中/國/人。
B. 二分法
二分法,就是按兩個字進行切分。如:我們是中國人,效果:我們/們是/是中/中國/國人。
C. 詞庫分詞
詞庫分詞,就是按某種算法構造詞然後去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認為是最理想的中文分詞算法如:我們是中國人,通成效果為:我們/是/中國/中國人。
二、Lucene.net中五種中文分詞效果探究
在Lucene.net中有很多種分詞器,不同分詞器使用了不同的分詞算法,有不同的分詞效果,滿足不同的需求!在這裡主要是看看其中五中分詞器用來對中文切詞的效果。五中分詞器分別為:StandardTokenizer,CJKTokenizer,ChinessTokenizer,LowerCaseTokenizer,WhitespaceTokenizer;
下面就來測試一下它們切詞的效果:
測試目標:是否支持中文詞語,英文單詞,郵件,IP地址,標點符號,數字,數學表達式的切割。
測試文字:“我們是中國人; 我們 是 人;we are chiness; 172.16.34.172;[email protected];#$*;85*34;58 69”
測試StandardTokenizer的分詞情況如下:
我/ 們/ 是/ 中/ 國/ 人/ 我/ 們/ 是/ 人/ we/ are/ chiness/ 172.16.34.172/ [email protected]/ 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;[email protected];#$*;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;
[email protected];#$*;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;[email protected];#$*;85*34;58 69”
測試StandardTokenizer的分詞情況如下:
我/ 們/ 是/ 中/ 國/ 人/ 我/ 們/ 是/ 人/ we/ are/ chiness/ 172.16.34.172/ [email protected]/ 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;[email protected];#$*;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;
[email protected];#$*;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();

}

}

}
三、 五中分詞器代碼設計探究
從下面分詞器代碼設計中的靜態結構圖可以清晰的看出其繼承關系。無論是哪個分詞器,其分詞最終實現的算法都是在Next()方法,想深入了解,請看其相關源碼。

Feedback
三、 五中分詞器代碼設計探究
從下面分詞器代碼設計中的靜態結構圖可以清晰的看出其繼承關系。無論是哪個分詞器,其分詞最終實現的算法都是在Next()方法,想深入了解,請看其相關源碼。

Feedback