NLP---Bert分词

目录:

  • Q:bert分词步骤
    • 1:构建N * N 的相关性矩阵,计算相邻两个字的相关性,低的话(<阈值)就切割。
    • 2:将A词进行mask计算出A的embedding,然后将AB两个词一起mask,计算出A的embedding,算两个embedding的距离。
    • 3:距离“远” 表示临词的影响比较大。
    • 例子:
      • 1:比如['我是中国人]
      • 2:第一次先mask'我',然后mask'我是',计算距离得到“我”的影响D1。
      • 3:然后mask'是',根据mask'我是',计算距离得到“是”的影响D2。
      • 4:根据这三个判断‘是’ 是否需要切开。用D1D2的平均距离代表切割前后对两个字影响的大小,小于阈值则切开。
  • Q:bert分词代码(bert4keras)
    • 1:下载BERT模型 及 配置,bert_config.json / bert_model.ckpt / vocab.txt
    • 2:建立分词器 + 建立模型,加载权重
    • 3:文本编码,生成 token_ids, segment_ids
    • 4:根据文本长度,将token_id复制【2 * length - 1】份,以为token首位为‘/’
    • 5:将mask符号位103进行填补
      • 注意技巧:第一行1个103,第二行2个103,第三行1个103...,按列看,基本都是3个103连着。
    • 6:输入batch_token_ids,batch_segment_ids进行预测
    • 7:用欧式距离去计算两个embedding的距离,
  • bert分词缺点:
    • 1:不太适合长文本,预测时间太慢了,每一个切割都需要预测。
    • 2:阈值不好把握(代码中为8)。

基于BERT的无监督分词和句法分析

Q:bert分词步骤

1:构建N * N 的相关性矩阵,计算相邻两个字的相关性,低的话(<阈值)就切割。

在这里插入图片描述

2:将A词进行mask计算出A的embedding,然后将AB两个词一起mask,计算出A的embedding,算两个embedding的距离。

3:距离“远” 表示临词的影响比较大。

例子:

1:比如['我是中国人]

2:第一次先mask’我’,然后mask’我是’,计算距离得到“我”的影响D1。

3:然后mask’是’,根据mask’我是’,计算距离得到“是”的影响D2。

4:根据这三个判断‘是’ 是否需要切开。用D1D2的平均距离代表切割前后对两个字影响的大小,小于阈值则切开。

在这里插入图片描述
在这里插入图片描述


Q:bert分词代码(bert4keras)

1:下载BERT模型 及 配置,bert_config.json / bert_model.ckpt / vocab.txt

2:建立分词器 + 建立模型,加载权重

3:文本编码,生成 token_ids, segment_ids

4:根据文本长度,将token_id复制【2 * length - 1】份,以为token首位为‘/’

5:将mask符号位103进行填补

注意技巧:第一行1个103,第二行2个103,第三行1个103…,按列看,基本都是3个103连着。

6:输入batch_token_ids,batch_segment_ids进行预测

7:用欧式距离去计算两个embedding的距离,

先将token_ids 复制 (2 * length - 1) 份。

#! -*- coding: utf-8 -*-
# BERT做无监督分词
# 介绍:https://kexue.fm/archives/7476import numpy as np
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
from bert4keras.snippets import uniout# 1:下载BERT模型 及 配置
config_path = '/root/kg/bert/chinese_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/root/kg/bert/chinese_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/root/kg/bert/chinese_L-12_H-768_A-12/vocab.txt'# 2: 建立分词器 + 建立模型,加载权重
tokenizer = Tokenizer(dict_path, do_lower_case=True)  # 建立分词器
model = build_transformer_model(config_path, checkpoint_path)  # 建立模型,加载权重# 3: 文本编码,生成 token_ids, segment_ids
text = u'大肠杆菌是人和许多动物肠道中最主要且数量最多的一种细菌'
token_ids, segment_ids = tokenizer.encode(text)
length = len(token_ids) - 2# 4: 根据文本长度,将token_id复制【2 * length - 1】份,以为token首位为‘/’
batch_token_ids = np.array([token_ids] * (2 * length - 1))
batch_segment_ids = np.zeros_like(batch_token_ids)# 5: 将mask符号位103进行填补
for i in range(length):if i > 0:batch_token_ids[2 * i - 1, i] = tokenizer._token_mask_idbatch_token_ids[2 * i - 1, i + 1] = tokenizer._token_mask_idbatch_token_ids[2 * i, i + 1] = tokenizer._token_mask_id# 6: 输入batch_token_ids,batch_segment_ids进行预测
vectors = model.predict([batch_token_ids, batch_segment_ids])# 7: 用欧式距离去计算两个embedding的距离,
def dist(x, y):"""距离函数(默认用欧氏距离)可以尝试换用内积或者cos距离,结果差不多。"""return np.sqrt(((x - y)**2).sum())threshold = 8
word_token_ids = [[token_ids[1]]]
for i in range(1, length):# “大肠杆菌是人和许多”# 比如i=2# d1 = vectors[4, 3]与vectors[3, 3]的距离,[4,3]是单独mask“菌”字emb,[3, 3]是mask"杆菌"后菌的embd1 = dist(vectors[2 * i, i + 1], vectors[2 * i - 1, i + 1])# d2 = vectors[2, 2]与vectors[3, 2]的距离,[2,2]是单独mask“杆”字emb,[3, 2]是mask"杆菌"后杆的embd2 = dist(vectors[2 * i - 2, i], vectors[2 * i - 1, i])# “杆”与“菌”之间平均距离d = (d1 + d2) / 2if d >= threshold:# 如果距离大,则表明不能分开word_token_ids[-1].append(token_ids[i + 1])else:word_token_ids.append([token_ids[i + 1]])words = [tokenizer.decode(ids) for ids in word_token_ids]
print(words)
# 结果:[u'大肠杆菌', u'是', u'人和', u'许多', u'动物', u'肠道', u'中最', u'主要', u'且数量', u'最多', u'的', u'一种', u'细菌']

在这里插入图片描述
在这里插入图片描述


bert分词缺点:

1:不太适合长文本,预测时间太慢了,每一个切割都需要预测。

2:阈值不好把握(代码中为8)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序的配置文件使用说明:

在上一文中学习开发小程序的起航日记&#xff0c;我们准备好了开发小程序时所需的环境和准备工作&#xff0c;同时也简单的了解了一下小程序的项目结构组成。 这一章&#xff0c;我们主要对小程序的配置文件进行学习。 文章目录 小程序_配置文件1.json2.app.jsonpages 属性wind…

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…

【linux】Debian访问Debian上的共享目录

要在Debian系统上访问共享目录&#xff0c;通常意味着要访问通过网络共享的文件夹&#xff0c;比如通过SMB/CIFS&#xff08;Server Message Block/Common Internet File System&#xff09;协议共享的Windows共享文件夹。以下是访问共享目录的步骤&#xff1a; 1. 安装必要的…

MyBatis记录

目录 什么是MyBatis MyBatis的优点和缺点 #{}和${}的区别 Mybatis是如何进行分页的&#xff0c;分页插件的原理 Mybatis是如何将sql执行结果封装为目标对象并返回的 MyBatis实现一对一有几种方式 Mybatis设计模式 什么是MyBatis &#xff08;1&#xff09;Mybatis是一个…

[Qt学习笔记]QT下获取Halcon图形窗口鼠标事件并执行相应操作

目录 1、背景2、参考信息3、目标4、步骤4.1 Halcon库的配置4.2 读取图像&#xff0c;并实现图像自适应窗体控件大小4.3 主要的图形绘制和贴图操作见如下代码&#xff0c;其中重点为全局函数的创建来实现选择Select、拖拽Drag和尺寸Resize事件响应。 5、总结 1、背景 在视觉项目…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

k8s详细教程

Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点…

4.线性数据结构——3.栈及例题

标准库的栈 定义&#xff1a;stack<typename> myStack;大小&#xff1a;size()压栈&#xff1a;push()弹栈&#xff1a;pop()栈顶&#xff1a;top()判空&#xff1a;empty() #include <cstdio> #include <string> #include <map> #include <algor…

HarmonyOS NEXT应用开发之搜索页一镜到底案例

介绍 本示例介绍使用bindContentCover、transition、animateTo实现一镜到底转场动画&#xff0c;常用于首页搜索框点击进入搜索页场景。 效果图预览 使用说明 点击首页搜索框跳转到搜索页面显式一镜到底转场动画 实现思路 通过点击首页搜索框改变bindContentCover全屏模态…

大数据面试题 —— HBase

目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象&#xff08;数据倾斜&#xff09;是怎么产生的&#xff0c;以及解决办法有哪些HBase rowkey的设计原则HBase 的列…

[Qt学习笔记]QGraphicsView实现背景的绘制和前景图像的绘制

1、介绍 Qt中使用QGraphicsScene重写drawBackGround绘制背景&#xff0c;就是使用自定义的Scene类来重写drawBackGround的函数来重新绘制背景&#xff0c;这里需要注意的是自定义的Scene类要继承QGraphicsScene类&#xff0c;因为drawBackGround是一个虚函数&#xff0c;相当于…

【鸿蒙系统】 ---Harmony 鸿蒙编译构建指导(一)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

服务器端(Debian 12)配置jupyter与R 语言的融合

融合前&#xff1a; 服务器端Debian 12,域名&#xff1a;www.leyuxy.online 1.安装r-base #apt install r-base 2.进入R并安装IRkernel #R >install.packages(“IRkernel”) 3.通过jupyter notebook的Terminal执行&#xff1a; R >IRkernel::installspec() 报错 解决办…

Qt笔记 信号和槽

在Qt中&#xff0c;如何将两个对象进行关联&#xff0c;让一个对象发出信号&#xff0c;然后另外一个对象接收到信号后&#xff0c;执行该对象的一个方法&#xff0c;要实现这种方式&#xff0c;则需要使用到信号和槽机制。 信号&#xff1a; 信号一定是一个没有返回值的函数…

【CSS练习】万年历 html+css+js

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>bod…

Linux之线程同步

目录 一、问题引入 二、实现线程同步的方案——条件变量 1、常用接口&#xff1a; 2、使用示例 一、问题引入 我们再次看看上次讲到的多线程抢票的代码&#xff1a;这次我们让一个线程抢完票之后不去做任何事。 #include <iostream> #include <unistd.h> #inc…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…

【C语言】结构体类型名、变量名以及typedef

文章目录 分类判断结构体成员的使用typedef 分类判断 struct tag {char m;int i; }p;假设定义了上面这一个结构体&#xff0c;tag 就是类型名&#xff0c; p 就是变量名&#xff0c; m 和 i 就是结构体成员列表。 可以这么记&#xff0c;括号前面的是类型名&#xff0c;括号后…

内存条@电脑支持的最大内存@升级内存硬件

文章目录 电脑支持的最大内存规格cpu官网查看支持的规格命令行查看脚本化 DDR内存LPDDR内存内存升级扩展&#x1f47a;插槽检查板载内存SPD内存厂商其他 内存参数&#x1f47a;性能指标使用软件查看更多内存相关的软件工具 电脑支持的最大内存规格 确认电脑最大支持内存大小和频…