zoukankan      html  css  js  c++  java
  • 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;
                    }

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

  • 相关阅读:
    Linux shell的&&和||--转载
    Paxos算法之旅(四)zookeeper代码解析--转载
    linux shell less 命令---转
    8 Pratical Examples of Linux “Touch” Command--reference
    5 Ways to Use Log Data to Analyze System Performance--reference
    Load resources from classpath in Java--reference
    Eclipse Key Shortcuts for Greater Developers Productivity--reference
    binary heap
    Nginx vs Apache--reference
    【Java技术位】——代理模式及其事务包
  • 原文地址:https://www.cnblogs.com/yabisi/p/6038299.html
Copyright © 2011-2022 走看看