本文用到的庫下載下傳:點此下載下傳
詞庫下載下傳:點此下載下傳
将詞庫直接放到項目根目錄
詞庫設定如下:
類庫說明
詞庫檢視程式:點此下載下傳
可以在上面的程式中添加常用行業詞庫 還可以通過下面的類在程式中實作
完整的盤古release:點此下載下傳最新字典檔案下載下傳位置
http://pangusegment.codeplex.com/releases/view/47411
預設字典位置為 ..\Dictionaries 你可以通過設定PanGu.xml 檔案來修改字典的位置
Demo.exe 分詞示範程式
DictManage.exe 字典管理程式
PanGu.xml 分詞配置檔案
PanGu.HighLight.dll 高亮元件
Lucene.Net
Lucene.net是Lucene的.net移植版本,是一個開源的全文檢索引擎開發包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,是一個Library.你也可以把它了解為一個将索引,搜尋功能封裝的很好的一套簡單易用的API(提供了完整的查詢引擎和索引引擎)。利用這套API你可以做很多有關搜尋的事情,而且很友善.。開發人員可以基于Lucene.net實作全文檢索的功能。
注意:Lucene.Net隻能對文本資訊進行檢索。如果不是文本資訊,要轉換為文本資訊,比如要檢索Excel檔案,就要用NPOI把Excel讀取成字元串,然後把字元串扔給Lucene.Net。Lucene.Net會把扔給它的文本切詞儲存,加快檢索速度。
ok,接下來就細細詳解下士怎樣一步一步實作這個效果的。
Lucene.Net 核心——分詞算法(Analyzer)
學習Lucune.Net,分詞是核心。當然最理想狀态下是能自己擴充分詞,但這要很高的算法要求。Lucene.Net中不同的分詞算法就是不同的類。所有分詞算法類都從Analyzer類繼承,不同的分詞算法有不同的優缺點。
内置的StandardAnalyzer是将英文按照空格、标點符号等進行分詞,将中文按照單個字進行分詞,一個漢字算一個詞
namespace EazyCMS.Common
{
/// <summary>
/// 分詞類
/// </summary>
public class Participle
{
public List<string> list = new List<string>();
public void get_participle()
{
Analyzer analyzer = new StandardAnalyzer();
TokenStream tokenStream = analyzer.TokenStream("",new StringReader("Hello Lucene.Net,我1愛1你China"));
Lucene.Net.Analysis.Token token = null;
while ((token = tokenStream.Next()) != null)
{
//Console.WriteLine(token.TermText());
string s = token.TermText();
}
}
}
}
二進制分詞算法,每兩個漢字算一個單詞,“我愛你China”會分詞為“我愛 愛你 china”,點選檢視二進制分詞算法CJKAnalyzer。
namespace EazyCMS.Common
{
/// <summary>
/// 分詞類
/// </summary>
public class Participle
{
public List<string> list = new List<string>();
public void get_participle()
{
//Er
Analyzer analyzer = new CJKAnalyzer();
TokenStream tokenStream = analyzer.TokenStream("", new StringReader("我愛你中國China中華人名共和國"));
Lucene.Net.Analysis.Token token = null;
while ((token = tokenStream.Next()) != null)
{
Response.Write(token.TermText() + "<br/>");
}
}
}
}
這時,你肯定在想,上面沒有一個好用的,二進制分詞算法亂槍打鳥,很想自己擴充Analyzer,但并不是算法上的專業人士。怎麼辦?
天降聖器,盤古分詞,
盤古分詞的用法 首先引用以上的盤古dll 檔案
将xml檔案放在項目的根目錄下
<?xml version="1.0" encoding="utf-8"?>
<PanGuSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.codeplex.com/pangusegment">
<DictionaryPath>Dict</DictionaryPath>
<MatchOptions>
<ChineseNameIdentify>true</ChineseNameIdentify>
<FrequencyFirst>false</FrequencyFirst>
<MultiDimensionality>false</MultiDimensionality>
<EnglishMultiDimensionality>true</EnglishMultiDimensionality>
<FilterStopWords>true</FilterStopWords>
<IgnoreSpace>true</IgnoreSpace>
<ForceSingleWord>false</ForceSingleWord>
<TraditionalChineseEnabled>false</TraditionalChineseEnabled>
<OutputSimplifiedTraditional>false</OutputSimplifiedTraditional>
<UnknownWordIdentify>true</UnknownWordIdentify>
<FilterEnglish>false</FilterEnglish>
<FilterNumeric>false</FilterNumeric>
<IgnoreCapital>false</IgnoreCapital>
<EnglishSegment>false</EnglishSegment>
<SynonymOutput>false</SynonymOutput>
<WildcardOutput>false</WildcardOutput>
<WildcardSegment>false</WildcardSegment>
<CustomRule>false</CustomRule>
</MatchOptions>
<Parameters>
<UnknowRank>1</UnknowRank>
<BestRank>5</BestRank>
<SecRank>3</SecRank>
<ThirdRank>2</ThirdRank>
<SingleRank>1</SingleRank>
<NumericRank>1</NumericRank>
<EnglishRank>5</EnglishRank>
<EnglishLowerRank>3</EnglishLowerRank>
<EnglishStemRank>2</EnglishStemRank>
<SymbolRank>1</SymbolRank>
<SimplifiedTraditionalRank>1</SimplifiedTraditionalRank>
<SynonymRank>1</SynonymRank>
<WildcardRank>1</WildcardRank>
<FilterEnglishLength>0</FilterEnglishLength>
<FilterNumericLength>0</FilterNumericLength>
<CustomRuleAssemblyFileName>CustomRuleExample.dll</CustomRuleAssemblyFileName>
<CustomRuleFullClassName>CustomRuleExample.PickupVersion</CustomRuleFullClassName>
<Redundancy>0</Redundancy>
</Parameters>
</PanGuSettings>
View Code
在全局檔案中填入以下代碼
protected void Application_Start(object sender, EventArgs e)
{
//log4net.Config.XmlConfigurator.Configure();
//logger.Debug("程式開始");
Segment.Init(HttpContext.Current.Server.MapPath("~/PanGu.xml"));
}
分詞方法
Segment segment = new Segment();
var ss = segment.DoSegment("海信的,家就看到");
foreach (var s in ss)
{
string sa = s.Word;
}
設定過濾詞(注意這裡的過濾詞不要放在第一個上)