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/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)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

1. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 1.题目解析&#xff1a; 2.算法原理 &#xff08;1&#xff09;方法一&#xff1a;暴力列举出所有的子数组的和 时间复杂度&#xff1a;O&#xff08;n**2&#xff09;&#xff1a;枚举所有子数组O&#xff08;…

使用 Redux 管理 React 应用状态

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

机器学习基本算法(一)

1.线性回归算法 Linear Regression 线性回归算法&#xff08;Linear Regression&#xff09;是一种预测性的建模技术&#xff0c;它研究的是因变量&#xff08;目标&#xff09;和自变量&#xff08;预测器&#xff09;之间的关系。线性回归假设目标值与特征之间线性相关&…

MacOS Xcode 使用LLDB调试Qt的 QString

环境&#xff1a; MacOS&#xff1a; 14.3Xcode&#xff1a; Version 15.0Qt&#xff1a;Qt 6.5.3 前言 Xcode 中显示 预览 QString 特别不方便, 而Qt官方的 lldb 脚本debugger/lldbbridge.py一直加载失败&#xff0c;其他第三方的脚本都 不兼容当前的 环境。所以自己研究写…

【how2j练习题】JS部分阶段练习

练习一 <!--练习&#xff0c;做一个简单的加法计算器--><html><input type"text" size "2" id "num1" ><input type"text" size "2" id "num2" ><input type"text" siz…

Density Profile Tool 程序(1D):通过 VMD 可计算 LAMMPS 轨迹的数密度分布(二)

​ 给大家推荐一个结构轨迹后处理程序 Density Profile Tool&#xff0c;目前尝试过的轨迹文件只有LAMMPS文件&#xff0c;感兴趣的大家可以试试其他轨迹文件。这个后处理软件可以计算数密度、质量、电荷和电子分布等性质。 感谢论文的原作者&#xff01; VMD 插件&#xff1…

stm32之GPIO电路介绍

文章目录 1 GPIO介绍2 GPIO的工作模式2.1 浮空输入2.2 上拉输入2.3 下拉输入2.4 模拟输入2.5 开漏输出2.6 推挽输出2.7 复用开漏输出2.8 复用推挽输出2.9 其他 3 应用方式4 常用库函数 1 GPIO介绍 保护二极管&#xff1a;保护引脚&#xff0c;让引脚的电压位于正常的范围施密特…

基于java校园在线打印预约系统设计与实现

摘 要 二十一世纪以来&#xff0c;计算机行业应用技术不断发展&#xff0c;人们的观念也在不断改变。传统打印行业&#xff0c;用户已经意识到传统的打印文件方法等待时间太长。校园在线打印预约系统可以通过网络来打印文件&#xff0c;用户可以在特定的时间预约打印文件&#…

设计模式中的UML基础

设计模式中的UML基础 目录 1、UML概述 2、UML的用途 3、UML的构成 4、UML图 5、UML类图 5.1、类的构成 5.2、类与类之间的关系 6、绘制UML图的软件工具 在讲解设计模式时&#xff0c;会使用到UML建模中的类图去讲解类与类之间的关系&#xff0c;所以这里需要给大家普…

Qt5.9.6+VS2015 部署PCL1.8.1

本文系转载&#xff0c;如侵权请告知删除。原博文链接&#xff1a;https://blog.csdn.net/jepco1/article/details/80752954 0 编译环境 所需软件包及其版本 Qt5.9.6 msvc2015_64 VS2015 VTK 8.0.0 https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0 PCL1.8.1 https://github.c…

综合知识篇12-软件开发方法考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

原生html vue3使用element plus 的树tree上移下移案例源码

上效果 html源码 <!DOCTYPE html> <html lang"en"> <!-- * Name: mallSalesReports.html * Description: * Author Lani * date 2024-02-28 18:32:36 --> <head><meta charset"UTF-8"><meta name"viewport" …

【蓝桥杯选拔赛真题41】C++操作字符串 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C操作字符 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C操作字符 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定两个字符串S1和S2(1<S1长度&…

JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…

界面组件DevExpress WinForms v23.2 - 数据可视化功能升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

Android14 - AMS之Activity启动过程(3)

Android14 - AMS之Activity启动过程&#xff08;1&#xff09;-CSDN博客 Android14 - AMS之Activity启动过程&#xff08;2&#xff09;-CSDN博客 上篇中我们梳理完ActivityStarter的startActivityInner&#xff0c;本篇从这里开始&#xff1a; platform/frameworks/base/servi…

c++类和对象(三)

c类和对象&#xff08;三&#xff09; 再谈构造函数 Static成员 友元 内部 匿名对象 拷贝对象时的一些编译器优化 再次理解封装 1.再谈构造函数 1.1构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。…

YOLOv9有效改进|加入RT-DETR中的AIFI结构。

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 AIFI是RT-DETR中使用的尺度内特征交互模块。 二、AIFI模块详解 2.1 模块简介 AIFI的主要思想&#xff1a; 与Transformer的Encoder类…

【leetcode热题】二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

【2024最新版,redis7】redis底层的10种数据结构

前言&#xff1a;本文redis版本&#xff1a;7.2.4 本文语雀原文地址&#xff08;首发更新&#xff09;&#xff1a;https://www.yuque.com/wzzz/redis/xg2cp37kx1s4726y 本文CSDN转载地址&#xff1a; https://blog.csdn.net/u013625306/article/details/136842107 1. 常见的数…