专栏首页逸鹏说道中文分词之结巴分词~~~附使用场景+demo(net)

中文分词之结巴分词~~~附使用场景+demo(net)

常用技能(更新ing):http://www.cnblogs.com/dunitian/p/4822808.html#skill

技能总纲(更新ing):http://www.cnblogs.com/dunitian/p/5493793.html

在线演示:http://cppjieba-webdemo.herokuapp.com

完整demo:https://github.com/dunitian/TempCode/tree/master/2016-09-05

逆天修改版:https://github.com/dunitian/TempCode/blob/master/2016-09-05/jieba.NET.0.38.2.zip

先说下注意点,结巴分词他没有对分词进行一次去重,我们得自己干这件事;字典得自行配置或者设置成输出到bin目录 应用场景举例(搜索那块大家都知道,说点其他的)

—————————————————————————————————————————————————— 言归正传:看一组民间统计数据:(非Net版,指的是官方版)

net版的IKanalyzer盘古分词好多年没更新了,所以这次选择了结巴分词(这个名字也很符合分词的意境~~结巴说话,是不是也是一种分词的方式呢? 下面简单演示一下: 1.先引入包:

2.字典设置:

3.简单封装的帮助类:

using System.Linq;
using JiebaNet.Segmenter;
using System.Collections.Generic;
 
namespace LoTLib.Word.Split
{
 #region 分词类型
 public enum JiebaTypeEnum
 {
 /// <summary>
 /// 精确模式---最基础和自然的模式,试图将句子最精确地切开,适合文本分析
 /// </summary>
 Default,
 /// <summary>
 /// 全模式---可以成词的词语都扫描出来, 速度更快,但是不能解决歧义
 /// </summary>
 CutAll,
 /// <summary>
 /// 搜索引擎模式---在精确模式的基础上对长词再次切分,提高召回率,适合用于搜索引擎分词
 /// </summary>
 CutForSearch,
 /// <summary>
 /// 精确模式-不带HMM
 /// </summary>
 Other
 }
 #endregion
 
 /// <summary>
 /// 结巴分词
 /// </summary>
 public static partial class WordSplitHelper
 {
 /// <summary>
 /// 获取分词之后的字符串集合
 /// </summary>
 /// <param name="objStr"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public static IEnumerable<string> GetSplitWords(string objStr, JiebaTypeEnum type = JiebaTypeEnum.Default)
 {
 var jieba = new JiebaSegmenter();
 switch (type)
 {
 case JiebaTypeEnum.Default:
 return jieba.Cut(objStr);                 //精确模式-带HMM
 case JiebaTypeEnum.CutAll:
 return jieba.Cut(objStr, cutAll: true);   //全模式
 case JiebaTypeEnum.CutForSearch:
 return jieba.CutForSearch(objStr);        //搜索引擎模式
 default:
 return jieba.Cut(objStr, false, false);   //精确模式-不带HMM
 }
 }
 
 /// <summary>
 /// 获取分词之后的字符串
 /// </summary>
 /// <param name="objStr"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public static string GetSplitWordStr(this string objStr, JiebaTypeEnum type = JiebaTypeEnum.Default)
 {
 var words = GetSplitWords(objStr, type);
 //没结果则返回空字符串
 if (words == null || words.Count() < 1)
 {
 return string.Empty;
 }
 words = words.Distinct();//有时候词有重复的,得自己处理一下
 return string.Join(",", words);//根据个人需求返回
 }
 }
}

调用很简单:

string str = "bootstrap-datetimepicker 进一步跟进~~~开始时间和结束时间的样式显示";
Console.WriteLine("\n精确模式-带HMM:\n");
Console.WriteLine(str.GetSplitWordStr());
 
Console.WriteLine("\n全模式:\n");
Console.WriteLine(str.GetSplitWordStr(JiebaTypeEnum.CutAll));
 
Console.WriteLine("\n搜索引擎模式:\n");
Console.WriteLine(str.GetSplitWordStr(JiebaTypeEnum.CutForSearch));
 
Console.WriteLine("\n精确模式-不带HMM:\n");
Console.WriteLine(str.GetSplitWordStr(JiebaTypeEnum.Other));
 
Console.ReadKey();

效果:

--------------------------

有人可能会说,那内容关键词提取呢?==》别急,看下面:

这种方式所对应的字典是它=》idf.txt

简单说下Constants==》

效果:

完整帮助类(最新看github):https://github.com/dunitian/TempCode/tree/master/2016-09-05

using System.Linq;
using JiebaNet.Segmenter;
using System.Collections.Generic;
using JiebaNet.Analyser;
 
namespace LoTLib.Word.Split
{
 #region 分词类型
 public enum JiebaTypeEnum
 {
 /// <summary>
 /// 精确模式---最基础和自然的模式,试图将句子最精确地切开,适合文本分析
 /// </summary>
 Default,
 /// <summary>
 /// 全模式---可以成词的词语都扫描出来, 速度更快,但是不能解决歧义
 /// </summary>
 CutAll,
 /// <summary>
 /// 搜索引擎模式---在精确模式的基础上对长词再次切分,提高召回率,适合用于搜索引擎分词
 /// </summary>
 CutForSearch,
 /// <summary>
 /// 精确模式-不带HMM
 /// </summary>
 Other
 }
 #endregion
 
 /// <summary>
 /// 结巴分词
 /// </summary>
 public static partial class WordSplitHelper
 {
 #region 公用系列
 /// <summary>
 /// 获取分词之后的字符串集合
 /// </summary>
 /// <param name="objStr"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public static IEnumerable<string> GetSplitWords(string objStr, JiebaTypeEnum type = JiebaTypeEnum.Default)
 {
 var jieba = new JiebaSegmenter();
 switch (type)
 {
 case JiebaTypeEnum.Default:
 return jieba.Cut(objStr);                 //精确模式-带HMM
 case JiebaTypeEnum.CutAll:
 return jieba.Cut(objStr, cutAll: true);   //全模式
 case JiebaTypeEnum.CutForSearch:
 return jieba.CutForSearch(objStr);        //搜索引擎模式
 default:
 return jieba.Cut(objStr, false, false);   //精确模式-不带HMM
 }
 }
 
 /// <summary>
 /// 提取文章关键词集合
 /// </summary>
 /// <param name="objStr"></param>
 /// <returns></returns>
 public static IEnumerable<string> GetArticleKeywords(string objStr)
 {
 var idf = new TfidfExtractor();
 return idf.ExtractTags(objStr, 10, Constants.NounAndVerbPos);//名词和动词
 }
 
 /// <summary>
 /// 返回拼接后的字符串
 /// </summary>
 /// <param name="words"></param>
 /// <returns></returns>
 public static string JoinKeyWords(IEnumerable<string> words)
 {
 //没结果则返回空字符串
 if (words == null || words.Count() < 1)
 {
 return string.Empty;
 }
 words = words.Distinct();//有时候词有重复的,得自己处理一下
 return string.Join(",", words);//根据个人需求返回
 }
 #endregion
 
 #region 扩展相关
 /// <summary>
 /// 获取分词之后的字符串
 /// </summary>
 /// <param name="objStr"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public static string GetSplitWordStr(this string objStr, JiebaTypeEnum type = JiebaTypeEnum.Default)
 {
 var words = GetSplitWords(objStr, type);
 return JoinKeyWords(words);
 }
 
 /// <summary>
 /// 提取文章关键词字符串
 /// </summary>
 /// <param name="objStr"></param>
 /// <returns></returns>
 public static string GetArticleKeywordStr(this string objStr)
 {
 var words = GetArticleKeywords(objStr);
 return JoinKeyWords(words);
 }
 #endregion
 }
}
还有耐心或者只看末尾的有福了~ web端的字典配置那是个烦啊,逆天把源码微调了下

使用方法和上面一样

web版演示: https://github.com/dunitian/LoTCode/blob/master/PawChina/PawChina/PawChina.UI/Areas/PawRoot/assets/js/note.js https://github.com/dunitian/LoTCode/blob/master/PawChina/PawChina/PawChina.UI/Areas/PawRoot/Controllers/PartialViewController.cs

结巴中文分词相关:

https://github.com/fxsjy/jieba

https://github.com/anderscui/jieba.NET

http://cppjieba-webdemo.herokuapp.com

本文分享自微信公众号 - 我为Net狂(dotNetCrazy),作者:dunitian

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • AutoMapper随笔记

    平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果...

    逸鹏
  • 圆通wap分站memcache没做ip限制

    漏洞证明: 获取memcache的信息,敏感的是version而已 获取item 获取key 然后其实是可以查询到数据的,用get <key>就行,可是我这里木...

    逸鹏
  • memcached安装及.NET中的Memcached.ClientLibrary使用详解

    序言 吹吹牛逼先,借我你的20分钟,保证你在.net中使用memcached缓存数据,畅通无阻,提升数据读取效率,分担数据库压力,便不在话下。 本篇主要说下:m...

    逸鹏
  • 3DES 加密与解密

    /// <summary>     /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码)     /// </summary...

    用户1220053
  • 使用scanf限定输入

    Qt君
  • 运维管理之怎么做容量规划

    一般每个服务都有对外承诺的服务质量,那么我们就需要根据这个目标来做容量规划及硬件方面的投入。

    lyb-geek
  • 中国台湾大学林轩田机器学习基石课程学习笔记2 -- Learning to Answer Yes/No

    上节课,我们主要简述了机器学习的定义及其重要性,并用流程图的形式介绍了机器学习的整个过程:根据模型H,使用演算法A,在训练样本D上进行训练,得到最好的h,其对应...

    红色石头
  • 为什么清华源的R镜像恰好缺了rvest包呢

    然后发现诡异的报错,是这个包无法被下载,这个时候我没有紧张,下意识的认为是清华镜像问题,所以我重新下载;

    生信技能树
  • How to know your application’s battery stats

    众所周知,Android系统内置了应用的耗电量统计分析功能,但是并没有提供相应的API和文档,只是可以查看耗电量排行榜前10的应用的耗电百分比。此外,随着And...

    宅男潇涧
  • 最全面的 Deno 入门教程

    Deno 是新的 JavaScript 和 TypeScript 运行时。Node.js 的发明者 Ryan Dahl 于 2020 年发布了 Deno,作为 ...

    疯狂的技术宅

扫码关注云+社区

领取腾讯云代金券