程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> Lucene.net中文分詞探究

Lucene.net中文分詞探究

編輯:關於C#
 

一、中文分詞方式:

中文分詞幾種常用的方式:

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

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved