一、中文分詞方式:
中文分詞幾種常用的方式:
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