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

摘要:
常用技能(更新):http://www.cnblogs.com/dunitian/p/4822808.html#skill技能大纲(更新):http://www.cnblogs.com/dunitian/p/5493793.html在线演示:http://cppjieba-webdemo.herokuapp.com完整演示:https://github.com/dunitian/T

常用技能(更新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目录

应用场景举例(搜索那块大家都知道,说点其他的)

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

——————————————————————————————————————————————————

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

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

net版的IKanalyzer盘古分词好多年没更新了,所以这次选择了结巴分词(这个名字也很符合分词的意境~~结巴说话,是不是也是一种分词的方式呢?

下面简单演示一下:

1.先引入包:

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

2.字典设置:

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

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

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("
精确模式-带HMM:
");
            Console.WriteLine(str.GetSplitWordStr());

            Console.WriteLine("
全模式:
");
            Console.WriteLine(str.GetSplitWordStr(JiebaTypeEnum.CutAll));

            Console.WriteLine("
搜索引擎模式:
");
            Console.WriteLine(str.GetSplitWordStr(JiebaTypeEnum.CutForSearch));

            Console.WriteLine("
精确模式-不带HMM:
");
            Console.WriteLine(str.GetSplitWordStr(JiebaTypeEnum.Other));

            Console.ReadKey();

效果:

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

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

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

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

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

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

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

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

简单说下Constants==》

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

效果:

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

完整帮助类(最新看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
    }
}

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

还有耐心或者只看末尾的有福了~

web端的字典配置那是个烦啊,逆天把源码微调了下

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

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

使用方法和上面一样

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

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

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

免责声明:文章转载自《中文分词之结巴分词~~~附使用场景+demo(net)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c#正则表达式匹配整数和小数Quicksum下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

域选项

【名词】 文档 :文件,相当于数据表中的一条记录 域(Field) :数据中一列(字段)就称为域,在这里域就是文档的一个属性 【Field.Store】 YES :在索引文件中存储域的内容,存储的内容可以方便文档恢复 NO :不在索引文件中存储域内容,恢复时无法完整进行恢复(无法通过doc.get()进行获取) 注:实际使用时一般正文是不会进行存储的...

中文分词工具探析(一):ICTCLAS (NLPIR)

【开源中文分词工具探析】系列: 开源中文分词工具探析(一):ICTCLAS (NLPIR) 开源中文分词工具探析(二):Jieba 开源中文分词工具探析(三):Ansj 开源中文分词工具探析(四):THULAC 开源中文分词工具探析(五):FNLP 开源中文分词工具探析(六):Stanford CoreNLP 开源中文分词工具探析(七):LTP 1...

python使用jieba实现中文文档分词和去停用词

分词工具的选择:现在对于中文分词,分词工具有很多种,比如说:jieba分词、thulac、SnowNLP等。在这篇文档中,笔者使用的jieba分词,并且基于python3环境,选择jieba分词的理由是其比较简单易学,容易上手,并且分词效果还很不错。 分词前的准备: 待分词的中文文档 存放分词之后的结果文档 中文停用词文档(用于去停用词,在网上可以找到很多...

自然语言处理--jieba和gensim的分词功能

一、jieba分词功能 1、主要模式 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。 支持繁体分词 支持自定义词典  2、算法 基于前缀词典实现高效的词图扫描,生...

自然语言处理中的分词问题总结

众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。本文转载自明略研究院的技术经理牟小峰老师讲授的语言处理中的分词问题。 如何界定分词   中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新...

中文分词:双向匹配最大算法(BI-MM)

中文分词:双向匹配最大算法(BI-MM) 启发式规则: 1.如果正反向分词结果词数不同,则取分词数量较少的那个 2.如果分词结果词数相同 a. 分词结果相同,就说明没有歧义,可返回任意一个 b. 分词结果不同,返回其中单字较少的那个 代码实现 #使用双向最大匹配算法实现中文分词 words_dic = [] import BMM #引入逆向匹配算...