jiebaNET中文分词器

  最近我接手了一个有趣的需求,需要对用户评价进行分词,进行词频统计和情绪分析,并且根据词频权重制成词云图以供后台数据统计,于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了,甚至连配置文件都很难搞清楚,所以我来大家介绍一下jiebaNET。

jiebaNET分词器介绍:

ieba.NET分词器是一款基于.NET平台的中文分词工具,它借鉴了jieba分词器的算法和思路,为.NET开发者提供了高效、准确的中文分词功能。jieba.NET分词器的主要功能和特点如下:

  1. 中文分词:jieba.NET分词器能够将中文文本按照词语进行切分,使得文本更易于被处理和分析。分词是中文文本处理的基础步骤,对于词频统计、文本分类、情感分析等任务具有重要意义。
  2. 多种分词模式:jieba.NET分词器支持多种分词模式,包括精确模式、全模式和搜索引擎模式。精确模式会将句子最精确地切分开,适合在文本分析时使用;全模式会将句子中所有成词的词语都扫描出来,速度非常快,但可能产生歧义;搜索引擎模式会在精确模式的基础上对长词再进行切分,提高召回率,适用于搜索引擎等场景。
  3. 自定义词典:jieba.NET分词器允许用户创建自定义词典,以确保特定词汇被正确切分。这对于处理特定行业或领域的文本非常有用,可以提高分词的准确性和效率。
  4. 高效快速:jieba.NET分词器采用了高效的分词算法和优化的数据结构,可以让分词速度非常快,能够满足大规模文本处理的需求。
  5. 接口友好:jieba.NET分词器提供了简洁易用的API接口,开发者可以方便地将其集成到自己的.NET项目中,进行中文文本处理和分析。

分词

字典文件存储在Resources中的dict.txt文件中,其中:

  • “一个系列”是词条,也就是一个词语或者短语,是词典中存储的实际内容。
  • “14”通常是这个词的词频,表示这个词在语料库中出现的次数或者重要程度。较高的词频意味着这个词在语料中较为常见。
  • “m”代表词性标注,用来描述这个词的语法角色或词汇类别。在中文词性标注体系中,“m”通常代表“数词”,用于表示数量或序数的词语,比如“一个”、“两个”、“第一次”等

使用方法:

jieba.NET程序集中与分词相关的主要是JiebaSegmenter.Cut函数和JiebaSegmenter. CutForSearch函数,这两个函数都以字符串作为分词输入,不像之前盘古分词支持流式输入。

 public IEnumerable<string> Cut(string text, bool cutAll = false, bool hmm = true)
public IEnumerable<string> CutForSearch(string text, bool hmm = true)

基于这两个函数,jieba.NET支持多种分词模式:全模式(把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义)、精确模式(试图将句子最精确地切开)、搜索引擎模式(在精确模式的基础上,对长词再次切分,提高召回率)。这三种方式的代码其实都比较简单,如下所示:

 string textstr = txtContent.Text;txtResult.Text= textstr;var segmenter = new JiebaSegmenter();if (RadioButtonListType.SelectedValue == "jz"){var segments = segmenter.Cut(textstr,cutAll:false,hmm:false);txtResult.Text = "【精准模式】:" + string.Join("/ ", segments);//他/ 来到/ 上海交通大学}else if (RadioButtonListType.SelectedValue == "jzhmm"){var segments = segmenter.Cut(textstr, cutAll: false, hmm: false);txtResult.Text = "【精准模式、新词识别】:" + string.Join("/ ", segments);}	//新词识别:"我/ 在/ 玩/ 某某/ 游戏/ 时/ 遇到/ 了/ 一个/ 名叫/ 小明/ 的/ 玩家/ 。"
//"某某"和"小明"可能是游戏中的特定角色或者玩家的ID,不在默认词典中。启用了新词识别功能后,结巴分词器可能会尝试将它们识别为新词,并进行分割else if (RadioButtonListType.SelectedValue == "cutAll"){var segments = segmenter.Cut(textstr, cutAll: true);txtResult.Text = "【全模式】:" + string.Join("/ ", segments);//【全模式】:他/ 来到/ 上海/ 上海交通大学/ 交通/ 大学}else if (RadioButtonListType.SelectedValue == "CutForSearch"){var segments = segmenter.CutForSearch(textstr,  true);txtResult.Text = "【搜索引擎模式】:" + string.Join("/ ", segments);//他/ 毕业/ 于/ 上海/ 交通/ 大学/ 上海交通大学/ 机电/ 系/ ,/ 后来/ 在/ 一机部/ 上海/ 电器/ 科学/ 研究/ 研究所/ 工作}

关键词提取

jieba.NET支持通过两种算法提取文本关键词:TF-IDF算法TextRank算法,关于这两种算法的介绍详见参考文献10-11,在jieba.NET中对应的类为TfidfExtractorTextRankExtractor,这两个分词都都支持调用ExtractTagsExtractTagsWithWeight函数,前者默认返回前20个关键词,后者还附带每个关键词的权重。

权重逆文档频率存储在Resources/idf.txt文件中:如下图所示:

代码如下:

  //不带权重txtResult.Text = String.Empty;using (TextReader tr = File.OpenText(txtPath.Text)){TfidfExtractor extractor = new TfidfExtractor();var keywords=extractor.ExtractTags(tr.ReadToEnd());txtResult.Text = string.Join("/ ", keywords);}//带权重txtResult.Text = String.Empty;using (TextReader tr = File.OpenText(txtPath.Text)){TfidfExtractor extractor = new TfidfExtractor();IEnumerable<WordWeightPair> results = extractor.ExtractTagsWithWeight(tr.ReadToEnd());foreach (WordWeightPair p in results){txtResult.Text +=  p.Word + "," + p.Weight.ToString()+ "\r\n";}   }

TextRankExtractor类的示例代码及运行效果如下所示,对比可以看出这两种算法的返回结果还是存在差异:

  //不带权重txtResult.Text = String.Empty;using (TextReader tr = File.OpenText(txtPath.Text)){TextRankExtractorextractor = new TextRankExtractor();var keywords=extractor.ExtractTags(tr.ReadToEnd());txtResult.Text = string.Join("/ ", keywords);}//带权重txtResult.Text = String.Empty;using (TextReader tr = File.OpenText(txtPath.Text)){TextRankExtractorextractor = new TextRankExtractor();IEnumerable<WordWeightPair> results = extractor.ExtractTagsWithWeight(tr.ReadToEnd());foreach (WordWeightPair p in results){txtResult.Text +=  p.Word + "," + p.Weight.ToString()+ "\r\n";}   }

并行分词

"并行分词" 意味着可以同时处理多个文本或文本集合的分词任务,以提高分词速度和效率。在处理大量文本数据时特别有用,可以利用多核处理器的并行能力,加速分词过程。

JiebaSegmenter类的CutInParallelCutForSearchInParallel函数支持并行分词

  1. CutInParallel: 这个函数用于普通的分词任务。它可以同时处理一个字符串集合单个字符串,并将其分词后返回结果。如果输入是单个字符串,Jieba.NET 会自动将其按行转换为字符串集合,然后并行进行分词处理。
  2. CutForSearchInParallel: 这个函数用于搜索引擎模式的分词任务。类似于 CutInParallel,它也支持并行处理,但会采用搜索引擎模式进行分词,以适应搜索引擎等应用场景的需求。

设置停用词

提取关键词时,部分词语可能不重要或者并非所需的词语,此时可以通过设置停用词,在提取关键词时过滤掉指定的停用词。jieba.NET的停用词词库放在Resources文件夹下的stopwords.txt,程序启动时会自动加载该文件。 以之前的测试文本为例,提取前20个关键词,将其中的“一声”、“一脉”两次设置停用词,即在stopwords.txt后追加这两词,再次运行程序提取关键词,可以看到这两个词已经消息

词性标注

jieba.NET中的PosSegmenter类支持在分词的同时,为每个词添加词性标注,词性标注的含义表如下所示:

  • segmenter.Tokenize(text) 返回的是一个 IEnumerable<WordToken>,其中每个 WordToken 对象包含了词语、词性以及词语在原始文本中的起始位置。

1.在Resource的char_state_tab.json文件下存储了针对Unicode字符到其可能的词性的映射关系

2.在pos_prob_emit.json文件下存储了不同“词性”在遇到特定汉字时可能出现的概率大小,内容如图所示:

(这个指南不是直接给概率值,而是给了“负对数似然度”,你可以把它想象成衡量“不寻常程度”的一个指标——数值越小,表示这种情况越常见、越合理。)比如"E-e"下面"\u5440"的值是-0.65302718677052,意思是当某个词性是"E-e"时,汉字“\u5440”出现的概率相对较大,因为这个数字相比其他很多值是比较接近0的,也就是比较“不罕见”。

3.pos_prob_start.json /prob_emit.json 文件是用于存储词性标注模型中不同词性状态的先验概率或转移概率的数据。在自然语言处理任务,尤其是词性标注(Part-of-Speech Tagging)中,这样的文件起着至关重要的作用。(百度解释,不是太明白)

这个文件中的内容是每个词性对应的状态转移概率,以及每个状态的概率。每个词性都有一个对应的标识,比如 "E-e"、"E-d"、"S-rg" 等,这些标识可能是分别表示着不同的词性。而每个标识后面的数值则表示了该词性转移到下一个词性的概率,或者是该词性在句子中出现的概率。

4.pos_prob_trans/prob_trans.json 记录了不同词性之间的转移概率。其中,每个词性(比如 "E-e")后面跟着一个对象,对象的键是可能的下一个词性,而对应的值则是从当前词性转移到下一个词性的概率。例如,对于词性 "E-e",它可以转移到的词性有 "S-nr"、"S-ng"、"B-rz"、"B-mq" 等等,对应着不同的转移概率。这些值是负对数形式,数值越小代表从当前词性转移到目标词性的概率越高。

获取分词词语的起始位置

jieba.NET中的JiebaSegmenter类的Tokenize函数除了返回分词词语之外,还会返回每个分词词语的起止位置。该函数支持默认模式搜索模式两种分词方式,根据官网说明及测试,默认模式类似于分词函数的精确模式分词,每个词语只会被分一次,而搜索模式类似于全模式及搜索引擎模式分词,把所有可能的分词形式都返回。代码使用如下所示

using JiebaNet.Segmenter;
using System;class Program
{static void Main(string[] args){var segmenter = new JiebaSegmenter();// 默认模式下的分词及位置信息var tokensDefaultMode = segmenter.Tokenize("我爱自然语言处理");foreach (var token in tokensDefaultMode){Console.WriteLine($"Word: {token.Word}, Start Index: {token.StartIndex}, End Index: {token.EndIndex}");}// 搜索模式下的分词及位置信息var tokensSearchMode = segmenter.Tokenize("我爱自然语言处理", TokenizerMode.Search);foreach (var token in tokensSearchMode){Console.WriteLine($"Word: {token.Word}, Start Index: {token.StartIndex}, End Index: {token.EndIndex}");}}
}

查找关键词

jieba.NET中的KeywordProcessor类预先指定的一组关键词,然后在指定的文本中查找存在哪些关键词,也即查找指定的关键词在文本中是否存在。

添加自定义词典

自定义词典,以便包含jeba词库里面没有的词,格式如下:

创新办 3 i

云计算 5

凱特琳 nz

载入词典

使用jieba,load_userdict(file_name)即可载入词典

动态调整词典

结巴分词器(Jieba)提供了 add_word(word, freq=None, tag=None)del_word(word) 这两个方法,允许在程序运行过程中动态修改词典,以满足特定的需求。

  • add_word(word, freq=None, tag=None): 这个方法用于向分词器的词典中添加新的词语。可以指定词语的频率(freq)和词性(tag),如果不指定频率和词性,则默认使用内部规则进行设置。这样一来,当分词器进行分词时,就可以识别和使用这些新增的词语了。
  • del_word(word): 这个方法用于从分词器的词典中删除指定的词语。这在某些情况下可能很有用,比如当某些词语被错误地添加到词典中,或者需要动态地调整词典以适应不同的场景。

词频统计

词频统计功能可以计算文本中每个词语出现的频率以及统计词语的数量,这对文本分析、关键词提取、文本摘要等任务都非常有用。

Jieba 中的 cut 函数用于对文本进行分词,而分词后的结果可以通过 Counter 类进行词频统计。Counter 类可以统计一个可迭代对象中各个元素出现的次数。

using JiebaNet.Segmenter;
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(string[] args){// 创建 JiebaSegmenter 实例var segmenter = new JiebaSegmenter();// 文本string text = "我爱自然语言处理,自然语言处理也很有趣。";// 分词var segments = segmenter.Cut(text);// 统计词频var wordCounts = segments.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());// 输出词频统计结果foreach (var pair in wordCounts){Console.WriteLine($"词语: {pair.Key},频率: {pair.Value}");}}
}

那么如何按照词频绘制词云图呢?我们下章就为大家讲解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/329263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识分享|非凸问题求解方法及代码示例【分类迭代】【大M法】

主要内容 之前发布了非线性问题线性化的几种方法&#xff0c;如知识分享|分段函数线性化及matlab测试&#xff0c;学习园地 | yalmip实用操作-线性化&#xff0c;非线性优化 | 非线性问题matlabyalmip求解案例&#xff0c;但是在实际建模及编程过程中&#xff0c;会遇到各种…

【C++】学习笔记——map和set

文章目录 十五、map和set1. 关联式容器2. set的介绍3. set的使用4. multiset5. map的介绍6. map的使用7. multimap8. map中重载的operator[] 未完待续 十五、map和set 1. 关联式容器 我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector 、list 、deque 等&…

抖音小店什么产品最好卖?六月份的必爆产品!商家抓紧上架!

哈喽~我是电商月月 做抖音小店&#xff0c;爆款是非常吃香的&#xff0c;但普通玩家只有在爆款出来的那几天才能发现&#xff0c;再去截流&#xff0c;其实热度已经不高了&#xff0c;那想吃到这一口“螃蟹”只能自己去挖掘 每年爆的产品就是那几种&#xff0c;我们可以朝这几…

HackTheBox-Machines--Bank

文章目录 0x01 信息收集0x02 文件上传漏洞利用0x03 权限提升方法一&#xff1a;SUID提权方法二&#xff1a;配置不当提权 Bank 测试过程 0x01 信息收集 1.端口扫描 发现 ssh(22)、DNS(53)、HTTP(80) 端口 nmap -sC -sV 10.129.29.200访问 80 端口&#xff0c;页面为Apache2 U…

非授权人员进入报警系统

非授权人员进入报警系统基于智能视频分析技术和深度学习技术&#xff0c;非授权人员进入报警系统通过现场已经装好的监控摄像头针对人体进行精准检测&#xff0c;并根据设置的禁入区范围进行判断。通过图像处理和人体识别算法&#xff0c;非授权人员进入报警系统可以在实时监测…

鸿蒙HarmonyOS开发中的易混点归纳-持续补充中

相关文章目录 鸿蒙HarmonyOS开发术语全解&#xff1a;小白也能看懂&#xff01; 文章目录 相关文章目录前言一、build()函数和Builder装饰器&#xff1f;二、自定义组件和系统组件&#xff08;内置组件&#xff09;三、组件和页面四、自定义弹窗和其他弹窗总结 前言 一、build…

一个通过ADC采集NTC热敏电阻的温度传感器

前言: 如何设计一个电路,使用具有逐次逼近寄存器(SAR)模数转换器(ADC)的热敏电阻直接监测温度呢?温度传感电路需要使用负温度系数(NTC)热敏电阻与电阻器串联形成分压器,监测-25C至100C的温度范围。分压器具有产生与监测的温度成反比的输出电压的效果。电阻器分压器的…

Flink 高可用之StandAlone-HA模式(一)

obManager存在单点故障&#xff08;SPOF&#xff1a;Single Point Of Failure&#xff09;&#xff0c;因此对Flink做HA&#xff0c;主要是对JobManager做HA&#xff0c;根据Flink集群的部署模式不同&#xff0c;分为Standalone、OnYarn&#xff0c;本文主要涉及Standalone模式…

R语言数据分析案例-巴西固体燃料排放量预测与分析

1 背景 自18世纪中叶以来&#xff0c;由于快速城市化、人口增长和技术发展&#xff0c;导致一氧化二氮&#xff08;N2O&#xff09;、 甲烷&#xff08;CH4&#xff09;和二氧化碳&#xff08;CO 2&#xff09;等温室气体浓度急剧上升&#xff0c;引发了全球变暖、海平面上 升…

别说废话!说话说到点上,项目高效沟通的底层逻辑揭秘

假设你下周要在领导和同事面前汇报项目进度&#xff0c;你会怎么做&#xff1f;很多人可能会去网上搜一个项目介绍模板&#xff0c;然后按照模板来填充内容。最后&#xff0c;汇报幻灯片做了 80 页&#xff0c;自己觉得非常充实&#xff0c;但是却被领导痛批了一顿。 这样的境…

景源畅信电商:抖店怎么提高店铺的权重?

在竞争激烈的电商市场&#xff0c;如何提升抖店店铺权重成为商家关注的焦点。店铺权重是决定商品搜索排名的关键因素之一&#xff0c;直接关系到店铺流量和销量。提高店铺权重并非一蹴而就&#xff0c;而是一个系统工程&#xff0c;需要从多个维度着手优化。 一、优化商品标题和…

(二)vForm 动态表单设计器之下拉、选择

系列文章目录 &#xff08;一&#xff09;vForm 动态表单设计器之使用 目录 系列文章目录 前言 一、后端需提供接口 二、组件配置 总结 前言 动态表单下拉、选择等组件&#xff0c;大概率要使用数据库中的数据&#xff0c;那么vForm如何拿到数据库中的数据呢&#xff1f;跟随…

Java ( 框架界面 , 按钮 , 动作监听ActionListener ,鼠标监听MouseListener,键盘监听KeyListener)的使用方法

package 拼图阶段任务.ui;import javax.swing.*; import java.awt.*; import java.awt.event.*;public class UseMethod {public static void main(String[] args) { // 框架的用法JFrame jf new JFrame();// 设置界面的宽高jf.setSize(603,680);// 设置界面的标题jf.setTitle…

Linux: network: send 失败的时候要不要close socket?

最近遇到一个例子&#xff0c;说有zerowindow出现&#xff1b;出现的原因是接收方的CPU被其他程序吃光&#xff0c;导致socket的read函数处理非常慢。说明接收端的接收缓存不够用。发送端自然而然的要停止发送。 但是如果在接收方的recv buff&#xff0c;以及发送方的send buf…

智能车竞赛指南:从零到一,驶向自动驾驶的未来

智能车竞赛指南&#xff1a;从零到一&#xff0c;驶向自动驾驶的未来 一、智能车竞赛概览1.1 竞赛介绍1.2 竞赛分类 二、智能车开发技术基础2.1 硬件平台2.2 软件开发 三、实战案例&#xff1a;循线小车开发3.1 系统架构3.2 代码示例 四、技术项目&#xff1a;基于ROS的视觉导航…

PersonalLLM——探索LLM是否能根据五大人格特质重新塑造一个新的角色?

1.概述 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如ChatGPT&#xff0c;致力于构建能够辅助人类的个性化人工智能代理&#xff0c;这些代理以进行类似人类的对话为重点。在学术领域&#xff0c;尤其是社会科学中&#xff0c;一些研究报告已经…

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中&#xff0c;我们可以看到微服务列表&#xff0c;其中有一栏叫“健康实例数” &#xff08;如下图&#xff09;&#xff0c;表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 &#xff1f; 本章…

JAVA 中 HTTP 基本认证(Basic Authentication)

目录 服务端这么做服务端告知客户端使用 Basic Authentication 方式进行认证服务端接收并处理客户端按照 Basic Authentication 方式发送的数据 客户端这么做如果客户端是浏览器如果客户端是 RestTemplat如果客户端是 HttpClient 其它参考 服务端这么做 服务端告知客户端使用 …

Unity数据持久化2——XML

简介&#xff1a; 基础知识 XML文件格式 XML基本语法 XML属性 练习&#xff1a; C#读取存储XML XML文件存放位置 读取XML文件 练习&#xff1a; 存储修改XML文件 练习&#xff1a; 总结 实践小项目 必备知识点 必备知识点——C#中XML序列化 必备知识点——C#中XML反序列化 必备…

5.23-

回顾 I0多路复用的原理? 程序首先向操作系统发起一个IO多路复用请求&#xff0c;告诉操作系统需要监视哪些IO通道。这些IO通道可以包括网络套接字、文件描述符等操作系统随后会将这些IO通道放入一个队列中&#xff0c;并在某个IO通道就绪时&#xff08;如数据到达、文件可读…