详细介绍NLP中文分词原理及分词工具

news2024/9/20 14:35:10

基于词表的分词方法

正向最大匹配算法FMM

从左到右扫描文本,得到词的最大匹配。
在这里插入图片描述
案例分析:
用正向最大匹配法对“秦皇岛今天晴空万里”进行中文分词,见下表。
词典 :“秦皇岛”“岛”“今天”“天晴”“晴空万里”“万里”……
根据当前词典,单词扫描的最大长度 max=4在这里插入图片描述

正向最大匹配函数:

def FMM(dict, sentence): # 正向最大匹配算法FMM函数,参数dict: 词典 ,参数sentence: 句子 
    fmmresult = [] 
    max_len = max([len(item) for item in dict])# max_len定义为词典中最长词长度 
    start = 0 
    while start != len(sentence): # FMM 为正向,start 从初始位置开始,指向结尾即为结束 
        index = start + max_len # index 的初始值为 start 的索引 + 词典中元素的最大长度或句子末尾 
        if index > len(sentence): 
           index = len(sentence) 
        for i in range(max_len): 
            # 当分词在字典中时或分到最后一个字时,将其加入到结果列表中 
            if (sentence[start:index] in dict) or (len(sentence[start:index]) == 1): 
                # print(sentence[start:index], end='/')     
                fmmresult.append(sentence[start:index])     
                start = index# 分出一个词,start 设置到 index 处 
                break                                                  
            index += -1# 如果匹配失败,则去掉最后一个字符
    return fmmresult

逆向最大匹配算法RMM

从右到左扫描文本,得到词的最大匹配。
在这里插入图片描述
在中文中,由于偏正结构较多,所以从后向前进行匹配会提高精确度,因此,逆向最大匹配算法比正向最大匹配算法的误差要小。

逆向最大匹配函数:

def RMM(dict, sentence): # 逆向最大匹配算法RMM函数,参数dict: 词典 ,参数sentence: 句子 
    rmmresult = [] 
    max_len = max([len(item) for item in dict])# max_len定义为词典中最长词长度 
    start = len(sentence) 
    while start != 0: # RMM 为逆向,start 从末尾位置开始,指向开头位置即为结束 
        index = start - max_len # 逆向时 index 的初始值为 start 的索引 - 词典中元素的最大长度或句子开头 
        if index < 0: 
           index = 0
        for i in range(max_len): 
            # 当分词在字典中时或分到最后一个字时,将其加入到结果列表中 
            if (sentence[index:start] in dict) or (len(sentence[index:start]) == 1): 
                # print(sentence[index:start], end='/') 
                rmmresult.insert(0, sentence[index:start])   
                start = index# 分出一个词,start 设置到 index 处 
                break                                    
            index += 1 # 如果匹配失败,则去掉最前面一个字符
    return rmmresult

双向最大匹配算法FMM

把正向最大匹配与逆向最大匹配都实施一遍,比较后选择最优结果。
在这里插入图片描述
双向最大匹配函数:

def BM(dict, sentence):# 双向最大匹配(BM),参数dict: 词典 ,参数sentence: 句子 
    res1 = FMM(dict, sentence)     # res1 为 FMM 结果 
    res2 = RMM(dict, sentence)     # res2 为 RMM 结果
    if len(res1) == len(res2):     # 若分词数相同,则分情况讨论
        if res1 == res2:   # 若FMM 与 RMM 的结果相同,则可取任意一个 
            return res1 
        else:  # res1_sn 和 res2_sn 为两个分词结果的单字数量,若二者不同,则返回单字较少的 
            res1_sn = len([i for i in res1 if len(i) == 1])  
            res2_sn = len([i for i in res2 if len(i) == 1]) 
            return res1 if res1_sn < res2_sn else res2 
    else:    # 若分词数不同,则取分出词较少的 
        return res1 if len(res1) < len(res2) else res2

调用函数举例:

dict = [' 今日 ', ' 阳光明媚 ', ' 光明 ', ' 明媚 ', ' 阳光 ', ' 我们 ', ' 在 ', ' 在野 ', ' 生动 ', ' 野生 ', ' 动物园 ', ' 野生动物园 ', ' 物 ', ' 园 ', ' 玩 '] 
sentence = ' 在野生动物园玩 ' 
print("the results of FMM :\n", FMM(dict, sentence), end="\n")     # 调用FMM函数,输出FMM分词结果
print("the results of RMM :\n", RMM(dict, sentence), end="\n")    # 调用RMM函数,输出RMM分词结果
print("the results of BM :\n", BM(dict, sentence))                # 调用BM函数,输出BM分词结果

在这里插入图片描述
缺点: 基于词表的分词算法虽然简单快速,但对于未登录词以及切分歧义的情况无法处理。

基于N-gram的分词方法

N-gram 模型称为 N 元模型,它是一种语言模型,该语言模型是一个基于概率的判别模型,其输入是一句话(词的顺序序列),输出是这句话的概率, 即这句话里所有词的联合概率。 N-gram 模型可应用在文化研究、分词应用、语音识别、输入法、词性标注、垃圾短信分类、机器翻译、语音识别、模糊匹配等领域。

N-gram分词思想

此算法假设每个词的出现只与它之前的 N-1 个词相关,通过大量的语料统计便可以得知句子中每个词的出现概率,继而计算出整个句子的出现概率。如果一个句子的出现概率越大,则越符合自然语言的规律。

通常 N 可以取 1、2、3、4, 其中 N 取 1、2、3 时分别称为 unigram(一元分词)、bigram(二元分词)、trigram(三元分词), 最常用的是 bigram 和 trigram。理论上,N 越大则 N-gram 模型越准确,也越复杂,所需计算量和训练语料数据量也越大。

词出现的概率可以直接从语料中统计 N 个词同时出现的次数得到。对于一个句子W,
假设 W 是由词序列 W1,W2,W3,…… ,Wn 组成的,那么概率可按如下公式计算。
P(W) =P(W1W2W3…Wn) =P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)
当N=2时,当前词只依赖它前面的词(bigram):
P(W) =P(W1W2W3…Wn) =P(W1)P(W2|W1)P(W3|W2)…P(Wn|Wn-1)

N-gram分词步骤:

①建立 N-gram 统计语言模型。
②对句子进行单词划分,找出所有可能的分词情况。
③对分词的划分结果进行概率计算,找出出现可能性最大的分词序列。

案例分析: 基于 N-gram 模型算法对“我喜欢观赏日出”进行中文分词。
在这里插入图片描述
特点: 基于 N-gram 模型的分词算法是在原有中文算法基础上进行了改进,设计并且实现了新的中文分词系统,既实现了文本的快速分词,又提高了中文分词的准确性,但其计算开销比较大,并且仍然存在未登录词难以处理的问题。

基于序列标注的分词方法

基于隐马尔可夫模型的分词方法

隐马尔可夫模型(Hidden Markov Model,HMM)是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测(或称为隐状态)的状态随机序列,再由各个状态生成一个观测从而产生观测随机序列的过程。

隐藏的马尔可夫链随机生成的状态的序列, 称为状态序列 ;每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列。 序列的每一个位置可以看作是一个时刻。基于序列标注的分词算法除了有基于隐马尔可夫模型,还有基于 CRF、基于 LSTM 等多种分词算法。

隐马尔可夫模型常应用于序列标注的问题。它用于标注时,状态对应着标记,标注问题是给定观测序列预测其对应的标记序列。
在这里插入图片描述
隐马尔可夫模型有两个基本假设 :马尔可夫假设和观测独立性假设。
(1)马尔可夫假设 :即假设隐藏的马尔可夫链在任意时刻 t 的状态只依赖于其前一时刻的状态,与其他时刻的状态及观测无关,也与时刻 t 无关。
在这里插入图片描述
(2)观测独立性假设 :即假设任意时刻的观测只依赖于该时刻的马尔可夫链的状态, 与其他观测及状态无关。
在这里插入图片描述
基于隐马尔可夫模型进行中文分词的基本原理: HMM 模型把分词问题转化为序列标注问题, 也就是给定一个句子作为输入,以“BEMS”组成的序列串作为输出,然后再进行分词,从而得到输入句子的划分。其中:
• B(Begin)代表词的起始位置,
• M(Middle) 代表词的中间位置,
• E(End)表示词的结束位置,
• S(Single)代表单字成词。
设观测状态集合(输入句子序列)为O={o1, o2, ⋯, on},隐藏状态集合(“BMES”序列)I={i1, i2, ⋯, in},中文分词就是对给定的观测序列,求解对应的最有可能的隐藏状态序列,即求解最大条件概率maxP(i1, ⋯, in | o1,⋯, on),利用贝叶斯公式可得:
在这里插入图片描述
案例分析: 其中观测序列也就是可见序列,状态序列也就是隐含序列。在这里插入图片描述

基于条件随机场(CRF)的分词算法

基于条件随机场(Conditional Random Field,CRF)的分词算法是一种判别式的无向图模型,它试图对多个变量在给定观测值后的条件概率进行建模,常用于序列标注问题。 在 CRF 的假设中,每个状态不仅仅与它前面的状态有关,还与它后面的状态有关。与隐马尔可夫模型相比,CRF考虑的影响范围更大,顾及更多数量的特征函数以及相应权重。 因此该算法的精度也更高,当然计算代价也偏高。

基于循环神经网络模型的分词算法

深度学习中的循环神经网络也适用于序列标注问题,可以采用 CNN、LSTM 等深度学习模型,结合 CRF 等分类算法,从而实现中文分词。

分词工具

常见的中文分词工具:
HanLP 分词器、Jieba(结巴)分词、哈工大的语言技术平台 LTP 及其语言云 LTP-Cloud、清华大学的中文词法分析工具包 THULAC、北京大学的中文分词工具包 pkuseg、斯坦福分词器、 基于深度学习的分词系统 KCWS、新加坡科技设计大学的中文分词器 ZPar、IKAnalyzer、 Jcseg、复旦大学的 FudanNLP、中文文本处理库SnowNLP、ansj 分词器、自然语言处理工 具包 NLTK、玻森中文语义开放平台 BosonNLP、简易中文分词系统 SCWS、IKAnalyzer、 庖丁解牛、中科院计算所 NLPIR 分词系统、腾讯文智、百度 NLP、阿里云 NLP、新浪云、 搜狗分词、盘古分词等等。

Jieba 分词

Jieba 分词是一个 Python 中文分词组件。
功能:可以对中文文本进行分词、词性标注、关键词抽取等,并且支持自定义词典。
原理:算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图,再采用动态规划查找最大概率路径,从而找出基于词频的最大切分组合。对于未登录词,它采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法。
特点:在词典文件添加自定义词典速度快,适用于词典数量大于五千万。但是其自定义词典时,带空格的词并不支持。

安装:
全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
通过pycharm安装

模式:
在这里插入图片描述
基本应用:
在这里插入图片描述
案例分析:
对“燕山大学源于哈尔滨工业大学,始建于 1920 年”这句中文文本,使用 Jieba 分词工具进行分词。

import jieba
# 全模式 
seg_list = jieba.cut(" 燕山大学源于哈尔滨工业大学,始建于 1920 年 ",cut_all=True) 
print(" 全模式 :", "/ ".join(seg_list))
# 精确模式 
seg_list = jieba.cut(" 燕山大学源于哈尔滨工业大学,始建于 1920 年 ",cut_all=False) 
print(" 精确模式 :", "/ ".join(seg_list)) 
# 默认是精确模式 
seg_list = jieba.cut(" 燕山大学源于哈尔滨工业大学,始建于 1920 年 ") 
print(" 默认模式 :",", ".join(seg_list))
# 搜索引擎模式 
seg_list = jieba.cut_for_search(" 燕山大学源于哈尔滨工业大学,始建于 1920 年 ") 
print(" 搜素引擎模式 :",", ".join(seg_list))

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据在外设中的存储》

【一】磁盘的物理结构 我们现在很少看到磁盘了&#xff0c;我们电脑使用的大部分使用的是nvme协议的固态硬盘&#xff0c;差一点的使用的是sata固态接口的硬盘了&#xff0c;磁盘在我们电脑上尤其是笔记本电脑上是很少存在的&#xff0c;难道磁盘真的穷途末路了吗&#xff1f;显…

confluence 6.7.1-x64.bin安装

confluence数据库的配置文件&#xff1a;# cat /var/atlassian/application-data/confluence/confluence.cfg.xml 1&#xff1a; 安装包 jdk 2&#xff1a; 执行./atlassian-confluence-6.7.1-x64.bin 设置安装目录和数据目录 启动 service confluence start 3&#xff…

[附源码]计算机毕业设计社区住户信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

连阿里P8都赞不绝口的“分布式架构原理设计笔记”到底有多牛

在分布式系统中&#xff0c;一次业务处理可能需要多个应用来实现&#xff0c;比如用户发送一次下单请求&#xff0c;就涉及到订单系统创建订单&#xff0c;库存系统减库存&#xff0c;而对于一次下单&#xff0c;订单创建与减库存应该是要同时成功或者同时失效&#xff0c;但在…

matlab中的隐马尔可夫模型(HMM)实现

隐马尔可夫模型&#xff08;HMM&#xff09;简介 隐马尔可夫模型&#xff08;HMM&#xff09;是一个在你观察到的输出顺序&#xff0c;但不知道状态序列模型产生输出的过程。 去年&#xff0c;我们为一家公司进行了短暂的咨询工作&#xff0c;该公司正在构建一个主要基于隐马…

借助PyCharm在代码中自动添加作者、日期

名人说&#xff1a;闻道有先后&#xff0c;术业有专攻。——韩愈 Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了本篇博客&#xff0c;跟着步骤一起去设置吧&#xff01; Pycharm安装教程请点这里 目录一、背景缘由二、设置方法三、补充一、背景缘由 在用…

左神:中级提升班5

1.斐波那切数列套路 1.1F(N)F(N-1)F(N-2) 1.2F(N)3F(N-1)-4F(N-3)6F(N-5) 1.3生牛问题 1.4达标串数量 1.5取最少的木棍 2.背包问题 3.找工作 4.判断是否符合人类正常书写 1.斐波那切数列套路 1.1F(N)F(N-1)F(N-2) 线性代数&#xff1a; 1. 利用初始项可以吧a,b,c,d算出来 2…

【面试题】https协议

1. http和https的区别 http是明文传输&#xff0c;敏感信息容易被中间劫持。https在http协议的基础上&#xff0c;增加了加密的特性&#xff0c;数据被劫持了也无法解密。现代浏览器已经开始强制使用https协议。 2. https的加密方式 2.1 对称加密 对称加密&#xff1a;使用…

[激光原理与应用-38]:《光电检测技术-5》- 光学测量基础 - 光调制

目录 一、光调制概述 1.1 什么是光调制 1.2 激光的光调制方法 1.3 光调制的调制 二、直接调制法 三、腔内调制法 3.1 被动调制&#xff1a; 3.2 主动调制&#xff1a; 四、腔外调制法 五、新型光调制 5.1 基于强度调制 5.2 基于相位调制 5.3 基于偏振调制 一、光调…

【前端】面试题6~10

目录 一、说一说BFC 1、BFC的概念 2、BFC布局规则 3、BFC形成的条件 3、BFC解决能的问题 4、BFC的其他 5、总结 二、说一说Vuex是什么&#xff0c;每个属性是干嘛的&#xff0c;如何使用 &#xff1f; 1、Vuex是什么 2、Vuex 的属性 3、使用方法 4、简单总结 三、说…

Jsp基础了解(二)

文章目录Jsp基础了解&#xff08;一&#xff09;7&#xff0c;MVC模式和三层架构7.1 MVC模式7.2 三层架构7.3 MVC 和 三层架构8&#xff0c;案例8.1 环境准备8.1.1 创建工程8.1.2 创建包8.1.3 创建表8.1.4 创建实体类8.1.5 准备mybatis环境8.2 查询所有8.2.1 编写BrandMapper8.…

无模型深度强化学习算法

无模型深度强化学习算法&#xff1a;直接训练类神经网络模型来表示策略。这里的“无模型”指的是不建立环境模型&#xff0c;而非不建立任何机器学习模型。这样的策略模型可以直接用策略梯度&#xff08;policy gradient&#xff09;[3]训练&#xff0c;但是策略梯度的变异性太…

使用extundelete恢复文件-尚文网络xUP楠哥

~~全文共1462字&#xff0c;阅读需约5分钟。 进Q群11372462&#xff0c;领取专属报名福利&#xff0c;包含云计算学习路线图代表性实战训练大厂云计算面试题资料! 假如遇到一些恶意者试图入侵服务器或者遇到Linux系统架构师不小心误删文件或目录&#xff0c;可以通过extundele…

DFS 、BFS、回溯

1、dfs(res,当前结构&#xff0c;当前候选热数据&#xff0c;当前目标值&#xff0c;当前搜索的层级&#xff09; 2、BFS&#xff08;Breadth first search&#xff09; 对于树来说&#xff0c;BFS就是层次遍历 而图的BFS 与树的BFS 不同点在于&#xff0c;树有根节点&#xf…

GPIO口,232串口,USB接口,485接口等接口保护电路

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言一、GPIO口1、输入端2、输出端二、USB口三、232口前言 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定时更…

Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查

写在前面 分享一些 AWX 启用facts缓存和模板问卷调查的笔记博文内容涉及&#xff1a; 启动facts缓存相关配置Demo启用模板调查来设置变量demo 食用方式&#xff1a; 需要了解 Ansible理解不足小伙伴帮忙指正 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&a…

基础入门 - Spring Boot HelloWorld 第二节

简化配置 Spring Boot 把所有的配置都固定编写在 application.properties 里&#xff0c;文件名是固定写法&#xff0c;不能改 我们如果想更改配置&#xff0c;几乎所有的配置都在这里面更改就可以&#xff0c;而且&#xff0c;就算你不更改&#xff0c;不编写配置&#xff0c;…

计算机毕业设计java基于springboot医院急诊挂号系统

项目介绍 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue 人难免会有生病的时候&#xff0c;尤其是当一些突发情况下&#xff0c;一旦发生一些疾病很可能会危及生命。这时候如果按照常规的方式进行挂号是很浪费时间…

SwiftUI 中的水平条形图

水平条形图以矩形条的形式呈现数据类别,其宽度与它们所代表的数值成正比。本文展示了如何在垂直条形图的基础上创建一个水平柱状图。 水平条形图不是简单的垂直条形图的旋转。在 Numbers 等应用程序中,水平条形图被定义为独立的图表类型,而不是垂直条形图。除了条形差异外…

Jsp基础了解(一)

文章目录JSP1&#xff0c;JSP 概述2&#xff0c;JSP 快速入门2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3&#xff0c;JSP 原理4&#xff0c;JSP 脚本4.1 JSP 脚本分类4.2 案例4.2.1 需求4.2.2 实现4.2.3 成品代码4.2.4 测试4.3 JSP 缺点5&#xff0…