请选择 进入手机版 | 继续访问电脑版

HTML5星空

Bert文本分类和生成句向量教程

[复制链接]
发表于 2020-6-28 23:40:04 | 显示全部楼层 |阅读模式

Bidirectional Encoder Representations from Transformers,简称Bert。BERT是第一个深度双向无监督的语言表示,语言表达的新方式。该模型的作用是理解语言、处理语言。

  • 代码地址:https://github.com/google-research/bert

  • 论文地址:https://arxiv.org/abs/1810.04805

知识点

  • 使用超多层 Transformer + 双任务预训练 + 后期微调的训练策略

  • 双向性解决了单向只考虑单词之前的词。

  • bert可以生成句向量词向量

  • 预训练(Prior)+ 微调。

  • 极小的数据下带来显著的分类准确率提升

Fine-tuning

通过预训练权重调优,满足我们项目需求。

预训练模型参数

  • BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters

  • BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters

  • BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters

  • BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters (Not available yet. Needs to be re-generated) 目前不可用,需要重新生成

权重下载: https://github.com/google-research/bert/blob/master/multilingual.md

解压zip文件:

  • bert_config.json 配置文件,控制模型的超参数信息。

  • checkpoints 保存着已经训练好的模型参数。

  • vocab.txt 词表文件,包含英文字母、部分单词、部分中、日文字、特殊字符等字样。

预训练模型句子编码

操作步骤:

# 下载 Google 发布的预训练 BERT 中文词向量模型, 并解压。
# 参数:Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
wget https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
unzip chinese_L-12_H-768_A-12.zip
# https://github.com/hanxiao/bert-as-service
# 对句子进行高效编码 使用 bert-as-service
pip install bert-serving-server # server
pip install bert-serving-client # client, independent of `bert-serving-server`
# 开启 BERT 服务。num_worker表示进程数量。
bert-serving-start -model_dir ./chinese_L-12_H-768_A-12 -num_worker=2
# 获得句子编码
from service.client import BertClient
import numpy as np
bc = BertClient(ip="192.168.1.71")
bc.encode(['我吃好了', '我吃饱了'])
# 结果:
>>> array([[ 0.19128613, -0.08250596, -0.43626094, ..., -0.37899604,
-0.11076591, -0.61071366],
[ 0.2512277 , 0.19516063, -0.3480313 , ..., -0.17914174,
0.08901741, -0.91581017]], dtype=float32)
# cos 相似度计算
def cosine(a,b):
return a.dot(b)/(np.linalg.norm(a)*np.linalg.norm(b))
emb=np.array(bc.encode(['我吃好了', '我吃饱了']))
print(['我吃好了', '我吃饱了'],":",cosine(emb[0],emb[1]))
# 结果
>>> ['我吃好了', '我吃饱了'] : 0.96639913

文本分类

  • 教程:https://mp.weixin.qq.com/s/XmeDjHSFI0UsQmKeOgwnyA

  • 代码:

  • https://github.com/NLPScott/bert-Chinese-classification-task

  • https://github.com/Socialbird-AILab/BERT-Classification-Tutorial

数据格式

  • data_dir文件夹下:train.tsv(训练集),dev.tsv(验证集),test.tsv(测试集)

  • 格式:种类\t文本

game	APEX是个新出的吃鸡游戏。
technology Google将要推出tensorflow2.0。

编写DataProcessor类

# 在run_classifier.py中的def main(_):函数中将processors的内容增加为
processors = {
"cola": ColaProcessor,
"mnli": MnliProcessor,
"mrpc": MrpcProcessor,
"xnli": XnliProcessor,
"mytask": MyTaskProcessor,
}
# 实现MyTaskProcessor(DataProcessor)类
class MyTaskProcessor(DataProcessor):
"""Processor for the News data set (GLUE version)."""
def __init__(self):
self.labels = ['game', 'fashion', 'houseliving']

def get_train_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "train.tsv")), "train")
def get_dev_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev")

def get_test_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "test.tsv")), "test")
def get_labels(self):
return self.labels
def _create_examples(self, lines, set_type):
"""Creates examples for the training and dev sets."""
examples = []
for (i, line) in enumerate(lines):
guid = "%s-%s" % (set_type, i)
text_a = tokenization.convert_to_unicode(line[1])
label = tokenization.convert_to_unicode(line[0])
examples.append(
InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
return examples

运行脚本

#!/usr/bin/env bash
export DATA_DIR=./data
export BERT_BASE_DIR=./BERT_BASE_DIR/chinese_L-12_H-768_A-12
python run_classifier.py \
--task_name=mytask \
--do_train=true \ # 是否进行fine tune
--do_eval=true \ # evaluation
--data_dir=$DATA_DIR/ \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--max_seq_length=128 \ # 句子的最长长度
--train_batch_size=32 \
--learning_rate=2e-5 \
--num_train_epochs=3.0 \
--output_dir=./mytask_output
# 运行脚本,进行文本分类
sh run.sh

开源数据集

  • 斯坦福大学,SQuAD,2016,

  • 阅读理解数据集。

  • 536篇文章、107785问题。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多资源及Java+大数据个人原创视频,
可关注本站官方公众号观看:
快讯

     京ICP备14042305号

html5star team © 2012-2013 html5星空 Comsenz Inc.

GMT+8, 2020-7-10 06:52 , Processed in 0.222675 second(s), 36 queries .

快速回复 返回顶部 返回列表