首页 > 编程语言 >C# 分词jieba中文分词

C# 分词jieba中文分词

时间:2024-03-05 10:34:16浏览次数:42  
标签:jieba end C# start var word 分词

一、简介:

ieba.NET是jieba中文分词的.NET版本(C#实现)。

当前版本为0.42.2,基于jieba 0.42,提供与jieba基本一致的功能与接口,但不支持其最新的paddle模式。关于jieba的实现思路,可以看看这篇wiki里提到的资料。

此外,也提供了 KeywordProcessor,参考 FlashText 实现。KeywordProcessor 可以更灵活地从文本中提取词典中的关键词,比如忽略大小写、含空格的词等。

如果您在开发中遇到与分词有关的需求或困难,请提交一个Issue,I see u:)

特点
支持三种分词模式:
精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义。具体来说,分词过程不会借助于词频查找最大概率路径,亦不会使用HMM;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
支持繁体分词
支持添加自定义词典和自定义词
MIT 授权协议

算法
基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

二、实现:

1、创建一个winform项目

2、在Nuget添加jieba.net

安装之后,在packages\jieba.NET目录下可以看到Resources目录,这里面是jieba.NET运行所需的词典及其它数据文件,最简单的配置方法是将整个Resources目录拷贝到程序集所在目录,这样jieba.NET会使用内置的默认配置值。如果希望将这些文件放在其它位置,则要在app.config或web.config中添加如下的配置项:

<appSettings>
<add key="JiebaConfigFileDir" value="C:\jiebanet\config" />
</appSettings>

我是将整个Resources拷到项目目录

 

3、主要功能

1. 分词

  • JiebaSegmenter.Cut方法接受三个输入参数,text为待分词的字符串;cutAll指定是否采用全模式;hmm指定使用是否使用hmm模型切分未登录词;返回类型为IEnumerable<string>
  • JiebaSegmenter.CutForSearch方法接受两个输入参数,text为待分词的字符串;hmm指定使用是否使用hmm模型;返回类型为IEnumerable<string>

代码示例

 private void button1_Click(object sender, EventArgs e)
        {
            var segmenter = new JiebaSegmenter();
            var segments = segmenter.Cut("我来到北京清华大学", cutAll: true);
            Console.WriteLine("【全模式】:{0}", string.Join("/ ", segments));

            segments = segmenter.Cut("我来到北京清华大学");  // 默认为精确模式
            Console.WriteLine("【精确模式】:{0}", string.Join("/ ", segments));

            segments = segmenter.Cut("他来到了网易杭研大厦");  // 默认为精确模式,同时也使用HMM模型
            Console.WriteLine("【新词识别】:{0}", string.Join("/ ", segments));

            segments = segmenter.CutForSearch("小明硕士毕业于中国科学院计算所,后在日本京都大学深造"); // 搜索引擎模式
            Console.WriteLine("【搜索引擎模式】:{0}", string.Join("/ ", segments));

            segments = segmenter.Cut("结过婚的和尚未结过婚的");
            Console.WriteLine("【歧义消除】:{0}", string.Join("/ ", segments));
        }

 

输出

【全模式】:我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
【精确模式】:我/ 来到/ 北京/ 清华大学
【新词识别】:他/ 来到/ 了/ 网易/ 杭研/ 大厦
【搜索引擎模式】:小明/ 硕士/ 毕业/ 于/ 中国/ 科学/ 学院/ 科学院/ 中国科学院/ 计算/ 计算所/ ,/ 后/ 在/ 日本/ 京都/ 大学/ 日本京都大学/ 深造
【歧义消除】:结过婚/ 的/ 和/ 尚未/ 结过婚/ 的

2、添加自定义词典

加载词典
  • 开发者可以指定自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率
  • JiebaSegmenter.LoadUserDict("user_dict_file_path")
  • 词典格式与主词典格式相同,即一行包含:词、词频(可省略)、词性(可省略),用空格隔开
  • 词频省略时,分词器将使用自动计算出的词频保证该词被分出

创新办 3 i
云计算 5
凱特琳 nz
台中
机器学习 3
调整词典
  • 使用JiebaSegmenter.AddWord(word, freq=0, tag=null)可添加一个新词,或调整已知词的词频;若freq不是正整数,则使用自动计算出的词频,计算出的词频可保证该词被分出来
  • 使用JiebaSegmenter.DeleteWord(word)可移除一个词,使其不能被分出来

3. 关键词提取

基于TF-IDF算法的关键词提取
  • JiebaNet.Analyser.TfidfExtractor.ExtractTags(string text, int count = 20, IEnumerable<string> allowPos = null)可从指定文本中抽取出关键词。
  • JiebaNet.Analyser.TfidfExtractor.ExtractTagsWithWeight(string text, int count = 20, IEnumerable<string> allowPos = null)可从指定文本中抽取关键词的同时得到其权重。
  • 关键词抽取基于逆向文件频率(IDF),组件内置一个IDF语料库,可以配置为其它自定义的语料库。
  • 关键词抽取会过滤停用词(Stop Words),组件内置一个停用词语料库,这个语料库合并了NLTK的英文停用词和哈工大的中文停用词。
基于TextRank算法的关键词抽取
  • JiebaNet.Analyser.TextRankExtractorTfidfExtractor相同的接口。需要注意的是,TextRankExtractor默认情况下只提取名词和动词。
  • 以固定窗口大小(默认为5,通过Span属性调整)和词之间的共现关系构建图

4. 词性标注

  • JiebaNet.Segmenter.PosSeg.PosSegmenter类可以在分词的同时,为每个词添加词性标注。
  • 词性标注采用和ictclas兼容的标记法,关于ictclas和jieba中使用的标记法列表,请参考:词性标记
var posSeg = new PosSegmenter();
var s = "一团硕大无朋的高能离子云,在遥远而神秘的太空中迅疾地飘移";

var tokens = posSeg.Cut(s);
Console.WriteLine(string.Join(" ", tokens.Select(token => string.Format("{0}/{1}", token.Word, token.Flag))));
一团/m 硕大无朋/i 的/uj 高能/n 离子/n 云/ns ,/x 在/p 遥远/a 而/c 神秘/a 的/uj 太空/n 中/f 迅疾/z 地/uv 飘移/v

5. Tokenize:返回词语在原文的起止位置

  • 默认模式
var segmenter = new JiebaSegmenter();
var s = "永和服装饰品有限公司";
var tokens = segmenter.Tokenize(s);
foreach (var token in tokens)
{
    Console.WriteLine("word {0,-12} start: {1,-3} end: {2,-3}", token.Word, token.StartIndex, token.EndIndex);
}
word 永和           start: 0   end: 2
word 服装           start: 2   end: 4
word 饰品           start: 4   end: 6
word 有限公司         start: 6   end: 10
  • 搜索模式
var segmenter = new JiebaSegmenter();
var s = "永和服装饰品有限公司";
var tokens = segmenter.Tokenize(s, TokenizerMode.Search);
foreach (var token in tokens)
{
    Console.WriteLine("word {0,-12} start: {1,-3} end: {2,-3}", token.Word, token.StartIndex, token.EndIndex);
}
word 永和           start: 0   end: 2
word 服装           start: 2   end: 4
word 饰品           start: 4   end: 6
word 有限           start: 6   end: 8
word 公司           start: 8   end: 10
word 有限公司         start: 6   end: 10

6. 并行分词

使用如下方法:

  • JiebaSegmenter.CutInParallel()JiebaSegmenter.CutForSearchInParallel()
  • PosSegmenter.CutInParallel()

7. 与Lucene.NET的集成

jiebaForLuceneNet项目提供了与Lucene.NET的简单集成,更多信息请看:jiebaForLuceneNet

8. 其它词典

jieba分词亦提供了其它的词典文件:

9 词频统计

可以使用Counter类统计词频,其实现来自Python标准库的Counter类(具体接口和实现细节略有不同),用法大致是:

var s = "在数学和计算机科学之中,算法(algorithm)为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。";
var seg = new JiebaSegmenter();
var freqs = new Counter<string>(seg.Cut(s));
foreach (var pair in freqs.MostCommon(5))
{
    Console.WriteLine($"{pair.Key}: {pair.Value}");
}

输出:

的: 4
,: 3
算法: 3
计算: 3
。: 3

Counter类可通过AddSubtractUnion方法进行修改,最后以MostCommon方法获得频率最高的若干词。具体用法可见测试用例。

标签:jieba,end,C#,start,var,word,分词
From: https://www.cnblogs.com/handsomeziff/p/18053412

相关文章

  • windows下用Code::blocks gcc/mingw系使用wxWidgets库
    很多Windows下用Code::blocks+wxWidgets的朋友最开始的时候都会因为这个错误无法编译而放弃wx。下面给出详细解决方法:1.到WX的目录下,找到include\wx\platform.h文件,用Codeblocks打开它2.Codeblocks下用菜单栏的Search->Find功能,找到#include"wx/setup.h"一行3.将"wx/set......
  • 使用 Docker 安装 Jenkins 的最佳方式
    说在前面本篇内容非常简单,讲述了如何快速在Docker上部署一个Jenkins实例,避免多采坑,浪费不必要的练习时间。本文实验环境:操作系统:Centos7.5DockerVersion:18.09.6下载镜像打开终端,输入dockersearch命令搜索DockerHub上可用的Jenkins镜像:$dockersearchjenkin......
  • (转)gRPC 拦截器
    原文:https://www.cnblogs.com/rickiyang/p/14975552.htmlGogRPC学习系列:跟我一起学Go系列:gRPC入门必备第一篇内容我们已经基本了解到gRPC如何使用、对应的三种流模式。现在已经可以让服务端和客户端互相发送消息。本篇仍然讲解功能性的使用说明:如何使用拦截器。使用过......
  • C# sort an array in a single loop in O(n)
    usingSystem;usingSystem.IO;usingSystem.Runtime.CompilerServices;namespaceConsoleApp16{internalclassProgram{staticvoidMain(string[]args){GenArray(100);}staticint[]SortArray(int[......
  • Cold Turkey Blocker Pro 4.4版本免费使用
    ColdTurkeyBlockerPro4.4版本免费使用介绍最近在推进毕设,无奈自制力不强,总是沉浸在bilibili无法自拔....偶然在网上看到ColdTurkeyBlocker,自称为TheToughestWebsiteBlockerontheInternet,于是进行了关注。ColdTurkeyBlocker是一款电脑软件,主要用于帮助用户管理和......
  • SpringCloud2023最新版本该如何进行组件选型?
    前言Developingdistributedsystemscanbechallenging.Complexityismovedfromtheapplicationlayertothenetworklayeranddemandsgreaterinteractionbetweenservices.Makingyourcode‘cloud-native’meansdealingwith12-factorissuessuchasextern......
  • macOS14使用brew下载Redis时出现的问题和解决方法
    当我使用brew下载redis时系统:macOS14(base)hanxuxian@hanxuxiandeMacBook-Air~%brewinstallredis报错信息:Error:git:unknownorunsupportedmacOSversion::dunnoError:'git'mustbeinstalledandinyourPATH!Warning:YouareusingmacOS14.Wedon......
  • [转] C# 语言版本控制
    当使用新版本的语法糖时,编译器报错了: 参考:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/configure-language-version配置项目文件,添加如下蓝色配置后正常:<PropertyGroup><LangVersion>latest</LangVersion></PropertyGroup>默认值......
  • Oracle中不允许表的列名称使用Oracle声明的关键字! (ORA-01747: user.table.column, t
    1.问题ORA-01747:user.table.column,table.column或列说明无效--Oracle下,根据商品价格从高到低取4-6名商品SELECT*FROM( SELECTROWNUM,t1.* FROM( SELECTprod_name,prod_price FROMPRODUCTS ORDERBYPROD_PRICEDESC )t1 WHEREROWNUM<=6......
  • Reflect
    Reflect是一个为了替代Object的新语法现阶段,某些方法同时在Object和Reflect身上部署,但是未来的新方法将只部署在Reflect身上让Object操作都变成函数行为,某些Object操作是命令式的,比如nameinobj和deleteobj[name],而Reflect.has(obj,name)和Reflect.deleteProperty(obj,nam......