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會把扔給它的文本切詞保存,加快檢索速度。

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM