使用BERT获取中文词向量

BERT其中的一个重要作用是可以生成词向量,它可以解决word2vec中无法解决的一词多义问题。

然而BERT获取词向量的门槛要比word2vec要高得多。笔者在这里介绍一下如何获取BERT的词向量。

笔者在获取BERT词向量的时候用到了肖涵博士的bert-as-service具体使用方式如下。

  1. 环境要求:python版本>=3.5,tensorflow版本>=1.10(笔者使用的是1.12)
  2. 相关包的安装:pip install  bert-serving-server; pip install bert-serving-client
  3. 下载训练好的BERT中文模型:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
  4. 启动bert-as-service :在cmd窗口进入bert-serving-start.exe所在的文件夹,在该文件路径下输入bert-serving-start  -model_dir E:/chinese_L-12_H-768_A-12 -num_worker=2(训练好的中文模型路径,num_worker的数量可以自行选择),如果成功开启则出现以下界面

  • 17
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 61
    评论
from transformers import BertTokenizer, BertModel import torch from sklearn.metrics.pairwise import cosine_similarity # 加载BERT模型和分器 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') # 种子列表 seed_words = ['个人信息', '隐私', '泄露', '安全'] # 加载微博用户文本语料(假设存储在weibo1.txt文件中) with open('output/weibo1.txt', 'r', encoding='utf-8') as f: corpus = f.readlines() # 预处理文本语料,获取每个中文汇的向量 corpus_vectors = [] for text in corpus: # 使用BERT器将文本分成汇 tokens = tokenizer.tokenize(text) # 将汇转换为对应的id input_ids = tokenizer.convert_tokens_to_ids(tokens) # 将id序列转换为PyTorch张量 input_ids = torch.tensor(input_ids).unsqueeze(0) # 使用BERT模型计算向量 with torch.no_grad(): outputs = model(input_ids) last_hidden_state = outputs[0][:, 1:-1, :] avg_pooling = torch.mean(last_hidden_state, dim=1) corpus_vectors.append(avg_pooling.numpy()) # 计算每个中文汇与种子的余弦相似度 similarity_threshold = 0.8 privacy_words = set() for seed_word in seed_words: # 将种子转换为对应的id seed_word_ids = tokenizer.convert_tokens_to_ids(tokenizer.tokenize(seed_word)) # 将id序列转换为PyTorch张量,并增加batch size维度 seed_word_ids = torch.tensor(seed_word_ids).unsqueeze(0) # 使用BERT模型计算种子向量 with torch.no_grad(): outputs = model(seed_word_ids) last_hidden_state = outputs[0][:, 1:-1, :] avg_pooling = torch.mean(last_hidden_state, dim=1) seed_word_vector = avg_pooling.numpy() # 计算每个中文汇与种子的余弦相似度 for i, vector in enumerate(corpus_vectors): sim = cosine_similarity([seed_word_vector], [vector])[0][0] if sim >= similarity_threshold: privacy_words.add(corpus[i]) print(privacy_words) 上述代码运行后报错了,报错信息:ValueError: Found array with dim 3. check_pairwise_arrays expected <= 2. 怎么修改?
05-31

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值