• 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博客

  • 相关阅读:
    准备工作
    案例分析
    阅读任务
    准备工作
    案例分析作业
    情 202103226-1 编程作业
    阅读任务
    准备工作
    4 20210412-1 原型设计作业
    3 20210405-1 案例分析作业
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/11938504.html
Copyright © 2020-2023  润新知