Bert 得到中文词向量

通过bert中文预训练模型得到中文词向量和句向量,步骤如下:
下载 bert-base-chiese模型
只需下载以下三个文件,然后放到bert-base-chinese命名的文件夹中
在这里插入图片描述
在这里插入图片描述
得到中文词向量的代码如下

import torch
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') # 加载base模型的对应的切词器
model = BertModel.from_pretrained('bert-base-chinese')
print(tokenizer) # 打印出对应的信息,如base模型的字典大小,截断长度等等
token = tokenizer.tokenize("自然语言处理") # 切词
print(token) # 切词结果
indexes = tokenizer.convert_tokens_to_ids(token) # 将词转换为对应字典的id
print(indexes) # 输出id
tokens = tokenizer.convert_ids_to_tokens(indexes)# 将id转换为对应字典的词
print(tokens) # 输出词


# 使用这种方法对句子编码会自动添加[CLS] 和[SEP]
input_ids = torch.tensor(tokenizer.encode("自然语言处理")).unsqueeze(0)
print(input_ids)
outputs = model(input_ids)
# cls_id = tokenizer._convert_token_to_id('[CLS]')
# sep_id = tokenizer._convert_token_to_id('[SEP]')
# print(cls_id, sep_id)
sequence_output = outputs[0]
print(sequence_output)
print(sequence_output.shape)  ## 字向量

输出的结果如下

PreTrainedTokenizer(name_or_path='bert-base-chinese', vocab_size=21128, model_max_len=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'})
['自', '然', '语', '言', '处', '理']
[5632, 4197, 6427, 6241, 1905, 4415]
['自', '然', '语', '言', '处', '理']
tensor([[ 101, 5632, 4197, 6427, 6241, 1905, 4415,  102]])
tensor([[[-0.5707,  0.1999, -0.0637,  ..., -0.0916, -0.3997,  0.1751],
         [ 0.1549,  0.2454,  0.8372,  ..., -0.7411, -0.8433,  0.5498],
         [ 0.1983, -0.5007, -0.6416,  ...,  0.0322, -0.2561,  0.0599],
         ...,
         [ 0.1960,  0.4055,  1.6229,  ...,  0.1070, -0.2448,  0.1766],
         [ 0.0846,  0.9084,  0.5164,  ...,  0.0235,  0.6487, -0.0858],
         [-0.5326, -0.0390,  1.9163,  ...,  0.1597, -0.2909,  0.6810]]],
       grad_fn=<NativeLayerNormBackward0>)
torch.Size([1, 8, 768])

当然还可以通过bert-as-service得到词向量,网上有很多,步骤如下:

  1. 安装肖涵博士的bert-as-service:
    pip install bert-serving-server
    pip install bert-serving-client

  2. 下载训练好的Bert中文词向量:
    https://storage.proxy.ustclug.org/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

  3. 启动bert-as-service:
    找到bert-serving-start.exe所在的文件夹(我直接用的anaconda prompt安装的,bert-serving-start.exe在F:\anaconda\Scripts目录下。)找到训练好的词向量模型并解压,路径如下:G:\python\bert_chinese\chinese_L-12_H-768_A-12
    打开cmd窗口,进入到bert-serving-start.exe所在的文件目录下,然后输入:

bert-serving-start -model_dir G:\python\bert_chinese\chinese_L-12_H-768_A-12 -num_worker=1

#后台启动服务(nohup  .... &)
nohup bert-serving-start -model_dir G:\python\bert_chinese\chinese_L-12_H-768_A-12 -num_worker=1  &

即可启动bert-as-service(num_worker好像是BERT服务的进程数,例num_worker = 2,意味着它可以最高处理来自 2个客户端的并发请求。)
启动后结果如下:
在这里插入图片描述
获取Bert预训练好的中文词向量:

from bert_serving.client import BertClient
 bc = BertClient()
 print(bc.encode([“NONE”,“没有”,“偷东西”]))#获取词的向量表示
 print(bc.encode([“none没有偷东西”]))#获取分词前的句子的向量表示
 print(bc.encode([“none 没有 偷 东西”]))#获取分词后的句子向量表示

结果如下:其中每一个向量均是768维。
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
bert-base-chinese是一个预训练的中文BERT模型,它可以生成中文文本的词向量。 使用bert-base-chinese生成词向量的步骤如下: 1. 安装相应的Python库:tensorflow、keras-bert。 2. 加载预训练好的bert-base-chinese模型。可以使用keras-bert库中的load_trained_model_from_checkpoint函数加载。 3. 使用加载好的模型对文本进行编码,得到文本的词向量。可以使用keras-bert库中的TokenEmbedding函数实现。 4. 对生成的词向量进行进一步处理,如降维、聚类等。 下面是一个使用bert-base-chinese生成词向量的示例代码: ```python import tensorflow as tf from keras_bert import load_trained_model_from_checkpoint, Tokenizer, TokenEmbedding # 加载预训练好的bert-base-chinese模型 config_path = 'bert_config.json' checkpoint_path = 'bert_model.ckpt' model = load_trained_model_from_checkpoint(config_path, checkpoint_path) # 定义tokenizer token_dict = {} with open('vocab.txt', 'r', encoding='utf-8') as reader: for line in reader: token = line.strip() token_dict[token] = len(token_dict) tokenizer = Tokenizer(token_dict) # 对文本进行编码,得到词向量 text = '这是一段中文文本。' tokens = tokenizer.tokenize(text) tokens = ['[CLS]'] + tokens + ['[SEP]'] token_ids = tokenizer.tokens_to_ids(tokens) segment_ids = [0] * len(token_ids) inputs = [token_ids, segment_ids] outputs = TokenEmbedding(name='Token')(model.inputs[:2])(inputs) # 打印词向量 print(outputs) ``` 输出结果为一个形状为(1, 9, 768)的张量,其中768表示词向量的维度。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值