zoukankan      html  css  js  c++  java
  • BERT安装与使用

    环境:

    python 3.5
    tensorflow 1.12.1
    bert-serving-server 1.9.1
    bert-serving-cline 1.9.1

    官网上说要保证Python >= 3.5 with Tensorflow >= 1.10

    1.安装BERT服务端和客户端

    pip install bert-serving-server  # server
    pip install bert-serving-client  # client, independent of `bert-serving-server`
    

    2.下载预训练的中文BERT模型

    根据 NLP 任务的类型和规模不同,Google 提供了多种预训练模型供选择:

    1. BERT-Base, Chinese: 简繁体中文, 12-layer, 768-hidden, 12-heads, 110M parameters【我下载的是这个】
    2. BERT-Base, Multilingual Cased: 多语言(104 种), 12-layer, 768-hidden, 12-heads, 110M parameters
    3. BERT-Base, Uncased: 英文不区分大小写(全部转为小写), 12-layer, 768-hidden, 12-heads, 110M parameters
    4. BERT-Base, Cased: 英文区分大小写, 12-layer, 768-hidden, 12-heads , 110M parameters
    5. 中文效果更好的哈工大版 BERT:Chinese-BERT-wwm

    下载成功后,解压

    3.启动BERT服务端  

    bert-serving-start -model_dir chinese_L-12_H-768_A-12 -num_worker=1

    -model_dir 是预训练模型的路径,-num_worker 是线程数,表示同时可以处理多少个并发请求

    BERT 模型对内存有比较大的要求,如果启动时一直卡在 load graph from model_dir 可以将 num_worker 设置为 1 或者加大机器内存。

    4. 在客户端获取句向量

    from bert_serving.client import BertClient
    bc = BertClient(ip='localhost',check_version=False, check_length=False)
    vec = bc.encode(['努力写大论文中'])
    print(vec) # 维度(1,768)

    vec 是一个 numpy.ndarray ,它的每一行是一个固定长度的句子向量,长度由输入句子的最大长度决定。如果要指定长度,可以在启动服务使用 max_seq_len 参数,过长的句子会被从右端截断。

    在计算中文向量时,可以直接输入整个句子不需要提前分词。因为 Chinese-BERT 中,语料是以字为单位处理的,因此对于中文语料来说输出的是字向量。

    举个例子,当用户输入:

    bc.encode(['你好吗?'])
    

    实际上,BERT 模型的输入是:  

    tokens: [CLS] 你 好 么 ? [SEP]
    input_ids: 101 872 1962 720 8043 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    input_mask: 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    5.获取词向量

    启动服务时将参数 pooling_strategy 设置为 None :

    bert-serving-start -pooling_strategy NONE -model_dir /root/zhihu/bert/chinese_L-12_H-768_A-12/
    

    这时的返回是语料中每个 token 对应 embedding 的矩阵

    bc = BertClient()
    vec = bc.encode(['hey you', 'whats up?'])
    
    vec  # [2, 25, 768]
    vec[0]  # [1, 25, 768], sentence embeddings for `hey you`
    vec[0][0]  # [1, 1, 768], word embedding for `[CLS]`
    vec[0][1]  # [1, 1, 768], word embedding for `hey`
    vec[0][2]  # [1, 1, 768], word embedding for `you`
    vec[0][3]  # [1, 1, 768], word embedding for `[SEP]`
    vec[0][4]  # [1, 1, 768], word embedding for padding symbol
    vec[0][25]  # error, out of index!
    

    参考文献:

    【1】bert-as-service三行代码使用bert模型 - accumulate_zhang的博客 - CSDN博客

    【2】快速使用 BERT 生成词向量:bert-as-service - P01son的博客 - CSDN博客

  • 相关阅读:
    mvc get image 500
    git ssh 配置
    phpstorm及webstorm密钥
    HBuilder常用快捷键
    【wepy实战】wepy搭建完整项目
    【已解决】React中配置Sass引入.scss文件无效
    【微信小程序入门】微信小程序+和风天气完成天气预报
    浅析C#中的Lambda表达式
    C#中的委托(delegate)
    博客园第一天
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/11938504.html
Copyright © 2011-2022 走看看