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>
在全局文件中填入以下代码
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; }
设置过滤词(注意这里的过滤词不要放在第一个上)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构