天天看點

C#分詞算法

本文用到的庫下載下傳:點此下載下傳

 詞庫下載下傳:點此下載下傳

将詞庫直接放到項目根目錄

詞庫設定如下:

C#分詞算法

類庫說明

詞庫檢視程式:點此下載下傳

 可以在上面的程式中添加常用行業詞庫 還可以通過下面的類在程式中實作

C#分詞算法
完整的盤古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會把扔給它的文本切詞儲存,加快檢索速度。

C#分詞算法

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();
                } 


           
        }
    }
}      
C#分詞算法

二進制分詞算法,每兩個漢字算一個單詞,“我愛你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/>");
            }

        }
    }
}      
C#分詞算法

這時,你肯定在想,上面沒有一個好用的,二進制分詞算法亂槍打鳥,很想自己擴充Analyzer,但并不是算法上的專業人士。怎麼辦?

天降聖器,盤古分詞,

盤古分詞的用法 首先引用以上的盤古dll 檔案

将xml檔案放在項目的根目錄下

C#分詞算法
C#分詞算法
<?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;
                }      

設定過濾詞(注意這裡的過濾詞不要放在第一個上)

C#分詞算法

繼續閱讀