当前位置: 首页 > news >正文

NLP-中文分词

中文分词

1、中文分词研究背景及意义

  • 和大部分西方语言不同,书面汉语的词语之间没有明显的空格标记,句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词,即将字串转变成词串。 比如“中国建筑业呈现新格局”分词后的词串是 中国/建筑业/呈现/新/格局。
  • 为什么中文分词如此重要呢,是因为它是处理中文的语义分析、文本分类、信息检索、机器翻译、机器问答等问题的基础。如果分词效果不好,很有可能会严重影响到后续的研究。 因为中文存在交集歧义,组合歧义,无法在句子中解决的歧义,具有未登录词等等特征,使得中文分词很难。
歧义类型分词结果 1分词结果 2
交集歧义研究/生命/的/起源研究生/命/的/起源
组合歧义他/从/马/上/下来他/从/马上/下来
无法在句子中解决的歧义南京市/长江大桥南京市长/江大桥
未登录词拜登/和/特朗普/通话拜登/和/特朗/普通话
颗粒选择联想公司联想/公司

2、中文分词主要方法

  • 中文分词根据实现特点大致可分为两个类别:基于词典的分词方法、基于统计的分词方法。

  • __ 基于词典的分词方法 __:基于词典的分词方法首先会建立一个充分大的词典,然后依据一定的策略扫描句子,若句子中的某个子串与词典中的某个词匹配,则分词成功。 常见的扫描策略有:正向最大匹配、逆向最大匹配、双向最大匹配和最少词数分词。

    • 正向最大匹配
      • 对输入的句子从左至右,以贪心的方式切分出当前位置上长度最大的词,组不了词的字单独划开。其分词原理是:词的颗粒度越大,所能表示的含义越精确。
    • 逆向最大匹配
      • 原理与正向最大匹配相同,但顺序不是从首字开始,而是从末字开始,而且它使用的分词词典是逆序词典,其中每个词条都按逆序方式存放。在实际处理时,先将句子进行倒排处理,生成逆序句子,然后根据逆序词典,对逆序句子用正向最大匹配。
    • 双向最大匹配
      • 将正向最大匹配与逆向最大匹配组合起来,对句子使用这两种方式进行扫描切分,如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,按最小集处理。
    • 最少词数分词
      • 即一句话应该分成数量最少的词串,该方法首先会查找词典中最长的词,看是不是所要分词的句子的子串,如果是则切分,然后不断迭代以上步骤,每次都会在剩余的字符串中取最长的词进行分词,最后就可以得到最少的词数。
  • 总结:基于词典的分词方法简单、速度快,效果也还可以,但对歧义和新词的处理不是很好,对词典中未登录的词没法进行处理。

  • __ 基于统计的分词方法 __: 基于统计的分词方法是从大量已经分词的文本中,利用统计学习方法来学习词的切分规律,从而实现对未知文本的切分。随着大规模语料库的建立,基于统计的分词方法不断受到研究和发展,渐渐成为了主流。 常用的统计学习方法有:隐马尔可夫模型 (HMM)、条件随机场 (CRF) 和基于深度学习的方法。

    • HMM 和 CRF
      • 这两种方法实质上是对序列进行标注,将分词问题转化为字的分类问题,每个字有 4 种词位 (类别):词首 (B)、词中 (M)、词尾 (E) 和单字成词 (S),例如:我 (S) 喜 (B) 欢 (E) 计 (B) 算 (M) 机 (E)。由字构词的方法并不依赖于事先编制好的词典,只需对分好词的语料进行训练即可。当模型训练好后,就可对新句子进行预测,预测时会针对每个字生成不同的词位。其中 HMM 属于生成式模型,CRF 属于判别式模型。
    • 基于深度学习的方法
      • 神经网络的序列标注算法在词性标注、命名实体识别等问题上取得了优秀的进展,这些端到端的方法也可以迁移到分词问题上。与所有深度学习的方法一样,该方法需要较大的训练语料才能体现优势,代表为 BiLSTM-CRF。
  • 总结:基于统计的分词方法能很好地处理歧义和新词问题,效果比基于词典的要好,但该方法需要有大量人工标注分好词的语料作为支撑,训练开销大,就分词速度而言不如前一种。在实际应用中一般是将词典与统计学习方法结合起来,既发挥词典分词切分速度快的特点,又利用了统计分词结合上下文识别生词、自动消除歧义的优点。

3、jieba 分词全流程介绍

  • jieba 分词主要通过词典来进行分词及词性标注,两者使用了一个相同的词典。jieba 虽然使用了 HMM 来进行新词发现,但分词的结果优劣很大程度上取决于词典。
  • DAG (有向无环图)
  • 整体工作流程
    • 精确模式与全模式:
    • 搜索引擎模式:
  • HMM
    • HMM 示意图
    • HMM 模型的三个基本假设如下:
      • 有限历史性假设:
        • P(Status[i]|Status[i-1],Status[i-2],… Status[1]) = P(Status[i]|Status[i-1])
      • 齐次性假设 (状态和当前时刻无关):
        • P(Status[i]|Status[i-1]) = P(Status[j]|Status[j-1])
      • 观察值独立性假设 (观察值只取决于当前状态值):
        • P(Observed[i]|Status[i],Status[i-1],…,Status[1]) = P(Observed[i]|Status[i])
    • HMM 联合概率函数
    • HMM 的典型模型是一个五元组:
      • StatusSet: 状态值集合
        • 为 (B, M, E, S): {B:begin, M:middle, E:end, S:single}。分别代表每个状态代表的是该字在词语中的位置,B 代表该字是词语中的起始字,M 代表是词语中的中间字,E 代表是词语中的结束字,S 则代表是单字成词。
        • 示例:给/S 你/S 一个/BE 隐马尔科夫链/BMMMME 的/S 例子/BE 。/S
      • ObservedSet: 观察值集合
        • 为所有汉字 (东南西北你我他…),甚至包括标点符号所组成的集合。
        • 状态值也就是我们要求的值,在 HMM 模型中文分词中,我们的输入是一个句子 (也就是观察值序列),输出是这个句子中每个字的状态值。
      • InitStatus: 初始状态分布
      • TransProbMatrix: 转移概率矩阵
        • 【有限历史性假设】
        • 转移概率是马尔科夫链。Status(i) 只和 Status(i-1) 相关,这个假设能大大简化问题。所以,它其实就是一个 4x4(4 就是状态值集合的大小) 的二维矩阵。矩阵的横坐标和纵坐标顺序是 BEMS x BEMS。(数值是概率求对数后的值)
      • EmitProbMatrix: 发射概率矩阵
        • 【观察值独立性假设】
        • P(Observed[i], Status[j]) = P(Status[j]) * P(Observed[i]|Status[j])
          • 其中,P(Observed[i]|Status[j]) 这个值就是从 EmitProbMatrix 中获取。
    • Viterbi 算法
      • 假设上图为"小王子"的分词示例
      • S、E 代表开始和结束,我们需要找到从 S 到 E 的最大概率路径
      • 中间的矩阵行数等于状态数,列数等于句子长度,矩阵对应位置保存到该节点的最大概率和实现这个概率时上一列节点的状态。
  • 百度 LAC
  • 其它分词器
    • StanfordNLP
    • 哈工大 LTP
    • 复旦 NLP
    • Ansj
    • IK Analyzer

4、分词在搜索中的应用

  • jieba

    • 算法实现

      • 基于前缀词典进行扫描,对句子中汉字所有的可能情况构成有向无环图 (DAG)
      • 基于动归查找最大路径,找出基于词频的最大切分组合
      • 对于未登录词,采用基于字粒度的 HMM + viterbi 进行处理
    • 分词方式

      • 精准匹配
      jieba.lcut('中国科学院计算所')
      Out[13]: ['中国科学院', '计算所']
      
      • 词性标注
      import jieba.posseg as pseg
      Out[17]: [pair('我', 'r'), pair('爱', 'v'), pair('北京', 'ns'), pair('天安门', 'ns')]
      
      • 搜索分词 (粒度较细,该方法适合用于搜索引擎构建倒排索引)
      jieba.lcut_for_search('中国科学院计算所')
      Out[12]: ['中国', '科学', '学院', '科学院', '中国科学院', '计算', '计算所']
      
    • 自定义能力

      • 自定义词典、词性
      # 单词 词频 词性
      创新办   3   i
      
      • 目前我们只增加了词表,对于词频我们并没有设置,可以基于统计的方法来开发自定义的 tf-idf 文件来优化分词效果
      • 对于未登录词 (新词发现), 我们是可以基于自己的语料来训练 HMM 的状态转移矩阵来优化的
    • 其他开源工具 (均三年以上不更新)

      • 百度 LAC、HanLp、清华 THULAC、北大 pkuseg
    • 中文分词未来的展望

      • 被应用于各种词嵌入工具,Word2vec、Glove、ELMO、BERT, 但也逐渐的被代替 (基于字符/单字), 强依赖中文分词的场景也逐渐的减少
  • IK 分词器 (构建索引及搜索)

    • IK 分词器是基于正向匹配的分词算法
    • LetterSegmenter(字母分词器),CN_QuantifierSegment(量词分词器),CJKSegmenter(中日韩分词器)
    • IK 分词器,基本可分为两种模式 (粒度),一种为 smart 模式,一种为 max 模式
      • max 就是把每种可能的分词结果都给出
      • smart 就是需要在这几种分词模式中,寻找一种认为最合理的分词方式
    • IK 分词器的主要逻辑
      • 词典:原理为前缀树的存储方式,实现为数组 + map
      • 词的匹配:对输入的字符逐字的和字典进行匹配
      • 消除歧义:通过词典匹配出来的切分方式会有多种,寻找最合理的一种方式 (词元个数越少越好、路径跨度越大越好、逆向切分概率高于正向切分、词长越平均越好、词元位置权重比较)
    • 遗留的问题
      • smart 分词的结果并不是 max 的子集,官方推荐用 max 建立索引,用 smart 来搜索,但可能会导致两端对不齐的情况
  • 相关性优化
    • 搜索的目的是要理解用户搜索意图,准确衡量 query 与物料之间的相关程度。其中,query 与物料的相关性 (不单单是文本相似度) 计算是最重要的环节 (“全准优新”)
    • 文本误匹配:
      • 分词错误造成的误匹配
      • 召回时,为了更多的物料能被召回,query 可能会被拆成更细的粒度进行检索,但就会带来准召之间的博弈,例如"北京银行"是想寻找与该公司有关的信息,但"北京"和"银行"可能会分别匹配到相关的物料
    • 语义偏移:query 与物料字面匹配,但主要意图在语义上不相关,例如:“字节”-“字节码”, “一点点”-“每天成长一点点”
  • 搜索相关性技术
    • 基于文本匹配的方法:基于 TF-IDF、BM25 等 Term 匹配来计算文本相似度。优点实现简单、速度快,缺点为泛化性较差,无法处理一词多义或者多词一义的问题,很难避免漏匹配和误匹配的情况
    • 基于表示的语义匹配模型:基于表示方法分别学习 query 和 doc 的语义向量表示,再基于两个向量计算相似度,DSSM
    • 基于交互的语义匹配模型:基于交互的方法不直接学习 query 和 doc 的语义表示向量,而是基于基础信号为两者建立交互,最终通过分类计算相关性得分,ESIM

相关文章:

NLP-中文分词

中文分词 1、中文分词研究背景及意义 和大部分西方语言不同,书面汉语的词语之间没有明显的空格标记,句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词,即将字串转变成词串。 比如“中国建筑业呈现新格局”分词后的词串…...

详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式

地下城游戏 题目链接:174. 地下城游戏 状态表示: 按照以往题的表示,dp[i][j]表示:从起点(0,0)位置到达(i,j)位置时,所需的最小初始健康值。但是…...

.NET正则表达式

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。 正则表达式丰富的泛模式匹配表示法使你可以快速分析大量文本,以便: 查找特定字符模式。 验证文本以确保它匹配预定义模式(如电子邮件地址)。 提取、编辑、替换或删除…...

k8s 为什么需要Pod?

Pod,是 Kubernetes 项目中最小的 API 对象,更加专业的说,Pod,是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着,Kubernetes 项目的调度器,是统一按照 Pod 而非容器的资…...

CV(3)--噪声滤波和特征

前言 仅记录学习过程,有问题欢迎讨论 图像噪声(需要主动干扰的场景): 添加高斯噪声:概率密度函数服从高斯分布的一类噪声 通过设置sigma和mean生成符合高斯分布的随机数,然后计算输出像素,放缩…...

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代,音频设备的兼容性和性能成为了用户关注的重点。LDR6500,作为乐得瑞科技精心研发的USB Power Delivery(PD)协议芯片,凭借其卓越的性能和广泛的应用兼容性,为音频设备领域带来了新…...

python web app开发

背景: web app VS 本地GUI开发 web app开发以来一直被人诟病性能,无法访问本地设备,无状态的等缺点而被迫转向本地GUI开发;但本地开发如C++ QT,MFC,WinForm等开发结构又太重,使人望而生畏。web app有个有点就…...

redis数据结构和内部编码及单线程架构

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 : 2. 单线程架构 …...

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...

AI大模型学习笔记|人工智能的发展历程、智能体的发展、机器学习与深度学习的基本理论

学习链接:冒死上传!价值2W的大模型入门到就业教程分享给大家!轻松打造专属大模型助手,—多模态、Agent、LangChain、ViT、NLP_哔哩哔哩_bilibili 百度网盘自己整理的笔记: 通过网盘分享的文件:1-人工智能的…...

C#实现一个HttpClient集成通义千问-多轮对话功能实现

多轮对话功能实现 视频教程实现原理消息的类型 功能开发消息类修改请求体修改发送请求函数修改用户消息输入 多轮对话的token消息完整文档消息类型 视频教程 .NetAI开发入门HttpClient实现通义千问集成-多轮对话功能实现 实现原理 一直保留更新messages 现在设置的meessages只…...

Java Web 7 请求响应(Postman)

前言(SpringBoot程序请求响应流程) 以上一章的程序为例,一个基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。 而我们在开发web程序时呢,定义了一…...

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录:在Android中不能直接打开res aw目录中的数据…...

Linux 系统报打开的文件过多

1.问题 1804012290 [reactor-http-epoll-1] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. - io.nett…...

javaWeb之过滤器(Filter)

目录 前言 过滤器概述 什么是过滤器 过滤器详细 过滤器的生命周期 过滤器的应用 创建一个简单的Filter类步骤 注意:指定拦截路径,我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…...

ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …...

Unexpected token ‘<‘, “<!doctype “... is not valid JSON

Unexpected token ‘<’, "<!doctype "… is not valid JSON 在前端开发时&#xff0c;遇到以下报错内容。 1.报错内容如下&#xff1a; // 报错内容 Uncaught (in promise) SyntaxError: Unexpected token <, "<!doctype "... is not valid…...

24/12/9 算法笔记<强化学习> PPO,DPPO

PPO是目前非常流行的增强学习算法&#xff0c;OpenAI把PPO作为目前baseline算法&#xff0c;首选PPO&#xff0c;可想而知&#xff0c;PPO可能不是最强的&#xff0c;但是是最广泛的。 PPO是基于AC架构&#xff0c;因为AC架构有一个好处&#xff0c;就是解决了连续动作空间的问…...

Linux下编译安装METIS

本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码&#xff0c; …...

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...