本文用到的庫下載:點此下載
詞庫下載:點此下載
將詞庫直接放到項目根目錄
詞庫設置如下:
類庫說明
詞庫查看程序:點此下載
可以在上面的程序中添加常用行業詞庫 還可以通過下面的類在程序中實現
完整的盤古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>
在全局文件中填入以下代碼
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; }
設置過濾詞(注意這里的過濾詞不要放在第一個上)