使用Bert得到句向量简单总结

Bert 中文模型下载

https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

Bert 安装

pip install bert-serving-client
pip install bert-serving-server

Bert 使用

  • 服务端启动
    bert-serving-start -model_dir [/tmp/chinese_L-12_H-768_A-12] -max_seq_len 100 -num_worker 4 
    
    • "[ ]"内为自己的模型解压地址,命令中不包含"[ ]"

    • -max_seq_len

      • 表示所处理的一个句子的最大长度,如果原句超过设定值,从设定长度的右侧开始删去。处理长度越长时间越慢,根据处理语料的实际情况设置
      • 默认长度为25
      • 该参数设为NONE后,动态处理序列长度,但该模型中最长序列max_seq_length512,也就是512长度后的文本处理不到,长度小于512的文本根据实际长度处理。长度越短,训练成本越低
    • -num_worker

      • 加载数据的线程数目
      • 默认值为1
    • 运行成功:
      运行成功

  • 客户端
    from bert_serving.client import BertClient
    bc = BertClient()
    bc.encode(['我爱中国','中国加油'])
    
    • 运行结果:
      句向量

    • 得到的词向量的shape为(1,768)

    • 若将多个句向量转化为列表,可用.tolist(),.append(),注意维度变化,转化为list后,会多出一个维度,可用.tolist[0]

    • 处理较多句子时,服务器端可以看到运行进展,如下图"#"后的数值,

      服务器端

    • 或者用下面的代码观察进度(个人用tqdm进度条库总会出错,不稳定)

      for i in range(len(X))#不换行,且从该行开头打印
      	print(f"\r增强进度:{(float(i/len(X))): 8.2%}    {i} / {len(X)}",end=' ') 
      

注意

  • tensorflow安装版本

    • tensorflow2.1.0版本运行结果:
      tensorflow2.1.0版本运行结果
    • 需要安装较低版本的tensorflow
    • tensorflow1.14.0版本安装:
      pip install --index-url https://mirrors.aliyun.com/pypi/simple/ tensorflow==1.14.0
      
    • tensorflow版本查看:
      import tensorflow as tf
      tf.__version__
      

参考链接:https://bert-as-service.readthedocs.io/en/latest/source/server.html


更新:TensorFlow2.0版本也可以运行bert了

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于生成向量使用BERT模型可以非常简单地实现。步骤如下: 1. 首先需要安装BERT相关的Python库,在终端中输入 pip install pytorch-pretrained-bert。 2. 导入相关库和BERT模型,如下所示: from pytorch_pretrained_bert import BertTokenizer, BertModel import torch # Load pre-trained model tokenizer (vocabulary) tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # Load pre-trained model (weights) model = BertModel.from_pretrained('bert-base-uncased') # Put the model in "evaluation" mode, meaning feed-forward operation. model.eval() 3. 定义输入文本,并通过BERT Tokenizer将文本转换成tokens。接着,将tokens转换成BERT的tokens id,并将其用PyTorch张量表示。 text = "Here is some text to encode" tokenized_text = tokenizer.tokenize(text) indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) tokens_tensor = torch.tensor([indexed_tokens]) 4. 将tokens_tensor传递给BERT模型,获取所有层的隐藏状态。最终,将每个token的最后一层的隐藏状态拼接成单个向量作为向量。 with torch.no_grad(): encoded_layers, _ = model(tokens_tensor) # Concatenate the tensors for all layers. We use `stack` here to # create a new dimension in the tensor. token_embeddings = torch.stack(encoded_layers, dim=0) # Remove dimension 1, the "batches". token_embeddings = torch.squeeze(token_embeddings, dim=1) # Swap dimensions 0 and 1. token_embeddings = token_embeddings.permute(1,0,2) # Concatenate the vectors for each token to form a single vector. sentence_embedding = torch.mean(token_embeddings, dim=0) 至于如何使用BERT做文本分类和文本相似度计算,可以使用Fine-tuning方法。具体步骤如下: 1. 准备训练集和测试集。 2. 加载预训练的BERT模型,替换其输出层为对应的任务层。 from pytorch_pretrained_bert import BertForSequenceClassification, BertForNextSentencePrediction model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) 3. 训练模型,可以使用PyTorch自带的优化算法,如Adam。训练完毕后,可以保存模型。 from torch.optim import Adam optimizer = Adam(model.parameters(), lr=1e-5) for epoch in range(num_epochs): for data in training_data: optimizer.zero_grad() text = data['text'] labels = data['labels'] tokens = tokenizer.tokenize(text) indexed_tokens = tokenizer.convert_tokens_to_ids(tokens) tokens_tensor = torch.tensor([indexed_tokens]) scores = model(tokens_tensor, labels) loss = scores[0] loss.backward() optimizer.step() 4. 对于文本相似度计算,可以使用Fine-tuned的BERT模型计算文本向量的余弦相似度。 from scipy.spatial.distance import cosine text1 = 'I like to play football' text2 = 'Football is my favorite sport' tokens1 = tokenizer.tokenize(text1) indexed_tokens1 = tokenizer.convert_tokens_to_ids(tokens1) tokens_tensor1 = torch.tensor([indexed_tokens1]) tokens2 = tokenizer.tokenize(text2) indexed_tokens2 = tokenizer.convert_tokens_to_ids(tokens2) tokens_tensor2 = torch.tensor([indexed_tokens2]) with torch.no_grad(): encoded_layers1, _ = model(tokens_tensor1) encoded_layers2, _ = model(tokens_tensor2) token_embeddings1 = torch.stack(encoded_layers1, dim=0) token_embeddings2 = torch.stack(encoded_layers2, dim=0) token_embeddings1 = torch.squeeze(token_embeddings1, dim=1) token_embeddings2 = torch.squeeze(token_embeddings2, dim=1) token_embeddings1 = token_embeddings1.permute(1,0,2) token_embeddings2 = token_embeddings2.permute(1,0,2) sentence_embedding1 = torch.mean(token_embeddings1, dim=0) sentence_embedding2 = torch.mean(token_embeddings2, dim=0) similarity_score = 1 - cosine(sentence_embedding1, sentence_embedding2)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值