NLP---Bert分词

news2024/11/29 4:28:34

目录:

  • 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/7476

import 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_id
        batch_token_ids[2 * i - 1, i + 1] = tokenizer._token_mask_id
    batch_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"杆菌"后菌的emb
    d1 = 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"杆菌"后杆的emb
    d2 = dist(vectors[2 * i - 2, i], vectors[2 * i - 1, i])
    # “杆”与“菌”之间平均距离
    d = (d1 + d2) / 2
    if 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.coloradmin.cn/o/1529948.html

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

相关文章

力扣日记3.19-【贪心算法篇】55. 跳跃游戏

力扣日记&#xff1a;【贪心算法篇】55. 跳跃游戏 日期&#xff1a;2024.3.19 参考&#xff1a;代码随想录、力扣 55. 跳跃游戏 题目描述 难度&#xff1a;中等 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃…

此站点的连接不安全,怎么解决?

有部分的网站用户在打开的时候会被提示“此站点的连接不安全”这种现象为什么会出现&#xff0c;大概率是因为没有安装SSL证书或者SSL证书出现了错误&#xff0c;小编在这里面将展开讲解为大家分析其中的原因以及解决方法。 一&#xff1a;遇到该情况的时候该怎么办&#xff1…

Matlab DDPG

文章目录 1 rlSimulinkEnv1.1 说明1.2 例子1.2.1 使用工作空间Agent创建Simulink环境1.2.2 为Simulink模型创建强化学习环境1.2.3 创建Simulink多Agents环境2 创建Simulink环境和训练Agent2.1 创建环境接口2.2 创建DDPG Agent2.3 训练Agent2.4 验证已训练的Agent3 创建Simulink…

【2024.3.19练习】统计子矩阵

题目描述 题目分析 这道题一开始没有思路&#xff0c;使用蛮力枚举的方法时间复杂度为&#xff0c;显然超时。 参考题解后学会了化二维问题为一维问题&#xff0c;先使用的复杂度限制子矩阵的高度&#xff0c;再考虑列&#xff0c;这样就将子矩阵的和问题转变为了连续子序列的…

图论02-并查集的实现(Java)

2.并查集理论基础 并查集的作用 将两个元素添加到一个集合中。 判断两个元素在不在同一个集合并查集的实现 1.DSU 类定义&#xff1a;DSU 类中包含一个整型数组 s 用来存储元素的父节点信息。2.DSU 构造函数&#xff1a; 构造函数 DSU(int size) 接受一个参数 size&#xff0…

万用表革新升级,WT588F02BP-14S语音芯片助力智能测量新体验v

万能表功能&#xff1a; 万能表是一款集多功能于一体的电子测量工具&#xff0c;能够精准测量电压、电流、电阻等参数&#xff0c;广泛应用于电气、电子、通信等领域。其操作简便、测量准确&#xff0c;是工程师们进行电路调试、故障排查的得力助手&#xff0c;为提升工作效率…

Unity 学习笔记 3.向量

下载源码 UnityPackage 1.基础知识 2.求两个对象之间的距离 3.脚本 // 存储目标对象的对象GameObject target;// 存储两者之间的距离float distance;void Start(){// 用Find()找到指定游戏对象target GameObject.Find("Cube");// 使用Vector3.Distance(起始位置&…

使用 Redux 管理 React 应用状态

使用 Redux 管理 React 应用状态 在复杂的 React 应用中&#xff0c;管理组件状态变得越来越复杂&#xff0c;这时候引入 Redux 可以帮助我们更好地管理状态。Redux 是一个可预测状态容器&#xff0c;它可以帮助我们统一管理应用的状态&#xff0c;使得状态变化更加可控。本文…

WEB搭建LNMP环境-Discuz论坛

目录 一、安装PHP并修改配置文件(nginx自行安装) 二、安装MySQL数据库并配置文件 三、 搭建discuz论坛 一、安装PHP并修改配置文件(nginx自行安装) yum install php php-gd php-fpm php-mysqlnd php-xml -y vim /etc/nginx/nginx.conf #配置nginx和PHP交互location …

Spring-Mybatis字段映射

MybatisComfig.xml文件设置 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings> 完成全局配置将数据库下划线映射为驼峰式命名

STM32CubeMX学习笔记24---FreeRTOS(消息队列)

一. 队列简介 队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中 断之间传递消息&#xff0c;队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之 间要交流的数据保存在队列中&#xff0c;叫做队列项目。队列…

SQLiteC/C++接口详细介绍sqlite3_stmt类(一)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类简介 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;二&#xff09; ​ 序言&#xff1a; 本文开始了SQLite的第二个类的详细介绍…

JavaScript实现简单的表单验证

关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

基于python企业办公文件分类系统flask-django-nodejs-php

系统内容可以随时更新&#xff0c;这点对于现代企业通知与文件分享管理来说是很重要&#xff0c;但传统的管理方式都无法做到的。企业办公文件分类系统就可以每天更新&#xff0c;随时反映您企业通知与文件分享的最新情况。 网络的广泛应用给生活带来了十分的便利。所以把企业…

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单&#xff0c;内容区域会自动滚动到对应卡片。内容区域滑动&#xff0c;指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…

Springboot笔记-04

1.PropertySource&ImportResource&Bean PropertySource&#xff1a;加载指定的配置文件&#xff0c;只能用于properties文件&#xff0c;不支持yml文件&#xff1b; 以person为例子: ConfigurationProperties:告诉springboot将本类中所有属性和配制文件相关的配制进行…

【RabbitMQ | 第七篇】RabbitMQ实现JSON、Map格式数据的发送与接收

文章目录 7.RabbitMQ实现JSON、Map格式数据的发送与接收7.1消息发送端7.1.1引入依赖7.1.2yml配置7.1.3RabbitMQConfig配置类——&#xff08;非常重要&#xff09;&#xff08;1&#xff09;创建交换器方法&#xff08;2&#xff09;创建队列方法&#xff08;3&#xff09;绑定…

牛客NC241 计算器(二)【中等 dfs+双端队列 Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a9c170bfaf7349e3acb475d786ab1c7d 核心 DFS双端队列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定…

L1-027 出租(PTA)

文章目录 L1-027 出租题目描述模拟哈希表二分查找 L1-027 出租 题目描述 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&a…

C#,图论与图算法,有向图(Graph)之环(Cycle)判断的颜色算法与源代码

1 检查该图是否包含循环 给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。 方法:深度优先遍历可用于检测图中的循环。连接图的DFS生成树。只有当图中存在后缘时,图中才存在循环。后边是从节点到自身(自循环)或…