精华内容
下载资源
问答
  • 中文分词技术及应用

    千次阅读 2018-12-08 17:52:00
    中文分词技术及应用 中文分词算法有5大类: 1、 基于词典的方法 2、基于统计的方法 3、基于规则的方法 4、基于字标注的方法 5、基于人工智能的技术(基于理解)的方法 中文分词目前有4个瓶颈: 1、 分词...
    			中文分词技术及应用
    

    中文分词算法有5大类:
    1、 基于词典的方法
    2、基于统计的方法
    3、基于规则的方法
    4、基于字标注的方法
    5、基于人工智能的技术(基于理解)的方法
    中文分词目前有4个瓶颈:
    1、分词歧义
    2、未登陆词识别
    3、分词粒度问题(表达相同意思的同一字串,在语料中存在不同的切分方式)
    4、错别字与谐音字规范化
    中文分词有5大评价标准:
    1、分词正确率
    2、切分速度
    3、功能完备性
    4、易扩展性与可维护性
    中文信息处理包括3个层次:
    1、词法分析(中文分词是第一步,词性标注)
    2、句法分析:对输入的文本句子进行分析以得到句子的句法结构的处理过程,句法分析的输出结果常作为语义分析的输入。
    2.1、短语结构句法分析:识别处句子中的短语结果以及短语间的层次句法关系
    2.2、依存句法分析:识别句子中词汇与词汇之间的相互依存关系,属于浅层句法分析
    2.3、深层文法句法分析:利用深层文法,如词汇化树邻接文法、词汇功能文法、组合范畴文法等,对句子进行深层句法分析。
    3、语义分析:理解句子表达的真实语义
    3.1、语义角色标注:属于浅层语义分析技术
    在这里插入图片描述

    1、基于词典的方法:字符串匹配,机器分词方法
    原理:按照一定策略将待分析的汉字穿与一个“大词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。
    1.1、按照扫描方向的不同:正向匹配&逆向匹配
    1.2、按照长度的不同:最大匹配&最小匹配
    1.3、按照是否与词性标注过程相结合:单纯分词方法&分词与标注相结合
    1.1.1、基于字符串匹配方法:正向最大匹配算法(MM)
    步骤:
    1、从左向右取切分汉字句的m个字符串作为匹配字段,m为大机器词典中最长词条数
    2、查找大机器词典并进行匹配,若匹配成功,则将这个匹配字段作为一个词切分出来,否则,则将这个匹配字段的最后一个词去掉,剩下的字符串继续匹配字段,直到以上过程切分到所有词为止。
    优点:简单,易于实现
    缺点:匹配速度慢,存在歧义切分问题,缺乏自学习的智能性。
    2、基于统计的分词(无字典分词)
    主要思想是:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。可以对训练文本中相邻出现的频度进行统计,计算他们之间的互现信息。互现信息体系了汉字之间结合的紧密程度。当紧密程度高于某一个阈值时,便可以认为此字组可能构成一个词。该方法又称无字典分词。
    主要统计模型有:N 元文法模型、隐马尔科夫模型等
    在实际应用中一般将其与基于词典的分词方法结合起来使用,即可以发挥分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
    2.1、N-gram模型
    N-gram模型思想:第n个词的出现只![在这里插入图片描述](htt
    与前面n-1个词相关,整句的概率就是各个词出现概率的乘积。
    2.2、隐马尔科夫模型
    原理:根据观测者序列找到真正的隐藏状态值序列
    中文分词的应用:在这里插入图片描述

    3、具体应用
    中文分词是大部分下游应用的基础,小到POS词性标注、NER命名实体识别,大到自动分类、自动摘要、语音模型、自动摘要、搜索引擎、机器翻译、语音合成等。
    以下具体阐述:中文分词在搜索引擎中的应用:
    搜索引擎针对用户提交查询的关键词串进行查询处理后,根据用户的关键词串用各种匹配方法进行分词。
    搜索引擎的查询处理:
    1、首先到数据库里搜索相关信息
    2、若用户提交的字符串不超过3个汉字,则直接去数据库索引
    3、分词:若超过4个字符串,则用分隔符把用户提交的字符串分割成N个子字符串查询
    4、检索用户提供的字符串里有无重复词汇,若有则去掉,默认为一个词汇,检索用户提交的字符串是否有字母和数字,若有则把字母与数字当作一个词

    展开全文
  • 应用场景举例 (搜索那块大家都知道,说点其他的) —————————————————————————————————————————————————— 言归正传:看一组民间统计数据:(非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

    转载于:https://www.cnblogs.com/dunitian/p/5841839.html

    展开全文
  • 中文分词工具.docx

    2021-03-09 15:58:47
    七种中文分词工具的实验尝试与对比,具体使用时需结合场景选择。
  • 中文分词技术

    2021-02-07 14:07:33
    # MySQL中文分词全文索引大体分为两个过程:* 索引创建(indexer):将现实世界中所有的结构化数据和非结构化数据提取信息,创建索引的过程* 搜索索引(search):就是得到用户的查询请求,搜索创建的索引,然后返回结果...

    # MySQL中文分词

    全文索引大体分为两个过程:

    * 索引创建(indexer):将现实世界中所有的结构化数据和非结构化数据提取信息,创建索引的过程

    * 搜索索引(search):就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程

    ## 编译安装 sphinx+mmsg

    ### 0. 安装编译依赖工具包

    ```

    yum install make gcc gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel

    ```

    ### 下载稳定版源码包并解压

    ```

    [root@localhost.localdomain /usr/local/src]

    # wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz

    [root@localhost.localdomain /usr/local/src]

    # tar xf coreseek-3.2.14.tar.gz

    [root@localhost.localdomain /usr/local/src]

    # cd coreseek-3.2.14

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14]

    # ls

    csft-3.2.14(sphinx) mmseg-3.2.14 README.txt testpack

    其中-- csft-4.1是修改适应了中文环境后的sphinx

    Mmseg 是中文分词插件

    Testpack是测试用的软件包

    ```

    ### [安装 mmseg](http://www.coreseek.cn/products/products-install/install_on_bsd_linux/)

    #### cd mmseg

    ```

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14]

    # cd mmseg-3.2.14/

    ```

    #### 执行bootstrap脚本

    ```

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14/mmseg-3.2.14]

    # ./bootstrap

    ```

    #### ./configure --prefix=/usr/local/mmseg

    ```

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14/mmseg-3.2.14]

    # ./configure --prefix=/usr/local/mmseg

    ```

    #### make && make install

    ```

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14/mmseg-3.2.14]

    # make && make install

    ```

    ### 安装coreseek

    ```

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14/csft-3.2.14]

    # ./buildconf.sh

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14/csft-3.2.14]

    # ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql

    [root@localhost.localdomain /usr/local/src/coreseek-3.2.14/csft-3.2.14]

    # make && make install

    ```

    ## Sphinx的使用

    > 1. 数据源---要让sphinx知道,查哪些数据,即针对哪些数据做索引(可以定义多个源)

    > 2. 索引配置---针对哪个源做索引, 索引文件放在哪个目录?? 等等

    > 3. 搜索服务器---sphinx可以在某个端口(默认9312),以其自身的协议,与外部程序做交互.

    **配置数据源**

    ```

    [root@localhost.localdomain /usr/local/coreseek/etc]

    # cp sphinx.conf.dist sphinx.conf

    [root@localhost.localdomain /usr/local/coreseek/etc]

    # vim sphinx.conf

    ```

    如下配置:

    source src1 {

    type = mysql

    sql_host = localhost

    sql_user = root

    sql_pass = aaaaaa

    sql_db = test

    sql_query_pre = set names utf8

    sql_query_pre = set session query_cache_type=off

    sql_query = `select a_id as id,cat_id,title,simtitle,seotitle,tags,source,description,content,dateline,editdateline from article`

    sql_attr_uint = a_id

    sql_attr_uint = cat_id

    sql_attr_timestamp = dateline

    sql_attr_timestamp = editdateline

    sql_query_info = `SELECT * FROM article WHERE a_id=$id`

    }

    **索引典型配置**

    > index test1 {

    > source = test

    > path = /usr/local/sphinx/var/data/test1 # 生成索引放在哪

    > # stopwords = G:\data\stopwords.txt

    > # wordforms = G:\data\wordforms.txt

    > # exceptions = /data/exceptions.txt

    > charset_dictpath = /usr/local/mmseg/etc/

    > charset_type = zh_cn.utf-8

    > }

    **生成索引文件**

    ```

    [root@localhost.localdomain /usr/local/coreseek/etc]

    # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf test1 (test1为索引名称)

    Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]

    Copyright (c) 2007-2011,

    Beijing Choice Software Technologies Inc (http://www.coreseek.com)

    using config file '/usr/local/coreseek/etc/sphinx.conf'...

    indexing index 'test1'...

    collected 8122 docs, 47.6 MB

    sorted 8.7 Mhits, 100.0% done

    total 8122 docs, 47596333 bytes

    total 17.782 sec, 2676636 bytes/sec, 456.75 docs/sec

    total 5 reads, 0.011 sec, 4559.8 kb/call avg, 2.3 msec/call avg

    total 58 writes, 0.429 sec, 903.8 kb/call avg, 7.3 msec/call avg

    ```

    > **Error 注意:**

    > /usr/local/coreseek/bin/indexer: error while loading shared libraries: **libmysqlclient.so.18**: cannot open shared object file: No such file or directory

    > 发现**sphinx**的`indexer`依赖库`ibmysqlclient.so.18`找不到,通过编辑此文件来修复这个错误 `/etc/ld.so.conf`

    > `vi /etc/ld.so.conf `

    > 将下面这句加到文件到尾部,并保存文件

    > `/usr/local/mysql/lib `

    > 然后运行下面这个命令即可

    > `ldconfig`

    在命令行测试查询

    ````

    [root@localhost.localdomain /usr/local/coreseek]

    # ./bin/search -c etc/sphinx.conf 留学

    ```

    展开全文
  • NLP应用场景

    千次阅读 2020-05-22 15:48:27
    当前中文分词算法的主要难点有歧义识别和新词识别,比如:“羽毛球拍卖完了”,这个可以切分成“羽毛 球拍 卖 完 了”,也可切分成“羽毛球 拍卖 完 了”,如果不依赖上下文其他的句子,恐怕很难知道如何去理解。...

    原创博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
    本次代码的环境:
    运行平台: Windows
    Python版本: Python3.x
    IDE: PyCharm

    一、 前言

    2016年3月9日至15日和2017年5月23日至27日,分别在韩国首尔和中国嘉兴乌镇,韩国围棋九段棋手李世石、中国围棋九段棋手柯洁与人工智能围棋程序“阿尔法围棋”(AlphaGo)之间的两场比赛,人类均以失败告终,更是激起了各种“机器超越、控制人类”的讨论,然而机器真的懂人类进而控制人类吗?如果可以那首先必须要先让机器能理解人类的语言。那么机器是如何理解人类语言的呢?这一系列的博文将带领大家熟悉和回顾一个完整的自然语言处理过程。
    首先理解什么是NLP呢?

    NLP (Natural Langunge Possns,自然语言处理)是计算机科学领域以及人工智能领域的一个重要的研究方向,它研究用计算机来处理、理解以及运用人类语言(如中文、英文等),达到人与计算机之间进行有效通讯。所谓“自然”乃是寓意自然进化形成,是为了区分一些人造语言,类似C++、Java 等人为设计的语言。

    二、内容

    2.1 NLP技术点

    接下来通过分析对象和分析内容两个不同的维度来进行表达,NLP 所包含的技术知识点如图2.1所示:
     


    在这里插入图片描述
    图2.1 NLP 技术知识点汇总

    2.2 NLP处理过程

    中文自然语言处理的过程和机器学习过程大体一致,但又存在很多细节上的不同点,下面我们就来看看中文自然语言处理的基本过程有哪些呢?

    2.2.1 获取语料

    语料,即语言材料。语料是语言学研究的内容。语料是构成语料库的基本单元。所以,人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。我们把一个文本集合称为语料库(Corpus),当有几个这样的文本集合的时候,我们称之为语料库集合(Corpora)。(定义来源:百度百科)按语料来源,我们将语料分为以下两种:

    • 1.已有语料
      很多业务部门、公司等组织随着业务发展都会积累有大量的纸质或者电子文本资料。那么,对于这些资料,在允许的条件下我们稍加整合,把纸质的文本全部电子化就可以作为我们的语料库。
    • 2.网上下载、抓取语料
      如果现在个人手里没有数据怎么办呢?这个时候,我们可以选择获取国内外标准开放数据集,比如国内的中文汉语有搜狗语料、人民日报语料。国外的因为大都是英文或者外文,这里暂时用不到。也可以选择通过爬虫自己去抓取一些数据,然后来进行后续内容。

    2.2.2 语料预处理

    在一个完整的中文自然语言处理工程应用中,语料预处理大概会占到整个50%-70%的工作量,所以开发人员大部分时间就在进行语料预处理。下面通过数据洗清、分词、词性标注、去停用词四个大的方面来完成语料的预处理工作。

    • 1.语料清洗
      数据清洗,顾名思义就是在语料中找到我们感兴趣的东西,把不感兴趣的、视为噪音的内容清洗删除,包括对于原始文本提取标题、摘要、正文等信息,对于爬取的网页内容,去除广告、标签、HTML、JS 等代码和注释等。常见的数据清洗方式有:人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。
    • 2.分词
      中文语料数据为一批短文本或者长文本,比如:句子,文章摘要,段落或者整篇文章组成的一个集合。一般句子、段落之间的字、词语是连续的,有一定含义。而进行文本挖掘分析时,我们希望文本处理的最小单位粒度是词或者词语,所以这个时候就需要分词来将文本全部进行分词。
      常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。
      当前中文分词算法的主要难点有歧义识别和新词识别,比如:“羽毛球拍卖完了”,这个可以切分成“羽毛 球拍 卖 完 了”,也可切分成“羽毛球 拍卖 完 了”,如果不依赖上下文其他的句子,恐怕很难知道如何去理解。
    • 3.词性标注
      词性标注,就是给每个词或者词语打词类标签,如形容词、动词、名词等。这样做可以让文本在后面的处理中融入更多有用的语言信息。词性标注是一个经典的序列标注问题,不过对于有些中文自然语言处理来说,词性标注不是非必需的。比如,常见的文本分类就不用关心词性问题,但是类似情感分析、知识推理却是需要的,下图2.2是常见的中文词性整理。
       

      在这里插入图片描述
      图2.2 中文词性

    常见的词性标注方法可以分为基于规则和基于统计的方法。其中基于统计的方法,如基于最大熵的词性标注、基于统计最大概率输出词性和基于 HMM 的词性标注。

    • 4.去停用词
      停用词一般指对文本特征没有任何贡献作用的字词,比如标点符号、语气、人称等一些词。所以在一般性的文本处理中,分词之后,接下来一步就是去停用词。但是对于中文来说,去停用词操作不是一成不变的,停用词词典是根据具体场景来决定的,比如在情感分析中,语气词、感叹号是应该保留的,因为他们对表示语气程度、感情色彩有一定的贡献和意义。

    2.2.3 特征工程

    做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是向量话。有两种常用的表示模型分别是词袋模型和词向量

    • 词袋模型(Bag of Word, BOW),即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。
    • 词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。

    2.2.4 特征选择

    同数据挖掘一样,在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。文本特征一般都是词语,具有语义信息,使用特征选择能够找出一个特征子集,其仍然可以保留语义信息;但通过特征提取找到的特征子空间,将会丢失部分语义信息。所以特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。

    2.2.5 模型训练

    在特征向量选择好之后,接下来要做的事情当然就是训练模型,对于不同的应用需求,我们使用不同的模型,传统的有监督和无监督等机器学习模型, 如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。这些模型在后续的分类、聚类、神经序列、情感分析等示例中都会用到。下面是在模型训练时需要注意的几个点。

    • 1.注意过拟合、欠拟合问题,不断提高模型的泛化能力。

      • 过拟合:模型学习能力太强,以至于把噪声数据的特征也学习到了,导致模型泛化能力下降,在训练集上表现很好,但是在测试集上表现很差。
        常见的解决方法有:

        • 增大数据的训练量;
        • 增加正则化项,如 L1 正则和 L2 正则;
        • 特征选取不合理,人工筛选特征和使用特征选择算法;
        • 采用 Dropout 方法等。
      • 欠拟合:就是模型不能够很好地拟合数据,表现在模型过于简单。
        常见的解决方法有:

        • 添加其他特征项;
        • 增加模型复杂度,比如神经网络加更多的层、线性模型通过添加多项式使模型泛化能力更强;
        • 减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
    • 2.对于神经网络,注意梯度消失和梯度爆炸问题。

    2.2.6 评价指标

    训练好的模型,上线之前要对模型进行必要的评估,目的让模型对语料具备较好的泛化能力。具体有以下这些指标可以参考。

    • 1.错误率、精度、准确率、精确度、召回率、F1 衡量。

    • 2.ROC 曲线、AUC 曲线。
      ROC 全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。我们根据模型的预测结果,把阈值从0变到最大,即刚开始是把每个样本作为正例进行预测,随着阈值的增大,学习器预测正样例数越来越少,直到最后没有一个样本是正样例。

    2.3 NLP研究任务

    NLP可以被应用于很多领城,这里大概总结出以下几种通用的应用:

    • 机器翻译:计算机具备将一种谐育翻译成另一种语 言的能力。
    • 情感分析:计算机能够判断用户评论是香积极。
    • 智能问答:计算机能够正确回答输人的问题。
    • 文摘生成:计算机能够准确日纳、总结井产生文本摘要。
    • 文本分类计算机能够采集各种文章,进行主题分析,从而进行行自动分类。
    • 舆论分析:计算机能够判断目前舆论的导向。
    • 知识图谱: 知识点相互连接而成的语义网络。

    2.3.1 机器翻译

    机器翻译是自然语言处理中最为人所熟知的场景,国内外有很多比较成熟的机器翻译产品,比如百度翻译、Google翻译等,还有提供支持语音输人的多国语互译的产品(比如科大讯飞就出了-款翻译札)。

    2.3.2 情感分析

    情感分析在一些评论网站 比较有用,比如某餐饮网站的评论中会有非常多拔草的客人的评价,如果一眼扫过去满眼都是又贵又难吃,那谁还想去呢?另外有些商家为了获取大量的客户不惜雇佣水军灌水,那就可以通过自然语言处理来做水军识别,情感分析来分析总体用户评价是积极还是消极。

    2.3.4 智能问答

    智能问答在一-些电商网站有非常实际的价值,比如代替人工充当客服角色,有很多基本而且重复的问题,其实并不需要人工客服来解决,通过智能问容系统可以筛选掉大最重复的问题,使得人工座席能更好地服务客户。

    2.3.5 文摘生成

    文摘生成利用计算机自动地从原始文献中摘取文摘,全面准确地反映某文献的中心内容。这个技术可以帮助人们节省大量的时间成本,而且效率更高。

    2.3.6 文本分类

    文本分类是机器对文本按照-定的分类体系自动标注类别的过程。举一个例子 ,圾邮件是一种令 人头痛的顽症,困扰着非常多的互联网用户。2002 年,Paul Graham机出使用“贝叶斯推断”来过滤垃圾邮件,1000 封垃圾邮件中可以过滤掉995封并且没有一个是误判,另外这种过滤器还具有自我学习功能,会根据新收到的邮件,不断调整。也就是说收到的垃圾邮件越多,相对应的判断垃圾邮件的准确率就越高。

    2.3.7 舆论分析

    舆论分析可以帮助分析哪些话题是目前的热点,分析传播路径以及发展趋势,对于不好的舆论导向可以进行有效的控制。

    2.3.8 知识图谱

    知识图谱( Knowledge Graph/Vault)又称科学知识图谱,在图书情报界称为知识域可视化或知识领域映射地图,是显示知识发展进程与结构关系的一系列各 种不同的图形,用可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。

    2.4 知识结构

    作为一门综合学科,NLP是研究人与机器之间用自然语言进行有效通信的理论和方法。这需要很多跨学科的知识,需要语言学、统计学、最优化理论、机器学习、深度学习以及自然语育处理相关理论模型知识做基础。作为一门杂学,NLP可谓包罗万象,体系化与特殊化并存,这里简单罗列其知识体系,如下图2.3所示:
     


    在这里插入图片描述
    图2.3 知识结构
    ▼有法语义分析:针对目标句子,进行各种句法分析,如分词、 词性标记、命名实体识别及链接、句法分析、语义角色识别和多义词消歧等。
    ▼关键词抽取:抽取目标文本中的主要信息,比如从一条新闻中抽取关键信息。主要是了解是谁、于何时、为何、对谁、做了何事、产生了有什么结果。涉及实体识别、时间抽取、因果关系抽取等多项关键技术。
    ▼文本挖掘:主要包含了对文本的聚类、分类,信息抽取、摘要、情感分析以及对挖掘的信息和知识的可视化、交互式的呈现界面。
    ▼机器翻译:将输人的源语言文本通过自动翻译转化为另种语言的文本。根据输人数据类型的不同,可细分为文本翻译、语音翻译、手语翻译、图形翻译等。机器翻译从最早的基于规则到二十年前的基于统计的方法,再到今天的基于深度学习(编解码)的方法,逐渐形成了一套比较严谨的方法体系。
    ▼信息检索:对大规模的文档进行索引。可简单对文档中的词汇,赋以不同的权重来建立索引,也可使用算法模型来建立更加深层的索引。查询时,首先对输入比进行分析,然后在索引里面查找匹配的候选文档,再根据个排序 机制把候选文档排序,最后输出排序得分最高的文档。
    ▼问答系统:针对某个自然语言表达的问题,由问答系统给出一个精准的答案。需
    要对自然语言查询语句进行语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。
    ▼对话系统:系统通过多回合对话,跟用户进行聊天、回答、完成某项任务。主要涉及用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。同时,为了体现个性化,基于用户画像做个性化回复。

    2.5 知识结构

    自然语言处理可以分为以下三个层面:
    (1) 第一层面:词法分析
    词法分析包括汉语的分词和词性标注这两部分。之前有提过,汉语分词与英文不同,汉语书面词语之间没有明显的空格标记,文本中的句子以字竹串的方式出现,向子中心逗号分隔,句子和句子之间常以句号分隔。针对议语这种独特的书面表现形式,汉语的自然语言处理的首要工作就是要将输人的文本切分为单独的词语,然后在此技术上进行其他更高级的分析。
    上述这个步骤称为分词。除了分词之外,词性标注也通常被认为是词法分析的一部分,词性标注的目的是为每一个词赋予一个类别,这个类别可以是名词(noun)、动词(verb)、形容词(adjective)等。通常来说,属于相同词性的词,在句法中承担类似的角色。
    (2)第二层面:句法分析
    句法分析是对输人的文本以句子为单位,进行分析以得到句子的句法结构的处理过程。对句法结构进行分析,一方面是为了帮助理解句子的含义,另一方面也为更高级的自然语言处理任务提供支持(比如机器翻译、情感分析等)。目前业界存在三种比较主流的句法分析方法:短语结构句法体系,作用是识别出句子中的短语结构以及短语之间的层次句法关系;依存结构句法体系,作用是识别句子中词与词之间的相互依赖关系;深层文法句法分析,利用深层文法,例如词汇化树邻接文法,组合范畴文法等对句子进行深层的句法以及语义分析。
    上述几种句法分析,依存句法分析属于浅层句法分析,其实现过程相对来说比较简单而且适合在多语言环境下应用,但是其所能提供的信息也相对较少。深层文法句法分析可以提供丰富的句法和语义信息,但是采用的文法相对比较复杂,分析器的运行复杂度也比较高,这使得深层句法分析不太适合处理大规模的数据。短语结构句法分析介于依存句法分析和深层文法句法分析之间。
    (3)第三个层面:语义分析
    语义分析的最终目的是理解句子表达的真是语义。但是,语义应该采用什么表示形式一直困扰着研究者们,至今这个问题也没有一个统一的答案。语义角色标注(semantic role labeling)是目前比较成熟的浅层语义分析技术。语义角色标注一般都在句法分析的基础上完成,句法结构对于语义角色标注的性能至关重要。基于逻辑表达的语义分析也得到学术界的长期关注。出于机器学习模型复杂度、效率的考虑,自然语言处理系统通常采用级联的方式,即分词、词性标注、句法分析、语义分析分别训练模型。实际使用时,给定输入句子,逐一使用各个模块进行分析,最终得到所有结果。
    近年来,随着研究工作的深人,研究者们提出了很多有效的联合模型,将多个任务联合学习和解码,如分词词性联合、词性句法联合、分词词性句法联合句法语义联合等。联合模型通常都可以显著提高分析质量,原因在于联合模型可以让相互关联的多个任务互相帮助,同时对于任何单任务而言,人工标注的信息也更多了。然而,联合模型的复杂度更高,速度也更慢。

    三、总结

    自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。因此,自然语言处理是与人机交互的领域有关的。在自然语言处理面临很多挑战,包括自然语言理解,因此,自然语言处理涉及人机交互的面积。在NLP诸多挑战涉及自然语言理解,即计算机源于人为或自然语言输入的意思,和其他涉及到自然语言生成。
    现代NLP算法是基于机器学习,特别是统计机器学习。机器学习范式是不同于一般之前的尝试语言处理。语言处理任务的实现,通常涉及直接用手的大套规则编码。
    许多不同类的机器学习算法已应用于自然语言处理任务。这些算法的输入是一大组从输入数据生成的“特征”。一些最早使用的算法,如决策树,产生硬的if-then规则类似于手写的规则,是再普通的系统体系。然而,越来越多的研究集中于统计模型,这使得基于附加实数值的权重,每个输入要素柔软,概率的决策。此类模型具有能够表达许多不同的可能的答案,而不是只有一个相对的确定性,产生更可靠的结果时,这种模型被包括作为较大系统的一个组成部分的优点。
    自然语言处理研究逐渐从词汇语义成分的语义转移,进一步的,叙事的理解。然而人类水平的自然语言处理,是一个人工智能完全问题。它是相当于解决中央的人工智能问题使计算机和人一样聪明,或强大的AI。自然语言处理的未来一般也因此密切结合人工智能发展。
    这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
     

     
    在这里插入图片描述

    展开全文
  • 1、学会使用11大Java开源中文分词器2、对比分析11大Java开源中文分词器的分词效果本文给出了11大Java开源中文分词使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。...
  • Nodejs 中文分词

    千次阅读 2020-07-05 21:20:47
    中文分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界...
  • 中文分词搜索功能

    2020-07-31 11:03:29
    中文分词介绍众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a ...把中文汉字序列切分成有意义的词,就是中文分词,...
  • 中文分词方法

    2021-04-13 16:07:03
    当然分词只是一个工具,场景不同,要求也不同。在人机自然语言交互中,成熟的中文分词算法能够达到更好的自然语言处理效果,帮助计算机理解复杂的中文语言。竹间智能在构建中文自然语言对话系统时,结合语言学不断...
  • 这里使用网上流行的开源分词工具结巴分词(jieba),它可以有效的将句子里的词语一个个的提取出来,关于结巴分词的原理此处不再赘述,关键是他的使用方法。1、安装结巴分词是一个Python的工具函数库,在python环境下...
  • 中文分词中间件的设计与实现,张静,宋俊德,中文分词技术是中文信息处理的基础,具有广泛的应用场景。开发者在确定采用何种中文分词系统之前,通常需要比较不同中文分词系统
  • 中文分词工具比较

    千次阅读 2020-02-09 14:02:17
    在本篇文章中,将介绍9个常用的分词工具及其对比。 jieba、SnowNLP、北京大学PKUseg、清华大学THULAC、HanLP、FoolNLTK、哈工大LTP、CoreNLP、BaiduLac。 * 部分分词中有可参考的论文。如北大、清华,可引用 文章...
  • 一文中,我们讲解了 ElasticSearch 如何在数据存储方面支持全文搜索和复杂条件查询,本篇文章则着重分析 ElasticSearch 在全文搜索前如何使用 ik 进行分词,让大家对 ElasticSearch 的全文搜索和 ik 中文分词原理有...
  • 什么是中文分词,其原理与方法又是如何应用在智能运维中的,本篇将带来详细解答。
  • 文章目录分词器介绍ikik-pinyinngram代码示例说明详细代码部分场景测试结果示例 分词器介绍 ik 中文分词器,免费,使用方便,自带词库,可以指定自定义词库 ik_smart 智能分词,较max分词粒度更粗,结果数更少。...
  • 1、学会使用11大Java开源中文分词器2、对比分析11大Java开源中文分词器的分词效果本文给出了11大Java开源中文分词使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。...
  • 1、当用户输入 “第三方支付” 2、swoole百度分词拆分为: “第三方” “三方” “支付” 3、素材美内置近义词: 免签支付、收款码、第四方支付等等 4、计算分词相似度,生成查询 5、输出结果 最后再试试关键词干扰吧...
  • 原标题:一文详解如何用 python 做中文分词雷锋网按:本文作者王树义,原载于微信公众号玉树芝兰(nkwangshuyi),雷锋网经授权发布。打算绘制中文词云图?那你得先学会如何做中文文本分词。跟着我们的教程,一步步用 ...
  • 根据自己的编程语言选择一款合适的中文分词组件,我在 ASP.NET 平台下选择了 jieba.NET。设想的步骤:分别对文章标题、标签、正文进行分词,保存到一张分词表上。该表把“文章 ID”和“词语”设为联合主键,用 3 个...
  • 细说中文分词

    千次阅读 2020-03-20 08:39:51
    完整的中文自然语言处理过程一般包括以下五种中文处理核心技术:分词、词性标注、命名实体识别、依存句法分析、语义分析。其中,分词中文自然语言处理的基础,搜素...中文分词就是将中文语句中的词汇按照使用时的...
  • 中文分词常见方法

    万次阅读 2017-07-25 12:32:06
    作者:竹间智能 Emotibot ... 来源:知乎 ...中文分词中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块。不同于英文的是,中文句子中没有词的界限,因此在进行中文自然语言处理时,通常
  • 搜索热词最近在做建筑行业相关的项目,遇到的一个应用场景是解析材料名称。由于输入的数据中材料名称非常不规范,而且数量量又非常大,所以处理起来比较困难。名称不规范的意思是,比如标准材料叫:“圆钢”,材料中...
  • 中文分词介绍众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来...把中文汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,628
精华内容 4,651
关键字:

中文分词的应用场景

友情链接: shoppingCart.rar