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

 

设置过滤词(注意这里的过滤词不要放在第一个上)

posted @ 2016-11-07 12:16  雅比斯  阅读(2996)  评论(0编辑  收藏  举报