日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Lucene.net中文分词探究

發(fā)布時(shí)間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucene.net中文分词探究 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、中文分詞方式:

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

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)源碼。

<script type="text/javascript"> // </script>

Feedback

三、??????????? 五中分詞器代碼設(shè)計(jì)探究

?????? 從下面分詞器代碼設(shè)計(jì)中的靜態(tài)結(jié)構(gòu)圖可以清晰的看出其繼承關(guān)系。無論是哪個(gè)分詞器,其分詞最終實(shí)現(xiàn)的算法都是在Next()方法,想深入了解,請看其相關(guān)源碼。

<script type="text/javascript"> // </script>

Feedback

總結(jié)

以上是生活随笔為你收集整理的Lucene.net中文分词探究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。