用dw如何做网站,网站开发与客户沟通,公司网站怎么在百度上做推广,我国宣布进入紧急状态了吗目录#xff1a; Q#xff1a;bert分词步骤1#xff1a;构建N * N 的相关性矩阵#xff0c;计算相邻两个字的相关性#xff0c;低的话#xff08;阈值#xff09;就切割。2#xff1a;将A词进行mask计算出A的embedding#xff0c;然后将AB两个词一起mask#xff… 目录 Qbert分词步骤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的平均距离代表切割前后对两个字影响的大小小于阈值则切开。 Qbert分词代码bert4keras1下载BERT模型 及 配置bert_config.json / bert_model.ckpt / vocab.txt2建立分词器 建立模型加载权重3文本编码生成 token_ids, segment_ids4根据文本长度将token_id复制【2 * length - 1】份以为token首位为‘/’5将mask符号位103进行填补注意技巧第一行1个103第二行2个103第三行1个103...按列看基本都是3个103连着。 6输入batch_token_idsbatch_segment_ids进行预测7用欧式距离去计算两个embedding的距离 bert分词缺点1不太适合长文本预测时间太慢了每一个切割都需要预测。2阈值不好把握代码中为8。 基于BERT的无监督分词和句法分析
Qbert分词步骤
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的平均距离代表切割前后对两个字影响的大小小于阈值则切开。 Qbert分词代码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_idsbatch_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_caseTrue) # 建立分词器
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_idsbatch_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):# “大肠杆菌是人和许多”# 比如i2# 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。