精华内容
下载资源
问答
  • 中文分词C++代码

    2016-01-12 14:03:21
    程序输出:有意义中文词组,并标注其词性,如动词、名词、形容词、副词、数字、日期等,输出到文本文档中; test是语料库文件,test1是输入文件 另外一个是输出文件 还有一个.cpp的,一个.h的资源文件, 在VS2012...
  • es中文分词器安装包

    2019-07-25 23:18:48
    在搜索引擎领域,比较成熟和流行的,就是ik分词器,其实我们用来进行搜索的,绝大多数,都是中文应用,...standard:没有办法对中文进行合理分词的,只是将每个中文字符一个一个的切割开来,其实搜索的时候意义不大...
  • 中文分词的四大难题 N-Gram切词法 解决中文分词歧义问题 解决未登录词问题 进阶知识 HMM-隐马尔可夫模型 CRF-条件随机场 业务案例 关键词挖掘 文本相似度 自动摘要 自然语言处理基础技术 词法分析:分词、词性...

    最近研究NLP的技术,搞了掘金小册子入个门,随手做个笔记
    内容源于掘金小册《深入理解NLP的中文分词:从原理到实践》


    背景

    • 自然语言处理基础技术
    • 自然语言处理应用技术

    基础知识

    • 中文分词的四大难题
    • N-Gram切词法
    • 解决中文分词歧义问题
    • 解决未登录词问题

    进阶知识

    • HMM-隐马尔可夫模型
    • CRF-条件随机场

    业务案例

    • 关键词挖掘
    • 文本相似度
    • 自动摘要

    下面细讲每点的主要内容

    自然语言处理基础技术

    • 词法分析:分词、词性标注、实体识别
    • 词向量表示:语义挖掘、词义相似度
    • 文本相似度:计算两个短文本之间的语义相似度,实现推荐和排序
    • 依存句法分析:自动分析文本中的依存句法结构信息
    • DNN语言模型:判断一句话是否符合语言表达习惯

    自然语言处理应用技术

    • 文本纠错:识别文本中的错别字,给出提示及正确的建议
    • 情感倾向分析:对包含主观信息的文本进行情感倾向性判断
    • 评论观点抽取:分析评论关注点和观点,输出标签及观点极性
    • 对话情绪识别:识别会话者所表现出的情绪类别及置信度
    • 文本标签:输出能够反映文章关键信息的多维度标签
    • 文章分类:输出文章的主题分类及对应的置信度
    • 新闻摘要:抽取关键信息并生成指定长度的新闻摘要
    • 文本审核:对敏感内容进行识别和过滤
    • 文本翻译:通用翻译、语音翻译、拍照翻译

    中文分词的四大难题

    1、如何清晰地界定中文词汇
    中文分词工具的好或坏,至少需要有一个清晰的评判标准,即中文词汇的界定
    举例,“科教兴国”既可以整体切分成「科教兴国」,也可以切碎成「科教」和「兴国」 ,都符合百科里面的定义,也都合情合理
    后面的章节我会详细讲解中文分词工具是如何处理这类问题的

    2、是先分词后理解,还是先理解后分词
    很多人去尝试这种先理解后分词的方案,其核心思想就是把分词的决定放在句法分析的过程中去解决,这样就需要一个强大的基于句法-语义规则的句子分析系统中文分词歧义的问题
    然而这样的一套中文分词工具严重依赖人工规则的质量和数量,即便在不考虑成本的情况下,在国际中文分词评测活动中还是不敌基于统计学习的中文分词工具
    结论就是在中文分词解决方案的选择上,先分词后理解得到了理论和评测数据的双重肯定。

    3、中文分词歧义的问题(N-Gram切词法
    交集型歧义
    用一个直观的形式表示交集型歧义就是:ABC,即可以切分成AB/C,也可以切分成A/BC

    工作的和尚未工作的
    工作 /// 尚未 / 工作 / 的
    工作 // 和尚 // 工作 /

    组合型歧义
    同样用一个直观的形式表示组合型歧义就是:AB,即可以组合成AB,也可以切分成A/B

    希望你们再创新的业绩
    希望 / 你们 ///// 业绩
    希望 / 你们 // 创新 // 业绩
    

    4、未登录词的识别问题
    通过大量的评测结果表明,未登录词对精度的影响是歧义问题的5倍以上
    未登录词其实不难理解,就是没有被收录到分词词典里的词。这样的词类型有很多:网络新词(最难)、人名、机构名、缩写词、新增词等等。
    然而这些类型的词往往对实际业务有着很大的价值,是分词结果考察的重点。
    当然已经有了很多的方法,可以自动识别未登录词,比如:HMM、CRF等。

    HMM:隐马尔可夫模型,是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。
    
    CRF:条件随机场,是给定一组输入序列条件下另一组输出序列的条件概率分布模型。
    

    N-Gram模型切词法

    先了解一下统计语言模型
    统计语言模型,是将每句话都看作是由单词组成的序列,S=(w_{1}, w_{2}, w_{3}, …, w_{n}),然后对每句话S评定一个概率P(S)=P(w_{1}, w_{2}, w_{3}, …, w_{n}),若该概率越高,则说明该句话越符合语法,越像人话。

    利用条件概率将计算公式改写成:
    在这里插入图片描述
    可以理解为将w_{1}到w_{n}同时发生的联合概率,替换成了w_{1}发生的概率,加上w_{1}发生情况下w_{2}发生的概率,并以此累加而得到的概率,这样就离可计算、可泛化更近了一步。

    因为一个完整的句子作为统计单位,其可统计的样本数据是非常有限的,所以得到的统计结果缺乏普遍性,如果出现一个不曾在样本数据里的句子时,就无法判断其概率了。
    实际情况是,在一句话里一个词是否可能出现,依赖的是它邻近的几个词,距离很远的词已经起不到多大的作用了。

    推导到这里,就需要引出马尔可夫假设,来进一步简化计算公式

    马尔可夫假设:就是每个词出现的概率只跟它前面的少数几个词有关。
    

    当m=1时,是一个一元模型,Uni-Gram model:
    在这里插入图片描述
    很容易发现,当m=N时,我们就得到了N-Gram model,这个推导过程就说明了什么是N-Gram模型。

    N-Gram模型利用统计信息找出一条概率最大的路径,得到最终的分词结果。
    以“南京市长江大桥”为例,将其切分成一个有向无环图(DAG)

    假设S是一段文本,W是S上所有可能的切分路径。我们只要能求解出条件概率P(W|S)的最大值,就能得到我们想要的切分路径了
    根据贝叶斯公式:
    贝叶斯公式推导式
    可以理解为W,S同时发生的概率除以S发生的概率,就是S发生情况下W发生的概率,同时W,S同时发生的概率,也可以理解为W发生的概率乘以W发生情况下S发生概率
    由于P(S)为归一化因子,而P(S|W)恒为1,因此我们只需要求解P(W)的最大值即可,这就是N-Gram模型了。
    借鉴N-Gram模型的思想,将中文句子按字进行N-Gram的切分。
    不难发现,在N不同的取值范围里,是可以切分出语义正确的词汇,当然这里面也包含了大量的语义错误的噪声词。
    但在一些特殊的业务场景里,这样的结果是非常有价值的,如:新词发现、文本挖掘等。

    解决中文分词歧义问题

    交集型歧义

    解决方法:
    最大匹配法

    • 正向最大匹配法,是从左向右扫描切分词的最大匹配
    • 逆向最大匹配法,是从右向左扫描切分词的最大匹配
    • 双向最大匹配法,是通过对比正向和逆向的匹配结果,然后按照最大匹配原则,选取分词总数最少的作为结果,来决定最优的切分路径。
      结论:
      最大匹配法可以解决90%的句子,正向最大匹配法和逆向最大匹配法的结果完全重合且正确,只有9%的句子两种方法的结果不一样,但其中必有一个是正确的,只有1%的句子,无论那种方法结果都是错误的

    特殊规则法
    **规则一:**把一些字与字之间搭配的优先级事先定义好
    **规则二:**一个适用范围更广的规则,整理一份不能单独成词的字表

    如何决定全局评判标准:(解决组合型歧义)
    最大匹配原则,添加上**“不成词字表”的规则**,利用动态规划求解分词总数最少
    小结:词总数最少法,切分路径结果里有多少词,就罚多少分,每出现一个不成词的单字,就加罚一分,罚分最少的就是最优的分词结果。
    在此算法具体实现层面,并不需要穷举所有的切分可能,利用动态规划求解最短路径效率会更高。
    动态规划
    利用动态规划,则可以解决任何一个图论中最短路径问题,效率更高。其思想是通过把原复杂问题分解为相对简单的子问题的方式来求解。
    动态规划的设计有一定的模式,一般要经历4个步骤:

    1. 划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意划分后的阶段一定要有序,否则问题无解。
    2. 确定状态和状态变量:将问题发展到各个阶段时处于的各种客观情况用不同的状态表示出来。
    3. 确定决策并写出状态转移方程:因为决策和状态转移有着必然的联系,状态转移就是根据上一阶段的状态和决来导出本阶段的状态。
    4. 找出边界条件:给出的状态转移方程是一个递归式,需要一个终止条件或边界条件。

    小灰讲解动态规划链接

    解决未登录词问题

    基于统计的抽词算法——凝固度
    从语料抽取,抽号的词与现有的词典比较,发现新词
    引入重要的统计学概念——大数定律。

    大数定律:在相同条件下,随着随机试验次数的增多,频率越来越接近于概率。注意大数定律陈述的是一个随着n趋向于无穷大时频率对真实概率的一种无限接近的趋势。
    

    用N-Gram方法将语料库切分成各种序列,一元、二元、三元,根据需求切分更多元的序列,统计各元素的频数
    仅仅是靠频数还是不够的,因为一个经常出现的元素有可能不是一个词,而是多个词组成的词组。假如,语料库里“的飞机”出现的频数要高于“飞机场”出现的频数,但显然“的飞机”应该被切分成「的」和「飞机」,需要凝固度帮助解决。

    凝固度:用来衡量一个字组合片段里面字与字之间的紧密程度,凝固度越高,说明这个组合片段(这个词)越不可分
    

    在计算语言学中,PMI(Pointwise mutual information,逐点互信息)被用来度量词搭配与关联性:

    针对一个词有多种搭配组合的情况,如“飞机场”可以由「飞机」+「场」组合,也可以由「飞」+「机场」组合,可以改进一下PMI公式:
    在这里插入图片描述
    公式的理解:C{m}_{1}表示要求解的「词」,如:“飞机场”。P(C{m}{1})表示这个「词」出现的概率,\prod{P(C^{j}{i}})表示这个「词」的各种搭配组合的随机概率,如:「飞机」+「场」、「飞」+「机场」,最后取这里面最小值代这个「词」的凝固度。
    取最小值,是为了避免错误的切分组合过高地估计了凝固度。

    另一个重要的算法——自由度
    还需要了解一个重要的概念信息熵,因为自由度算法就是由信息熵概念而产生的。
    “信息熵”是“熵”在信息论里的一种表现,表示无序的信息。
    信息熵:接收的每条消息中包含的信息的平均量,这个值可以用来衡量文本内容的不确定性。
    自由度算法

    自由度:一个字组合片段能独立自由运用的程度,自由度越低,说明越不能单独成词
    

    一个「词」和它左边、右边的字搭配越丰富,则这个「词」越独立成词,反之,则这个「词」越像半个词。
    一个「词」自由运用的程度是判断它是否成词的重要依据,这恰恰就是信息熵所要度量的问题。我们也就有了自由度的计算公式:
    自由度计算公式
    公式的理解:C{m}_{1}表示待处理的「词」,如:“辈子”等,le(C{m}{1})和re(C^{m}{1})则表示的是左邻字集合的信息熵和右邻字集合的信息熵,最后取最小值表示这个「词」的自由度。
    这里找到一个比较有趣的做法:基于凝聚度和自由度的非监督词库生成

    HMM — 隐马尔可夫模型

    HMM隐马尔可夫模型的定义:用来描述一个含有隐含未知参数的马尔可夫过程。
    马尔可夫模型是从直接观察前面节点一步步生成后面节点的过程,HMM就是说,前面节点不让你直接观察了,抽象出一组隐藏状态的节点(有点像LSTM的感觉)

    CRF — 条件随机场

    这里有一个关于CRF更详细的讲解

    https://www.cnblogs.com/pinard/p/7048333.html

    随机场:由若干个位置组成的整体,当每一个位置按照某种分布随机赋值之后,其全部情况
    CRF条件随机场的定义:每一个位置按照条件概率分布随机赋值的随机场。

    CRF对比HMM的优势,当我们正确判断一个事情时,需要很多的上下文信息,HMM只考虑了前一个隐藏状态和当前一个观察状态的影响,而忽略掉了之前和之后的状态,CRF考虑了全局的信息,可以充分地学习到全局的信息,获得更多的有效特征,提高模型的判断性能

    CRF的实现:

    线性链条件随机场
    在这里插入图片描述
    每个字的标注结果都会受到全局的影响,那么如何用一种可量化的计算公式进行表达,就是接下来我们要思考的问题了。我们可以使用条件概率:
    P(Y_{i}|X, Y_{1}, Y_{2}, …, Y_{n})
    其中Y_{i}表示句子中的第i个字的标注,X表示句子中字的集合,Y_{1},Y_{2}, … , Y_{n}表示句子中其它字的标注。
    特别需要注意的是:当X与Y具有相同的结构时,这样的CRF称为线性链条件随机场(linear-CRF)。而词位标注(中文分词)恰恰符合这样的定义。

    特征函数:通过函数的形式来描述linear-CRF中的依赖关系(就是特征)
    在这里插入图片描述
    参数含义:
    s表示句子
    i表示第i个字
    l_{i}表示第i个字的标注词位
    l_{i-1}表示第i-1个字的标注词位
    而返回结果如下:
    符合这个特征时,则返回1
    不符合这个特征时,返回0
    这只是一个特征函数,我们可以根据实际需要,定义一个特征函数集合,用这个特征函数集合来为一个标注序列打分,并据此选出最优的标注序列。

    假如仅仅依靠当前字的标注和它前一个字的标注,来分别对标注序列进行打分,然后把这个特征函数集的打分综合起来,最后得到就是标注序列的评分了。计算公式如下:

    s_{l}(s, i, l_{i}) + t_{k}(s, i, l_{i-1}, l_{i}) ,其中l = 1, 2, …, L和k = 1, 2, …, K。

    需要注意的是:
    在linear-CRF中,特征函数分为两类

    第一类是定义在Y节点上的节点特征函数,这类特征函数只和当前节点有关,记为:
    s_{l}(s, i, l_{i}) ,l=1,2,…L
    其中L是定义在该节点的节点特征函数的总个数,i是当前节点在序列的位置。

    第二类是定义在Y上下文的局部特征函数,这类特征函数只和当前节点和上一个节点有关,记为:
    tk(yi−1,yi,x,i),k=1,2,…K
    其中K是定义在该节点的局部特征函数的总个数,i是当前节点在序列的位置。
    之所以只有上下文相关的局部特征函数,没有不相邻节点之间的特征函数,是因为我们的linear-CRF满足马尔科夫性。

    L和K这两类特征函数的数量并不相同,L是定义在该节点的节点特征函数(如:B、M、E、S)的总个数,而K是定义在该节点的局部特征函数(如:[B, M]、[B, E]等)的总个数。

    特征函数的返回结果不是1就是0,即满足条件或者不满足,但实际上不同的特征函数对最终评分的影响程度是不一样的,有的重要,有的作用不大。
    

    但同时采用概率计算,每个特征函数分配一个权值,用以表达这个特征函数的影响力。计算公式如下:
    在这里插入图片描述
    第一个求和是对遍历特征方程j的求和,而第二个求和是对句子里面的每一个位置i进行遍历进行求和。这里只是包含了一种类型的特征函数集,为了方便公式表达,而实际情况我们可以包含多种类型的特征函数集。
    对这个评分结果进行指数化归一化的处理,转换为0到1之间的概率值,方便比较和计算。
    假设tk的权重系数是λk,sl的权重系数是μl,则linear-CRF由我们所有的tk,λk,sl,μl共同决定。

    此时我们得到了linear-CRF的参数化形式如下:
                P(y|x)=1Z(x)exp(∑i,kλktk(yi−1,yi,x,i)+∑i,lμlsl(yi,x,i))
    其中,Z(x)为规范化因子:
    			Z(x)=∑yexp(∑i,kλktk(yi−1,yi,x,i)+∑i,lμlsl(yi,x,i))
    

    回到特征函数本身,每个特征函数定义了一个linear-CRF的规则,则其系数定义了这个规则的可信度。所有的规则和其可信度一起构成了我们的linear-CRF的最终的条件概率分布。

    当这些权重值已知的时候,只要有一个句子s,有一个标注序列l,就可以利用上面定义的计算公式对标注序列l进行打分了。
    为了得到这些权重,可以采用梯度上升法,通过学习训练数据,获得各个特征的最大权重值

    选用梯度上升法进行训练,想让每个特征发挥最大的影响力,假如这个特征函数赋予了最大的权重,对结果还没有什么影响,那么,比最大权重还要小的话,对结果的影响只会更小。

    关键词挖掘

    关键词挖掘是NLP任务中比较基础的,但却非常重要,它是很多NLP任务的前提条件。关键词的应用非常广泛,比如:SEO、搜索、推荐系统、知识图谱等等。
    基于统计特征的关键词挖掘 —— TF-IDF
    TF-IDF(term frequency-inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术,也是一种统计方法,用以评估一个词对于一个文件集或一个语料库中的其中一份文件的重要程度。

    TF-IDF的假设是,一个词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

    所以,TF-IDF有两层含义,一层是“词频”,另一层是“逆文档频率”(IDF)。它们的计算公式如下:

    在这里插入图片描述
    分母加1是为了避免所有文档都不包含某词时,导致分母为0
    在这里插入图片描述
    缺点是有时候重要的词出现的次数并不多,导致用词频来衡量一个词的重要性时并不全面.

    基于词图模型的关键词挖掘 —— TextRank
    TextRank算法的基本思想是,将待挖掘关键词的文本进行分词,以固定的窗口大小(可调整)来获得词之间的共现关系,构建一个无向带权图,然后用PageRank迭代计算图中每个节点(词)的rank值,按照rank值排序即可获得关键词。
    和 LDA、HMM 等模型不同, TextRank不需要事先对多篇文档进行学习训练, 因其简洁有效而得到广泛应用,与TF-IDF的改进点,考虑了相邻词的语义关系、基于图排序的提取关键词,由于TextRank涉及到构建词图及迭代计算,所以提取速度较慢。
    但是,本质上还是基于词频,严重依赖分词结果,如果某词在分词时被切分成了两个词,那么在做关键词提取时无法将两个词黏合在一起(TextRank有部分黏合效果,但需要这两个词均为关键词),而且需要节点(词)不断出现才会生成新的关键词。

    基于主题模型的关键词挖掘 —— LDA
    LDA是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量即可。

    如果我们想要还原出“文章确定主题,主题确定用词”的这个过程,就需要一个上帝视角,而LDA就是通过概率和计算的方式,帮我们打开了这个上帝视角。

    gensim是一个Python NLP库,里面包含了LDA模型的实现

    文本相似度

    文本类推荐系统需要的重要特征
    文本相似度计算主要有4类方法:

    • 基于词向量
    • 基于字符
    • 基于概率统计
    • 基于词嵌入模型

    基于词向量 —— 余弦相似度
    余弦相似度:通过测量两个向量的夹角的余弦值来度量它们之间的相似性。

    • 当两个向量指向相同时,余弦相似度为1
    • 当两个向量夹角为90°时,余弦相似度为0
    • 当两个向量指向相反时,余弦相似度为-1

    文本转成向量的形式,采用Word2Bag模型,利用TF-IDF进一步优化这个向量,为文本的每个词计算一个TF-IDF值,并赋值到原有向量的相同位置,这样每个词对于文本的重要程度就可以体现出来了。

    处理短文本(句子)间的相似度,直接用上述方法处理。
    处理长文本间的相似度,一般需要使用上关键词挖掘,即用长文本的关键词集合替代长文本的内容。好处:一是向量的维度会降低;二是长文本的重要信息更突出。

    基于字符 —— 编辑距离
    编辑距离:针对两个字符串的差异程度的量化测量,测量方法是看至少需要多少次的处理才能将一个字符串变成另一个字符串。常用的编辑距离是莱文斯坦距离

    编辑距离处理短文本间的相似度还可以,但要处理长文本就很困难了。同时,编辑距离算法本身有很强的局限性,很难处理同一个意思多种表达的情况。

    直接使用python-Levenshtein包来方便计算编辑距离

    基于概率统计 —— Jaccard系数
    Jaccard系数:主要用于计算样本间的相似度,用样本交集的个数除以样本并集的个数。

    关于文本相似度,我们可以将文本通过分词转换成词的集合,这样就可以利用Jaccard系数计算文本间的相似度了。

    用sklearn的CountVectorizer来帮助统计词频

    基于词嵌入模型 —— Word2vec
    上面三种都有缺失语义的问题
    一开始为了把文本进行数值化,使用One-Hot编码,但是当词汇表非常大的时候,导致编码后的向量维度非常高,而且不带有任何语义信息,向量空间稀疏。

    Word2vec采用神经网络实现,有两种实现模型:
    在这里插入图片描述

    • CBOW是给定上下文来预测input word,对于小数据集比较有效
    • Skip-gram是给定input word来预测上下文,对于大数据集比较有效

    腾讯的词向量数据,并且这些公开的Word2vec模型所使用语料库规模都比较大,效果会更好

    Word2vec就是利用神经网络解决缺失语义的问题,一个词经过Word2vec模型的编码,就可以学习到上下文的信息。此时,这个词的向量化表达就具有了语义。

    当词有了向量化表达,那么文本也可以用向量化表达,最简单的做法就是将句子中所有词的向量累加求平均值。之后,我们再使用余弦相似度进行计算,就可以得到带有语义信息的文本相似度了。

    这种方法的实际表现效果已经很好了,不过我们还可以为文本中每个词添加一个权重,比如:TF-IDF,来进一步提高效果。

    自动摘要

    摘要的本质就是在损失最小信息量的情况下,最大程度表达原文的信息量。

    信息熵的概念,这恰恰和信息量有直接关系。

    信息熵是接收的每条消息中包含的信息的平均量,这个值可以用来衡量文本内容的不确定性。

    通过阅读摘要,应该能够降低对原文的不确定感,摘要文本应当以最小的信息损失来推断原文内容。

    如何衡量这种不确定性降低的程度,就需要引出一个新的概念 —— 交叉熵。

    交叉熵是用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力大小。

    简单理解就是:交叉熵越低,非真实分布就越接近于真实分布,即摘要的信息量就越近于原文的信息量。

    抽取式摘要(Extraction )
    抽取式摘要是直接从原文中抽取一些句子组成摘要,其本质就是一个排序问题,我们给原文里每个句子打分,将分数高的句子摘出来

    如果对摘要的长度有限制,可以对特别长的句子进行压缩,来节省空间

    句子的权重计算就包含了3个方面:

    • 词的权重
    • 句子的位置信息
    • 句子间的相似度

    具体实现:
    一、利用zhon,将原文中所有的句子切分出来
    其中,zhon是一个Python的包,提供了中文文本处理中常用的常量
    二、使用TF-IDF值,计算句子里词的权重
    三、根据词的权重来计算句子的权重;计算位置权重,句子的相对位置比值;利用余弦相似度,计算句子相似度
    四、3个权重值按照一定的系数详见,得到句子最终的权重
    五、抽取原文的句子,生成摘要

    权重系数是可以根据评测的反馈进行调整,以达到最优的效果。评测的方法可以使用ROUGE。
    ROUGE(Recall-Oriented Understudy for Gisting Evaluation),是2003年提取的自动摘要系统评价方法,一直沿用至今,基于召回率的相似性度量方法。
    通过将自动生成的摘要与一组参考摘要(通常是人工生成的)进行比较计算,得出相应的分值,以衡量自动生成的摘要与参考摘要之间的相似度。

    ** 生成式摘要(Abstraction)**
    生成式摘要是通过抽象的语义表示,并使用语义推断和自然语言生成技术,来形成摘要,是一种监督学习的方式,需要大量的标注数据,比较难解决。
    对语义性要求更高,但也是更加贴近自然语言,这里可以结合句法依存分析、语义依存分析。

    展开全文
  • 深度学习将会变革NLP中的中文分词

    千次阅读 2016-11-08 16:14:43
    深度学习将会变革NLP中的中文分词

    http://www.leiphone.com/news/201608/IWvc75oJglAIsDvJ.html


    导语:深度学习,在NLP领域给中文分词技术带来了新鲜血液,改变了传统思路。深度神经网络的优点是可以自动发现特征,大大减少了特征工程的工作量,随之发展将会改革NLP。


    雷锋网按:本文转自ResysChina高翔,文章主要介绍了1)区分中文分词的方法;2)用深度学习的方法来解决中文分词的好处及其具体应用。


    现有分词介绍

    自然语言处理(NLP,Natural Language Processing)是一个信息时代最重要的技术之一,简单来讲,就是让计算机能够理解人类语言的一种技术。在其中,分词技术是一种比较基础的模块。对于英文等拉丁语系的语言而言,由于词之间有空格作为词边际表示,词语一般情况下都能简单且准确的提取出来。而中文日文等文字,除了标点符号之外,字之间紧密相连,没有明显的词边界,因此很难将词提取出来。分词的意义非常大,在中文中,单字作为最基本的语义单位,虽然也有自己的意义,但表意能力较差,意义较分散,而词的表意能力更强,能更加准确的描述一个事物,因此在自然语言处理中,通常情况下词(包括单字成词)是最基本的处理单位。在具体的应用上,比如在常用的搜索引擎中,term如果是词粒度的话,不仅能够减少每个term的倒排列表长度,提升系统性能,并且召回的结果相关性高更准确。比如搜索query“的确”,如果是单字切分的话,则有可能召回“你讲的确实在理”这样的doc。分词方法大致分为两种:基于词典的机械切分,基于统计模型的序列标注切分两种方式。

    基于词典的方法

    基于词典的方法本质上就是字符串匹配的方法,将一串文本中的文字片段和已有的词典进行匹配,如果匹配到,则此文字片段就作为一个分词结果。但是基于词典的机械切分会遇到多种问题,最为常见的包括歧义切分问题和未登录词问题

    1. 歧义切分

    歧义切分指的是通过词典匹配给出的切词结果和原来语句所要表达的意思不相符或差别较大,在机械切分中比较常见,比如下面的例子:“结婚的和尚未结婚的人”,通过机械切分的方式,会有两种切分结果:1,“结婚/的/和/尚未/结婚/的/人”;2,“结婚/的/和尚/未/结婚/的/人”。可以明显看出,第二种切分是有歧义的,单纯的机械切分很难避免这样的问题。

    2. 未登录词识别

    未登录词识别也称作新词发现,指的是词没有在词典中出现,比如一些新的网络词汇,如“网红”,“走你”;一些未登录的人名,地名;一些外语音译过来的词等等。基于词典的方式较难解决未登录词的问题,简单的case可以通过加词典解决,但是随着字典的增大,可能会引入新的bad case,并且系统的运算复杂度也会增加。

    3. 基于词典的机械分词改进方法

    为了解决歧义切分的问题,在中文分词上有很多优化的方法,常见的包括正向最大匹配,逆向最大匹配,最少分词结果,全切分后选择路径等多种算法。

    4. 最大匹配方法

    正向最大匹配指的是从左到右对一个字符串进行匹配,所匹配的词越长越好,比如“中国科学院计算研究所”,按照词典中最长匹配原则的切分结果是:“中国科学院/计算研究所”,而不是“中国/科学院/计算/研究所”。但是正向最大匹配也会存在一些bad case,常见的例子如:“他从东经过我家”,使用正向最大匹配会得到错误的结果:“他/从/东经/过/我/家”。

    逆向最大匹配的顺序是从右向左倒着匹配,如果能匹配到更长的词,则优先选择,上面的例子“他从东经过我家”逆向最大匹配能够得到正确的结果“他/从/东/经过/我/家”。但是逆向最大匹配同样存在badcase:“他们昨日本应该回来”,逆向匹配会得到错误的结果“他们/昨/日本/应该/回来”。

    针对正向逆向匹配的问题,将双向切分的结果进行比较,选择切分词语数量最少的结果。但是最少切分结果同样有bad case,比如“他将来上海”,正确的切分结果是“他/将/来/上海”,有4个词,而最少切分结果“他/将来/中国”只有3个词。

    5. 全切分路径选择方法

    全切分方法就是将所有可能的切分组合全部列出来,并从中选择最佳的一条切分路径。关于路径的选择方式,一般有n最短路径方法,基于词的n元语法模型方法等。

    n最短路径方法的基本思想就是将所有的切分结果组成有向无环图,每个切词结果作为一个节点,词之间的边赋予一个权重,最终找到权重和最小的一条路径作为分词结果。

    基于词的n元语法模型可以看作是n最短路径方法的一种优化,不同的是,根据n元语法模型,路径构成时会考虑词的上下文关系,根据语料库的统计结果,找出构成句子最大模型概率。一般情况下,使用unigram和bigram的n元语法模型的情况较多。

    基于序列标注的分词方法

    针对基于词典的机械切分所面对的问题,尤其是未登录词识别,使用基于统计模型的分词方式能够取得更好的效果。基于统计模型的分词方法,简单来讲就是一个序列标注问题。

    在一段文字中,我们可以将每个字按照他们在词中的位置进行标注,常用的标记有以下四个label:B,Begin,表示这个字是一个词的首字;M,Middle,表示这是一个词中间的字;E,End,表示这是一个词的尾字;S,Single,表示这是单字成词。分词的过程就是将一段字符输入模型,然后得到相应的标记序列,再根据标记序列进行分词。举例来说:“达观数据位是企业大数据服务商”,经过模型后得到的理想标注序列是:“BMMESBEBMEBME”,最终还原的分词结果是“达观数据/是/企业/大数据/服务商”。

    在NLP领域中,解决序列标注问题的常见模型主要有HMM和CRF。

    HMM

    HMM(HiddenMarkov Model)隐马尔科夫模型应用非常广泛,基本的思想就是根据观测值序列找到真正的隐藏状态值序列。在中文分词中,一段文字的每个字符可以看作是一个观测值,而这个字符的词位置label(BEMS)可以看作是隐藏的状态。使用HMM的分词,通过对切分语料库进行统计,可以得到模型中5大要要素:起始概率矩阵,转移概率矩阵,发射概率矩阵,观察值集合,状态值集合。在概率矩阵中,起始概率矩阵表示序列第一个状态值的概率,在中文分词中,理论上M和E的概率为0。转移概率表示状态间的概率,比如B->M的概率,E->S的概率等。而发射概率是一个条件概率,表示当前这个状态下,出现某个字的概率,比如p(人|B)表示在状态为B的情况下人字的概率。

    有了三个矩阵和两个集合后,HMM问题最终转化成求解隐藏状态序列最大值的问题,求解这个问题最长使用的是Viterbi算法,这是一种动态规划算法,具体的算法可以参考维基百科词条,在此不详细展开。(https://en.wikipedia.org/wiki/Viterbi_algorithm)

    深度学习将会变革NLP中的中文分词

    图1:HMM模型示意图

    CRF

    CRF(Conditionalrandom field,条件随机场)是用来标注和划分结构数据的概率化结构模型,通常使用在模式识别和机器学习中,在自然语言处理和图像处理等领域中得到广泛应用。和HMM类似,当对于给定的输入观测序列X和输出序列Y,CRF通过定义条件概率P(Y|X),而不是联合概率分布P(X,Y)来描述模型。CRF算法的具体算法可以参考维基百科词条。(https://en.wikipedia.org/wiki/Conditional_random_field)

    深度学习将会变革NLP中的中文分词

    图2:不同概率模型之间的关系及演化图

    在实际应用中有很多工具包可以使用,比如CRF++,CRFsuite,SGD,Wapiti 等,其中CRF++的准确度较高。在分词中使用CRF++时,主要的工作是特征模板的配置。CRF++支持unigram,bigram两种特征,分别以U和B开头。举例来讲U00:%x[-2,0]表示第一个特征,特征取值是当前字的前方第二个字,U01:%x[-1,0]表示第二个特征,特征取值当前字前一个字,U02:%x[0,0]表示第三个特征,取当前字,以此类推。特征模板可以支持多种特征,CRF++会根据特征模板提取特征函数,用于模型的建立和使用。特征模板的设计对分词效果及训练时间影响较大,需要分析尝试找到适用的特征模板。

    深度学习介绍

    随着AlphaGo的大显神威,Deep Learning(深度学习)的热度进一步提高。深度学习来源于传统的神经网络模型。传统的神经网络一般由输入层,隐藏层,输出层组成,其中隐藏层的数目按需确定。深度学习可以简单的理解为多层神经网络,但是深度学习的却不仅仅是神经网络。深度模型将每一层的输出作为下一层的输入特征,通过将底层的简单特征组合成为高层的更抽象的特征来进行学习。在训练过程中,通常采用贪婪算法,一层层的训练,比如在训练第k层时,固定训练好的前k-1层的参数进行训练,训练好第k层之后的以此类推进行一层层训练。

    深度学习将会变革NLP中的中文分词

    图3:AlphaGo的神经网络模型的训练过程及架构

    深度学习将会变革NLP中的中文分词

     图4:Google Tensorflow官网的神经网络演示示意图

    深度学习在很多领域都有所应用,在图像和语音识别领域中已经取得巨大的成功。从2012年开始,LSVRC(LargeScale Visual Recognition Challenge)比赛中,基于Deep Learningd计算框架一直处于领先。2015年LSVRC(http://www.image-net.org/challenges/LSVRC/2015/results)的比赛中,微软亚洲研究院(MSRA)在图像检测(Objectdetection),图像分类定位(Object Classification+localization)上夺冠,他们使用的神经网络深达152层。

    在NLP中的应用

    在自然语言处理上,深度学习在机器翻译、自动问答、文本分类、情感分析、信息抽取、序列标注、语法解析等领域都有广泛的应用。2013年末google发布的word2vec工具,可以看做是深度学习在NLP领域的一个重要应用,虽然word2vec只有三层神经网络,但是已经取得非常好的效果。通过word2vec,可以将一个词表示为词向量,将文字数字化,更好的让计算机理解。使word2vec模型,我们可以方便的找到同义词或联系紧密的词,或者意义相反的词等。

    深度学习将会变革NLP中的中文分词

    图5:基于微信数据制作的word2vec模型测试: 编程

     深度学习将会变革NLP中的中文分词

    图6:基于微信数据制作的word2vec模型测试:韦德

    词向量介绍

    词向量的意思就是通过一个数字组成的向量来表示一个词,这个向量的构成可以有很多种。最简单的方式就是所谓的one-hot向量。假设在一个语料集合中,一共有n个不同的词,则可以使用一个长度为n的向量,对于第i个词(i=0…n-1),向量index=i处值为1外,向量其他位置的值都为0,这样就可以唯一的通过一个[0,0,1,…,0,0]形式的向量表示一个词。one-hot向量比较简单也容易理解,但是有很多问题,比如当加入新词时,整个向量的长度会改变,并且存在维数过高难以计算的问题,以及向量的表示方法很难体现两个词之间的关系,因此一般情况下one-hot向量较少的使用。

    如果考虑到词和词之间的联系,就要考虑词的共现问题。最简单的是使用基于文档的向量表示方法来给出词向量。基本思想也很简单,假设有n篇文档,如果某些词经常成对出现在多篇相同的文档中,我们则认为这两个词联系非常紧密。对于文档集合,可以将文档按顺编号(i=0…n-1),将文档编导作为向量索引,这样就有一个n维的向量。当一个词出现在某个文档i中时,向量i处值为1,这样就可以通过一个类似[0,1,0,…,1,0]形式的向量表示一个词。基于文档的词向量能够很好的表示词之间的关系,但是向量的长度和语料库的大小相关,同样会存在维度变化问题。

    考虑一个固定窗口大小的文本片段来解决维度变化问题,如果在这样的片段中,两个词出现了,就认为这两个词有关。举例来讲,有以下三句话: “我\喜欢\你”,“我\爱\运动”,“我\爱\摄影”,如果考虑窗口的大小为1,也就是认为一个词只和它前面和后面的词有关,通过统计共现次数,我们能够得到下面的矩阵:

    深度学习将会变革NLP中的中文分词

    图7:基于文本窗口共现统计出来的矩阵

    可以看到这是一个n*n的对称矩阵X,这个矩阵的维数会随着词典数量的增加而增大,通过SVD(Singular Value Decomposition,奇异值分解),我们可以将矩阵维度降低,但仍存在一些问题: 矩阵X维度经常改变,并且由于大部分词并不是共现而导致的稀疏性,矩阵维度过高计算复杂度高等问题。

    Word2vec是一个多层的神经网络,同样可以将词向量化。在Word2vec中最重要的两个模型是CBOW(Continuous Bag-of-Word)模型和Skip-gram(Continuous Skip-gram)模型,两个模型都包含三层: 输入层,投影层,输出层。CBOW模型的作用是已知当前词Wt的上下文环境(Wt-2,Wt-1,Wt+1,Wt+2)来预测当前词,Skip-gram模型的作用是根据当前词Wt来预测上下文(Wt-2,Wt-1,Wt+1,Wt+2)。在模型求解中,和一般的机器学习方法类似,也是定义不同的损失函数,使用梯度下降法寻找最优值。Word2vec模型求解中,使用了Hierarchical Softmax方法和NegativeSampling两种方法。通过使用Word2vec,我们可以方便的将词转化成向量表示,让计算机和理解图像中的每个点一样,数字化词的表现。

    LSTM模型介绍

    深度学习有很多种不同类型的网络,在图像识别领域,CNN(Convolutional Neural Network,卷积神经网络)使用的较多,而在NLP领域,考虑到上下文的RNN(Recurrent Neural Networks,循环神经网络)取得了巨大的成功。在传统的神经网络中,从输入层到隐藏层到输出层,层之间是全连接的,但是每层内部的节点之间是无连接的。因为这样的原因,传统的神经网络不能利用上下文关系, 而在自然语言处理中,上下文关系非常重要,一个句子中前后词并不独立,不同的组合会有不同的意义,比如”优秀”这个词,如果前面是”不”字,则意义完全相反。RNN则考虑到网络前一时刻的输出对当前输出的影响,将隐藏层内部的节点也连接起来,即当前时刻一个节点的输入除了上一层的输出外,还包括上一时刻隐藏层的输出。RNN在理论上可以储存任意长度的转态序列,但是在不同的场景中这个长度可能不同。比如在词的预测例子中: 1,“他是亿万富翁,他很?”; 2,“他的房子每平米物业费40元,并且像这样的房子他有十几套,他很?”。从这两个句子中我们已经能猜到?代表“有钱”或其他类似的词汇,但是明显,第一句话预测最后一个词时的上线文序列很短,而第二段话较长。如果预测一个词汇需要较长的上下文,随着这个距离的增长,RNN将很难学到这些长距离的信息依赖,虽然这对我们人类相对容易。在实践中,已被证明使用最广泛的模型是LSTM(Long Short-Term Memory,长短时记忆)很好的解决了这个问题。

    LSTM最早由Hochreiter及 Schmidhuber在1997年的论文中提出。首先LSTM也是一种RNN,不同的是LSTM能够学会远距离的上下文依赖,能够存储较远距离上下文对当前时间节点的影响。

    所有的RNN都有一串重复的神经网络模块。对于标准的RNN,这个模块都比较简单,比如使用单独的tanh层。LSTM拥有类似的结构,但是不同的是,LSTM的每个模块拥有更复杂的神经网络结构:4层相互影响的神经网络。在LSTM每个单元中,因为门结构的存在,对于每个单元的转态,使得LSTM拥有增加或减少信息的能力。

    深度学习将会变革NLP中的中文分词

    图8:标准RNN模型中的重复模块包括1层结构

    深度学习将会变革NLP中的中文分词

    图9:LSTM模型中的重复模块包括4层结构

    深度学习库keras介绍

    Keras(http://keras.io)是一个非常易用的深度学习框架,使用python语言编写,是一个高度模块化的神经网络库,后端同时支持Theano和TensorFlow,而Theano和TensorFlow支持GPU,因此使用keras可以使用GPU加速模型训练。Keras中包括了构建模型常用的模块,如Optimizers优化方法模块,Activations激活函数模块,Initializations初始化模块,Layers多种网络层模块等,可以非常方便快速的搭建一个网络模型,使得开发人员可以快速上手,并将精力放在模型设计而不是具体实现上。常见的神经网络模型如CNN,RNN等,使用keras都可以很快搭建出来,开发人员只需要将数据准备成keras需要的格式丢进网络训练即可。如果对keras中自带的layer有更多的需求,keras还可以自己定制所需的layer。

    Keras在NLP中的应用

    Keras项目中的example自带了多个示例,包括经典的mnist手写识别测试等,其中和NLP相关的示例有很多,比如基于imdb数据的情感分析、文本分类、序列标注等。其中lstm_text_generation.py示例可以用来参考设计序列标注问题,这个示例试图通过LSTM学习尼采的作品,通过序列标注的思想来训练一个文本生成器模型。下面着重看一下两个关键点:模型数据格式及模型设计。

    训练数据准备

    深度学习将会变革NLP中的中文分词

    这段代码是数据准备的情况。将尼采全文进行数据切割,每40个字符为一个片段,将紧接这个片段的字符作为预测值,来进行训练。字符片段的间隔为3。

    模型设计

    深度学习将会变革NLP中的中文分词

    在模型设计上,主要是使用了两层LSTM,每层的输出维度为512,并在每层LSTM后面加入了Dropout层,来防止过拟合。整个模型的输入维度是字符类别的个数,输入字符串长度是40,模型的输出维度也是字符类别长度。整个模型表达的意思是每输入40个字符,就会从模型中输出一个预测的字符。因为LSTM的对长依赖term的记忆性,因此在上下文很长(40个字符)的情况下也可以表现的很好。

    基于深度学习方式的分词尝试

    基于上面的知识,可以考虑使用深度学习的方法进行中文分词。分词的基础思想还是使用序列标注问题,将一个句子中的每个字标记成BEMS四种label。模型整的输入是字符序列,输出是一个标注序列,因此这是一个标准的sequenceto sequence问题。因为一个句子中每个字的上下文对这个字的label类型影响很大,因此考虑使用RNN模型来解决。

    环境介绍

    测试硬件是Macbook Pro 2014 Mid高配版,带NvidiaGT 750M GPU,虽然GPU性能有限,但通过测试性能还是强过mac自带的i7 CPU。使用GPU进行模型运算,需要安装Nvidia的cuda相关程序及cuDNN库,会有较大的性能提升。软件方面使用python2.7,安装好了keras,theano及相关库。关于keras使用GPU训练的环境搭建问题,可以参考这篇文章(Run Keras on Mac OS with GPU,http://blog.wenhaolee.com/run-keras-on-mac-os-with-gpu/)

    模型训练

    模型训练使用的是经典的bakeoff2005中的微软研究院的切分语料,将其中的train部分拿过来做训练,将test作为最终的测试。

    训练数据准备

    首先,将训练样本中出现的所有字符全部映射成对应的数字,将文本数字化,形成一个字符到数据的映射。在分词中,一个词的label受上下文影响很大,因此参考之前提到的lstm_text_generation.py示例,我们将一个长度为n个字符的输入文本处理成n个长度为k的向量,k为奇数。举例来说,当k=7时,表示考虑了一个字前3个字和后三个字的上下文,将这个七个字作为一个输入,输出就是这个字的label类型(BEMS)。

    基础模型建立

    参考lstm_text_generation.py 中的模型搭建方式,我们采用一层的LSTM构建网络,代码如下,

    深度学习将会变革NLP中的中文分词

    其中,输入的维度input_dim 是字符类别总数,hidden_node 是隐藏层的结点个数。在上面的模型中,第一层输入层Embedding的作用是将输入的整数向量化。在现在这个模型中,输入是一个一维向量,里面每个值是字符对应的整数,Embedding层就可以将这些整数向量化,简单来讲就是生成了每个字的字向量。接下来紧跟着一层是LSTM,它输出维度也是隐藏层的结点个数。Dropout层的作用是让一些神经节点随机不工作,来防止过拟合现象。Dense层是最后的输出,这里nb_classes的数目是4,代表一个字符的label。

    模型建立好后开始训练,重复20次,训练的结果如下:

    深度学习将会变革NLP中的中文分词

    图10:基础模型(1层LSTM优化器RMSprop)训练20次

    训练好后,我们使用msr_test的测试数据进行分词,并将最终的分词结果使用icwb2自带的脚本进行测试,结果如下:

    深度学习将会变革NLP中的中文分词

    图11:基础模型F Score: 0.845

    可以看到基础模型的F值一般,比传统的CRF效果差的较多,因此考虑优化模型。

    效果改进

    模型参数调整

    首先想到的是模型参数的调整。Keras官方文档中提到,RMSprop优化方法在RNN网络中通常是一个好的选择,但是在尝试了其他的优化器后,比如Adam,发现可以取得更好的效果:

    深度学习将会变革NLP中的中文分词

    图12:1层LSTM优化器Adam训练20次

    可以看到,Adam在训练过程中的精度就已经高于RMSprop,使用icwb2的测试结果为:

    深度学习将会变革NLP中的中文分词

    图11:修改优化器Adam后的模型F Score: 0.889

    模型结构改变

    现在网络结构较简单,只有一层LSTM,参考文档示例中的模型设计,考虑使用两层的LSTM来进行测试,修改后的代码如下:

    深度学习将会变革NLP中的中文分词

     注意,第一层LSTM有个return_sequences =True可以将最后一个结果出入到输出序列,保证输出的tensor是3D的,因为LSTM的输入要求是3D的tensor。

    两层LSTM模型训练过程如下:

    深度学习将会变革NLP中的中文分词

    图12:2层LSTM优化器Adam训练20次的模型

    可以看到,两层LSTM使得模型更加复杂,训练时常也增加不少。模型训练后,使用icwb2的测试结果为:

    深度学习将会变革NLP中的中文分词

    图13:两层LSTM的模型F Score: 0.889

    可以看到,随着模型的复杂,虽然F Score无提升,但是其他的指标有一定的提升。一般来说,神经网络在大量训练数据下也会有更好的效果,后续会继续尝试更大数据集更复杂模型的效果。

    总结和展望

    使用深度学习技术,给NLP技术给中文分词技术带来了新鲜血液,改变了传统的思路。深度神经网络的优点是可以自动发现特征,大大减少了特征工程的工作量,随着深度学习技术的进一步发展,在NLP领域将会发挥更大的作用。达观数据将在已有成熟的NLP算法及模型基础上,逐渐融合基于深度神经网络的NLP模型,在文本分类、序列标注、情感分析、语义分析等功能上进一步优化提升效果,来更好为客户服务。

    雷锋网(公众号:雷锋网)注:本文由ResysChina授权转载,如需转载请联系原作者。

    雷锋网原创文章,转载请注明来源出处

    展开全文
  • 转自 进击的Coder 公众号原理中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,...

    转自 进击的Coder 公众号

    原理

    中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,同时分词的背后其实是涉及各种各样的算法的。

    中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为切分。根据其特点,可以把分词算法分为四大类:

    基于规则的分词方法

    基于统计的分词方法

    基于语义的分词方法

    基于理解的分词方法

    下面我们对这几种方法分别进行总结。

    基于规则的分词方法

    这种方法又叫作机械分词方法、基于字典的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。文本的扫描顺序有正向扫描、逆向扫描和双向扫描。匹配原则主要有最大匹配、最小匹配、逐词匹配和最佳匹配。

    最大匹配法(MM)。基本思想是:假设自动分词词典中的最长词条所含汉字的个数为 i,则取被处理材料当前字符串序列中的前i个字符作为匹配字段,查找分词词典,若词典中有这样一个i字词,则匹配成功,匹配字段作为一个词被切分出来;若词典中找不到这样的一个i字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的字符作为新的匹配字段,再进行匹配,如此进行下去,直到匹配成功为止。统计结果表明,该方法的错误率为 1/169.

    逆向最大匹配法(RMM)。该方法的分词过程与 MM 法相同,不同的是从句子(或文章)末尾开始处理,每次匹配不成功时去掉的是前面的一个汉字。统计结果表明,该方法的错误率为 1/245。

    逐词遍历法。把词典中的词按照由长到短递减的顺序逐字搜索整个待处理的材料,一直到把全部的词切分出来为止。不论分词词典多大,被处理的材料多么小,都得把这个分词词典匹配一遍。

    设立切分标志法。切分标志有自然和非自然之分。自然切分标志是指文章中出现的非文字符号,如标点符号等;非自然标志是利用词缀和不构成词的词(包 括单音词、复音节词以及象声词等)。设立切分标志法首先收集众多的切分标志,分词时先找出切分标志,把句子切分为一些较短的字段,再用 MM、RMM 或其它的方法进行细加工。这种方法并非真正意义上的分词方法,只是自动分词的一种前处理方式而已,它要额外消耗时间扫描切分标志,增加存储空间存放那些非 自然切分标志。

    最佳匹配法(OM)。此法分为正向的最佳匹配法和逆向的最佳匹配法,其出发点是:在词典中按词频的大小顺序排列词条,以求缩短对分词词典的检索时 间,达到最佳效果,从而降低分词的时间复杂度,加快分词速度。实质上,这种方法也不是一种纯粹意义上的分词方法,它只是一种对分词词典的组织方式。OM 法的分词词典每条词的前面必须有指明长度的数据项,所以其空间复杂度有所增加,对提高分词精度没有影响,分词处理的时间复杂度有所降低。

    此种方法优点是简单,易于实现。但缺点有很多:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。

    基于统计的分词方法

    该方法的主要思想:词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。

    该方法所应用的主要的统计模型有:N 元文法模型(N-gram)、隐马尔可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、条件随机场模型(Conditional Random Fields,CRF)等。

    在实际应用中此类分词算法一般是将其与基于词典的分词方法结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

    基于语义的分词方法

    语义分词法引入了语义分析,对自然语言自身的语言信息进行更多的处理,如扩充转移网络法、知识分词语义分析法、邻接约束法、综合匹配法、后缀分词法、特征词库法、矩阵约束法、语法分析法等。

    扩充转移网络法。该方法以有限状态机概念为基础。有限状态机只能识别正则语言,对有限状态机作的第一次扩充使其具有递归能力,形成递归转移网络 (RTN)。在RTN 中,弧线上的标志不仅可以是终极符(语言中的单词)或非终极符(词类),还可以调用另外的子网络名字分非终极符(如字或字串的成词条件)。这样,计算机在 运行某个子网络时,就可以调用另外的子网络,还可以递归调用。词法扩充转移网络的使用, 使分词处理和语言理解的句法处理阶段交互成为可能,并且有效地解决了汉语分词的歧义。

    矩阵约束法。其基本思想是:先建立一个语法约束矩阵和一个语义约束矩阵, 其中元素分别表明具有某词性的词和具有另一词性的词相邻是否符合语法规则, 属于某语义类的词和属于另一词义类的词相邻是否符合逻辑,机器在切分时以之约束分词结果。

    基于理解的分词方法

    基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。

    专家系统分词法。从专家系统角度把分词的知识(包括常识性分词知识与消除歧义切分的启发性知识即歧义切分规则)从实现分词过程的推理机中独立出来,使知识库的维护与推理机的实现互不干扰,从而使知识库易于维护和管理。它还具有发现交集歧义字段和多义组合歧义字段的能力和一定的自学习功能。

    神经网络分词法。该方法是模拟人脑并行,分布处理和建立数值计算模型工作的。它将分词知识所分散隐式的方法存入神经网络内部,通过自学习和训练修改内部权值,以达到正确的分词结果,最后给出神经网络自动分词结果,如使用 LSTM、GRU 等神经网络模型等。

    神经网络专家系统集成式分词法。该方法首先启动神经网络进行分词,当神经网络对新出现的词不能给出准确切分时,激活专家系统进行分析判断,依据知识库进行推理,得出初步分析,并启动学习机制对神经网络进行训练。该方法可以较充分发挥神经网络与专家系统二者优势,进一步提高分词效率。

    以上便是对分词算法的基本介绍,接下来我们再介绍几个比较实用的分词 Python 库及它们的使用方法。

    分词工具

    在这里介绍几个比较有代表性的支持分词的 Python 库,主要有:

    1. jieba

    专用于分词的 Python 库,GitHub:https://github.com/fxsjy/jieba,分词效果较好。

    支持三种分词模式:

    精确模式,试图将句子最精确地切开,适合文本分析。

    全模式,将句子中所有的可能成词的词语都扫描出来,速度非常快,但是不能解决歧义。

    搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。

    另外 jieba 支持繁体分词,支持自定义词典。

    其使用的算法是基于统计的分词方法,主要有如下几种:

    基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)

    采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

    对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

    精确模式分词

    首先我们来看下精确模式分词,使用 lcut() 方法,类似 cut() 方法,其参数和 cut() 是一致的,只不过返回结果是列表而不是生成器,默认使用精确模式,代码如下:

    import jieba

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = jieba.lcut(string)

    print(len(result), '/'.join(result))

    结果:

    38 这个/把手/该换/了/,/我/不/喜欢/日本/和服/,/别/把手/放在/我/的/肩膀/上/,/工信处/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    可见分词效果还是不错的。

    全模式分词

    使用全模式分词需要添加 cut_all 参数,将其设置为 True,代码如下:

    result = jieba.lcut(string, cut_all=True)

    print(len(result), '/'.join(result))

    结果如下:

    51 这个/把手/该换/了///我/不/喜欢/日本/和服///别/把手/放在/我/的/肩膀/上///工信处/处女/女干事/干事/每月/月经/经过/下属/科室/都/要/亲口/口交/交代/24/口交/交换/交换机/换机/等/技术/技术性/性器/器件/的/安装/安装工/装工/工作

    搜索引擎模式分词

    使用搜索引擎模式分词需要调用 cut_for_search() 方法,代码如下:

    result = jieba.lcut_for_search(string)

    print(len(result), '/'.join(result))

    结果如下:

    42 这个/把手/该换/了/,/我/不/喜欢/日本/和服/,/别/把手/放在/我/的/肩膀/上/,/工信处/干事/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换/换机/交换机/等/技术/技术性/器件/的/安装/工作

    另外可以加入自定义词典,如我们想把 日本和服 作为一个整体,可以把它添加到词典中,代码如下:

    jieba.add_word('日本和服')

    result = jieba.lcut(string)

    print(len(result), '/'.join(result))

    结果如下:

    37 这个/把手/该换/了/,/我/不/喜欢/日本和服/,/别/把手/放在/我/的/肩膀/上/,/工信处/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    可以看到切分结果中,日本和服 四个字就作为一个整体出现在结果中了,分词数量比精确模式少了一个。

    词性标注

    另外 jieba 还支持词性标注,可以输出分词后每个词的词性,实例如下:

    words = pseg.lcut(string)

    print(list(map(lambda x: list(x), words)))

    运行结果:

    [['这个', 'r'], ['把手', 'v'], ['该', 'r'], ['换', 'v'], ['了', 'ul'], [',', 'x'], ['我', 'r'], ['不', 'd'], ['喜欢', 'v'], ['日本和服', 'x'], [',', 'x'], ['别', 'r'], ['把手', 'v'], ['放在', 'v'], ['我', 'r'], ['的', 'uj'], ['肩膀', 'n'], ['上', 'f'], [',', 'x'], ['工信处', 'n'], ['女干事', 'n'], ['每月', 'r'], ['经过', 'p'], ['下属', 'v'], ['科室', 'n'], ['都', 'd'], ['要', 'v'], ['亲口', 'n'], ['交代', 'n'], ['24', 'm'], ['口', 'n'], ['交换机', 'n'], ['等', 'u'], ['技术性', 'n'], ['器件', 'n'], ['的', 'uj'], ['安装', 'v'], ['工作', 'vn']]

    2. SnowNLP

    SnowNLP: Simplified Chinese Text Processing,可以方便的处理中文文本内容,是受到了 TextBlob 的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和 TextBlob 不同的是,这里没有用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。GitHub地址:https://github.com/isnowfy/snownlp。

    分词

    这里的分词是基于 Character-Based Generative Model 来实现的,论文地址:http://aclweb.org/anthology//Y/Y09/Y09-2047.pdf,我们还是以上面的例子说明,相关使用说明如下:

    from snownlp import SnowNLP

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    s = SnowNLP(string)

    result = s.words

    print(len(result), '/'.join(result))

    运行结果:

    40 这个/把手/该/换/了/,/我/不/喜欢/日本/和/服/,/别把手/放在/我/的/肩膀/上/,/工/信处女/干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    经过观察,可以发现分词效果其实不怎么理想,和服 被分开了,工信处 也被分开了,女干事 也被分开了。

    另外 SnowNLP 还支持很多功能,例如词性标注(HMM)、情感分析、拼音转换(Trie树)、关键词和摘要生成(TextRank)。

    我们简单看一个实例:

    print('Tags:', list(s.tags))

    print('Sentiments:', s.sentiments)

    print('Pinyin:', s.pinyin)

    运行结果:

    Tags: [('这个', 'r'), ('把手', 'Ng'), ('该', 'r'), ('换', 'v'), ('了', 'y'), (',', 'w'), ('我', 'r'), ('不', 'd'), ('喜欢', 'v'), ('日本', 'ns'), ('和', 'c'), ('服', 'v'), (',', 'w'), ('别把手', 'ad'), ('放在', 'v'), ('我', 'r'), ('的', 'u'), ('肩膀', 'n'), ('上', 'f'), (',', 'w'), ('工', 'j'), ('信处女', 'j'), ('干事', 'n'), ('每月', 'r'), ('经过', 'p'), ('下属', 'v'), ('科室', 'n'), ('都', 'd'), ('要', 'v'), ('亲口', 'd'), ('交代', 'v'), ('24', 'm'), ('口', 'q'), ('交换机', 'n'), ('等', 'u'), ('技术性', 'n'), ('器件', 'n'), ('的', 'u'), ('安装', 'vn'), ('工作', 'vn')]

    Sentiments: 0.015678817603646866

    Pinyin: ['zhe', 'ge', 'ba', 'shou', 'gai', 'huan', 'liao', ',', 'wo', 'bu', 'xi', 'huan', 'ri', 'ben', 'he', 'fu', ',', 'bie', 'ba', 'shou', 'fang', 'zai', 'wo', 'de', 'jian', 'bang', 'shang', ',', 'gong', 'xin', 'chu', 'nv', 'gan', 'shi', 'mei', 'yue', 'jing', 'guo', 'xia', 'shu', 'ke', 'shi', 'dou', 'yao', 'qin', 'kou', 'jiao', 'dai', '24', 'kou', 'jiao', 'huan', 'ji', 'deng', 'ji', 'shu', 'xing', 'qi', 'jian', 'de', 'an', 'zhuang', 'gong', 'zuo']

    3. THULAC

    THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,GitHub 链接:https://github.com/thunlp/THULAC-Python,具有中文分词和词性标注功能。THULAC具有如下几个特点:

    能力强。利用集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。

    准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。

    速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

    我们用一个实例看一下分词效果:

    import thulac

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    t = thulac.thulac()

    result = t.cut(string)

    print(result)

    运行结果:

    [['这个', 'r'], ['把手', 'n'], ['该', 'v'], ['换', 'v'], ['了', 'u'], [',', 'w'], ['我', 'r'], ['不', 'd'], ['喜欢', 'v'], ['日本', 'ns'], ['和服', 'n'], [',', 'w'], ['别把手', 'n'], ['放', 'v'], ['在', 'p'], ['我', 'r'], ['的', 'u'], ['肩膀', 'n'], ['上', 'f'], [',', 'w'], ['工信处', 'n'], ['女', 'a'], ['干事', 'n'], ['每月', 'r'], ['经过', 'p'], ['下属', 'v'], ['科室', 'n'], ['都', 'd'], ['要', 'v'], ['亲口', 'd'], ['交代', 'v'], ['24', 'm'], ['口', 'q'], ['交换机', 'n'], ['等', 'u'], ['技术性', 'n'], ['器件', 'n'], ['的', 'u'], ['安装', 'v'], ['工作', 'v']]

    4. NLPIR

    NLPIR 分词系统,前身为2000年发布的 ICTCLAS 词法分析系统,GitHub 链接:https://github.com/NLPIR-team/NLPIR,是由北京理工大学张华平博士研发的中文分词系统,经过十余年的不断完善,拥有丰富的功能和强大的性能。NLPIR是一整套对原始文本集进行处理和加工的软件,提供了中间件处理效果的可视化展示,也可以作为小规模数据的处理加工工具。主要功能包括:中文分词,词性标注,命名实体识别,用户词典、新词发现与关键词提取等功能。另外对于分词功能,它有 Python 实现的版本,GitHub 链接:https://github.com/tsroten/pynlpir。

    使用方法如下:

    import pynlpir

    pynlpir.open()

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = pynlpir.segment(string)

    print(result)

    运行结果如下:

    [('这个', 'pronoun'), ('把', 'preposition'), ('手', 'noun'), ('该', 'pronoun'), ('换', 'verb'), ('了', 'modal particle'), (',', 'punctuation mark'), ('我', 'pronoun'), ('不', 'adverb'), ('喜欢', 'verb'), ('日本', 'noun'), ('和', 'conjunction'), ('服', 'verb'), (',', 'punctuation mark'), ('别', 'adverb'), ('把', 'preposition'), ('手', 'noun'), ('放', 'verb'), ('在', 'preposition'), ('我', 'pronoun'), ('的', 'particle'), ('肩膀', 'noun'), ('上', 'noun of locality'), (',', 'punctuation mark'), ('工', 'noun'), ('信', 'noun'), ('处女', 'noun'), ('干事', 'noun'), ('每月', 'pronoun'), ('经过', 'preposition'), ('下属', 'verb'), ('科室', 'noun'), ('都', 'adverb'), ('要', 'verb'), ('亲口', 'adverb'), ('交代', 'verb'), ('24', 'numeral'), ('口', 'classifier'), ('交换机', 'noun'), ('等', 'particle'), ('技术性', 'noun'), ('器件', 'noun'), ('的', 'particle'), ('安装', 'verb'), ('工作', 'verb')]

    这里 把手 和 和服 也被分开了。

    5. NLTK

    NLTK,Natural Language Toolkit,是一个自然语言处理的包工具,各种多种 NLP 处理相关功能,GitHub 链接:https://github.com/nltk/nltk。

    但是 NLTK 对于中文分词是不支持的,示例如下:

    from nltk import word_tokenize

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = word_tokenize(string)

    print(result)

    结果:

    ['这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作']

    如果要用中文分词的话,可以使用 FoolNLTK,它使用 Bi-LSTM 训练而成,包含分词、词性标注、实体识别等功能,同时支持自定义词典,可以训练自己的模型,可以进行批量处理。

    使用方法如下:

    import fool

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = fool.cut(string)

    print(result)

    运行结果:

    [['这个', '把手', '该', '换', '了', ',', '我', '不', '喜欢', '日本', '和服', ',', '别', '把', '手', '放', '在', '我', '的', '肩膀', '上', ',', '工信处', '女', '干事', '每月', '经过', '下属', '科室', '都', '要', '亲', '口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']]

    可以看到这个分词效果还是不错的。

    另外还可以进行词性标注,实体识别:

    result = fool.pos_cut(string)

    print(result)

    _, ners = fool.analysis(string)

    print(ners)

    运行结果:

    [[('这个', 'r'), ('把手', 'n'), ('该', 'r'), ('换', 'v'), ('了', 'y'), (',', 'wd'), ('我', 'r'), ('不', 'd'), ('喜欢', 'vi'), ('日本', 'ns'), ('和服', 'n'), (',', 'wd'), ('别', 'd'), ('把', 'pba'), ('手', 'n'), ('放', 'v'), ('在', 'p'), ('我', 'r'), ('的', 'ude'), ('肩膀', 'n'), ('上', 'f'), (',', 'wd'), ('工信处', 'ns'), ('女', 'b'), ('干事', 'n'), ('每月', 'r'), ('经过', 'p'), ('下属', 'v'), ('科室', 'n'), ('都', 'd'), ('要', 'v'), ('亲', 'a'), ('口', 'n'), ('交代', 'v'), ('24', 'm'), ('口', 'q'), ('交换机', 'n'), ('等', 'udeng'), ('技术性', 'n'), ('器件', 'n'), ('的', 'ude'), ('安装', 'n'), ('工作', 'n')]]

    [[(12, 15, 'location', '日本')]]

    6. LTP

    语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。

    示例代码如下:

    from pyltp import Segmentor

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    segmentor = Segmentor()

    segmentor.load('./cws.model')

    result = list(segmentor.segment(string))

    segmentor.release()

    print(result)

    运行结果:

    41 这个/把手/该/换/了/,/我/不/喜欢/日本/和服/,/别/把/手/放在/我/的/肩膀/上/,/工信/处女/干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    可以发现 工信处、女干事 没有正确分开。

    以上便是一些分词库的基本使用,个人比较推荐的有 jieba、THULAC、FoolNLTK。

    参考来源

    小结

    我在博客中的每篇文章都是我一字一句敲出来的,转载的文章我也注明了出处,表示对原作者的尊重。同时也希望大家都能尊重我的付出。

    最后,也希望大家关注我的个人博客HD Blog

    谢谢~

    展开全文
  • MySQL 中文分词原理

    2021-01-18 23:56:58
    Mysql的索引意义?索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。当然,索引可以加快检索速度,但是它也同时降低了索引列的插入,删除和更新值的速度。换通俗的话来讲:mysql中的索引就是一个...

    一,首先我们来了解一下其他几个知识点:

    1. Mysql的索引意义?

    索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。当然,索引可以加快检索速度,但是它也同时降低了索引列的插入,删除和更新值的速度。

    换通俗的话来讲:mysql中的索引就是一个特殊的平衡二叉树,当在平衡二叉树中搜索某一条值的时候,上亿条的数据可以在十多次内可以塞选出来。

    所以,每个数据表里面有多少个索引就有多少个对应的索引表。

    当然,一个表里面的索引越多写入速度会越慢,但读去速度会越。

    mysql的索引类型:唯一索引。

    常规索引。

    fulltext索引

    spatial索引

    hash索引

    2. 什么fulltext索引?

    fulltext索引也叫做全文本索引,MySQL具备全文搜索的能力,它可以让你在不使用模板匹配操作的情况下进行单词或短语的查找。ps:(个人理解)

    1. mysql的全文本索引是针对与英文文本的索引(毕竟是别人国外人开发的mysql),我们知道在一篇英文文章中可以发现一个特点,每个单词与每个单词都是以空格隔开的。如果我们把每个单词看做一个数据,按照单词的大小来进行前后排列,也可以形成一个二叉树。

    2. 有规律可循,有二叉树,我们就可以对其快速搜索,并可以对应进行封装成索引,也就是我们所说的全文本索引————fulltext索引。

    3. 注意————fulltext索引只能搜索英文。

    二,使用FULLTEXT搜索

    1. 全文搜索的特性(重点)

    全文搜索基于fulltext索引。fulltext索引,只能出现在char varchar text这几种类型的表字段里面。

    全文搜索会忽略那些常见词:常见词,指的是至少一半的行里都出现过,超过50%的词,都为常见词;

    有些为内建的常用单词:也叫停用词,比如:the/after,other

    比较短的单词也会被停用。

    单词的定义:它们是由字母,数字,撇号和下划线,构造而成的字符串。(英文单词完全符合,但是中文不行)

    可以为一个字段(列)创建fulltext索引,也可以为多个字段(列)创建一个fulltext索引。注意:一个索引是一个平衡二叉树。

    1. 如果给a字段建立一个索引,当进行全文本搜索时候,只要命中a字段即可完成搜索。

    2. 如果为a和b两个字段同时建立一个fulltext索引时,它的平衡二叉树里面是包括这两个字段的所有数据。如果此刻,我们只想对a字段进行全文本搜索,这个fulltext是做不到的,只能另外在建立一个a字段的fulltext索引。

    2全文搜索分类

    自然语言搜索(默认类型):mysql会把搜索的字符串解析成一系列的单词,然后去搜索出包含这些单词的那些行;

    布尔模式搜索:可以为搜索的字符串里加修饰词,用于表明某些特定的要求,比如匹配行里必须出现某些单词,而且必须按照规定顺序出现,或者不能存在某些单词等。

    查询扩展搜索:这种搜索分为两个阶段。第一阶段,是自然语言搜素。第二阶段,则先把原来的搜索字符串,与第一阶段的搜索里高度匹配的那些行,连接到一起,在一次进行全文本搜索。

    3 mysql语法:

    建立索引语法:建表

    create table article (title varchar(40),contain text ) engine = myisam;

    建立三个索引

    alter table article

    add fulltext (title),

    add fulltext (contain),

    add fulltext (title, contain);

    4. 自然语言索引

    命中title这个fulltext索引,并搜索包含“hello”这个单词的所有行。select * from article where match(title) against("hello");

    命中title和contain两列的这个fulltext索引,并搜索包含“word”这个单词的所有行。select * from article where match(title, contain) against("word");

    输出match()这个mysql函数的返回值——搜索单词的权重。select title, match(title) against("word") as relevance from article ;

    注意:其实完整的自然语言搜索需要添加IN NATURAL LANGUAGE MODE,如下所示select * from article where match(title) against("hello" IN NATURAL LANGUAGE MODE);

    5. 布尔模式索引

    1. 特点50%一样的规则:不生效了

    查询结果不再按照相关程度排序

    也可以对非fulltext索引列进行搜索,只是速度相比,有fulltext的速度要慢

    2. 使用的方式

    基本方式:要在mathc后面加 in boolean mode,(不加说明,默认使用自然排序 in natural language mode)select * from apothegm where match(phrase) againts('hard' in boolean mode);

    按单词出现顺序检索,把对应单词用双引号引起来;select * from apothegm where match(phrase) againts('“bell book and candle”' in boolean mode);

    可以搜索必须出现,必须不出现,分别用+ 和 -标示:select * from apothegm where match(phrase) againts('+bell -candle' in boolean mode);

    可以用*作为通配符,标示以什么开头(前缀)。但是还是必须遵守,单词不能过短的约定。

    6. 查询扩展全文搜索(略)

    三,中文分词

    1. 中文分词的作用?

    把一段中文,像一篇英文文章一样,一个个的单词(中文文章叫做词语)使用空格隔开,然后用编码工具把每个中文词语编译成英文字符乱码,接着,每个英文乱码之间也用空格间隔,这样就成功的把一篇中文翻译成看不懂的英文文章了,我们就可以使用fulltext索引,在这篇看不懂的英文文章中进行全文本搜素。ps——注意:

    1. 中文分词的主要作用就,把一段中文,切分成一个个的中文词语。

    2. 然后进过unicode编码,把每个单词编码为英文字符乱码。

    3.这个英文乱码单词是符合fulltext索引单词定义的。

    2. 中文分词的介绍中文分词的原理是它有一本自己的字典。一般都有组件,执行某个方法就可以进行中文分词啦。

    展开全文
  • 中文分词综述

    千次阅读 2017-11-26 16:54:30
    中分分词方法综述
  • 由于中文文本是由连续的汉字所组成,因此不能使用类似英文以空格作为分隔符进行分词的方式,中文分词需要考虑语义以及上下文语境。 1 实验部分 基于词典规则的中文分词简单来说就是将中文文本按照顺序切分成连续词序...
  • 细说中文分词

    千次阅读 2020-03-20 08:39:51
    完整的中文自然语言处理过程一般包括以下五种中文处理核心技术:分词、词性标注、命名实体识别、依存句法分析、语义分析。其中,分词中文自然语言处理的基础,搜素引擎、文本挖掘、机器翻译、关键词提取、自动摘要...
  • 目前中文分词技术已经比较成熟,但是应用于医疗卫生专业领域,出现准确率、召回率、F-值均下降等问题。本文在自建2.5万句汉语医疗卫生用语语料库基础上,实验基于词典的自动分词方法、基于统计的自动分词方法、词典...
  • ik中文分词分词原则、原理

    千次阅读 2019-11-06 11:38:43
    1、IK分词器也是基于正向匹配的分词算法。 2、IK分词器,基本可分为两种模式,一种为smart模式,一种为非smart模式 3、非smart模式所做的就是将能够分出来的词全部输出;smart模式下,IK分词器则会根据内在方法输出...
  • 简单理解NLP中文分词

    2020-02-16 04:02:55
    中文分词指将一个汉字序列切分成一个个单独的词。 中文分词的难题 分词规则(粒度)问题:不同应用对粒度的要求不一样,比如“百度搜索”可以是一个词也可以是两个词 消除歧义问题:比如“小吃店关门了” 未登录...
  • 中文分词技术(中文分词原理)

    千次阅读 2017-11-01 17:10:58
    一、 为什么要进行中文分词? 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理...
  • 中文分词方法

    千次阅读 2019-05-23 11:36:57
    title: “中文分词方法的比较” author: p01son6415 词条化 分词又叫做词条化(tokenlize),指的是将原始的字符流转换成一个一个词条(token)的过程。词条化属于自然语言处理中预处理的一个步骤,它是分析语义的...
  • 中文分词

    2020-12-24 15:23:57
    这里有一个Java开源项目cws_evaluation,对中文分词做了评比,但有几点不足:(1). 只有java版本,但是机器学习主要是基于python的 (2).效果指标为行完美率和字完美率,该指标不妥,特别是句子越长,越无意义,(3). ...
  • 简单的中文分词算法

    2020-12-05 22:07:32
    想了解点中文文本处理的底层一些的知识,在网上查了下跟python有关的文本分析书记,意外发现一本新书。书籍简介本书是一本研究汉语自然语言处理方面的基础性、综合性书籍,涉及NLP的语言理论、算法和工程实践的...
  • 人生苦短,我用python 除了给你生孩子,python都能给你做到。...中文分词 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。 ** 在自然语言处理技术...
  • 二元分词中文分词

    2020-09-11 19:33:22
    二元分词中文分词 语言模型 模型:对事物的数学抽象。 语言模型:对语言现象的数学抽象,准确的讲,给定一个句子 w,语言模型就是计算句子的出现概率 p(w) 的模型,而统计的对象就是人工标注而成的语料库。 例如:...
  • NLP-中文分词-预处理

    千次阅读 2019-04-05 19:49:45
    规则分词:机械的分词方法,主要是通过维护词典,每次分割时将词语中每个字符串与词典表中的词逐一比较,确定是否切割(很费时)。按照切分方式,主要有正向最大匹配法,逆向最大匹配法,及双向最大匹配法。 1.正向...
  • 网络资源不断增加,于是搜索引擎应运而生,它的出现为我们在网络上搜集我们所需要的资源提供了很大的方便,但是人们并不满足于早期的搜索引擎的功能和速度,于是搜索引擎开始不断地被更新和完善,而分词对于搜索引擎...
  • 本文的目标有两个:1、学会使用11大Java开源中文分词器2、对比分析11大Java开源中文分词器的分词效果本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景...
  • 使用 CRF 做中文分词

    千次阅读 2019-06-23 12:56:06
    使用 CRF 做中文分词 概要 简述 CRF 问题描述(中文分词任务) 构建特征函数 CRF 学习算法(改进的迭代尺度法) CRF 预测算法(维特比算法) 注:以上实现只针对中文分词任务。 1. 简述 CRF 注,以下内容需要一定...
  • 中文分词搜索功能

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

    2021-04-23 16:09:44
    1、中文分词器IK插件介绍 2、Linux环境安装中文分词器IK插件 3、自定义扩展分词器文件 4、elasticsearch文档映射概述 1、中文分词器IK插件介绍 1.1 分词器简介 在对文档(Document)中的内容进行索引前, 需要对文档...
  • 中文分词的作用与概述

    千次阅读 2012-10-27 15:02:00
    大家好依旧是我上海SEO(SWJ) ,前段时间一直有网友问我 关于分词方面的内容,特别是中文分词再百度中的使用,前端时间SWJ写过2篇关于分词技术的文章 如果你没看过 我推荐你看下。 这2篇分别是:《什么是中文分词...
  • ansj中文分词器详解

    千次阅读 2019-09-06 14:05:28
    ansj中文分词器详解   最近在做一个人工智能的项目,其中用到了分词功能。从网上找了一些java用于分词的工具,最终选择了ansj中文分词器。个人认为效果和功能是比较优秀的。本文将对ansj的所有功能进行详解并提供...
  • NLP|中文分词技术及应用

    万次阅读 多人点赞 2018-05-25 23:15:40
    中文分词指将一个汉字序列切分成一个个单独的词。现有的中文分词算法有五大类:基于词典的方法,基于统计的方法,基于规则的方法,基于字标注的方法,基于人工智能技术(基于理解)的方法。中文分词目前主要有四个...
  • 中文分词_中文分词01

    2020-12-24 13:43:30
    中文分词简介在语言理解中,词是最小的能够独立活动的有意义的语言成分。将词确定下来是理解自然语言的第一步,只有跨越了这一步,中文才能像英文那样过渡到短语划分、概念抽取以及主题分析,以至自然语言理解,最终...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,238
精华内容 5,295
关键字:

中文分词的意义