使用Bert获得句向量,用于下游任务

处理文本分类任务时,除了语义信息可能还可以使用一些其他结构化特征(如语料来源,说话人信息等等)。此时可以使用Bert获取原始语料的句向量,再结合已知的结构化特征,训练适用于下游任务的分类器。

1. 微调Bert预训练模型

见 https://blog.csdn.net/u011340759/article/details/106331620

2. 使用Bert特征抓取接口

extract_features.py 改写自己的样本输入函数

def read_examples(input_file):
  """Read a list of `InputExample`s from an input file."""
  examples = []
  unique_id = 0
  tmp = pd.read_csv(input_file,sep='\t')
  for index, row in tmp.iterrows():
    m = re.match(r"^(.*) \|\|\| (.*)$", row[0])
    if m is None:
        text_a = row[0]
    else:
        text_a = m.group(1)
    examples.append(
          InputExample(unique_id=unique_id, text_a=text_a, text_b=None))
    unique_id += 1
 
  return examples

3. 传入需要的flag参数并获得结果(.jsonl)

#!/bin/bash

export CURRENT_PATH=$(cd "$(dirname "$0")";pwd)
export BERT_BASE_DIR=$CURRENT_PATH/YOUR_MODEL_PATH
export MY_DATASET=$CURRENT_PATH/YOUR_DATA_PATH

python extract_features.py \
	--input_file=$MY_DATASET/test.csv \
	--output_file=$CURRENT_PATH/YOUR_OUTPUT_PATH/test.jsonl \
	--vocab_file=$BERT_BASE_DIR/vocab.txt \
	--bert_config_file=$BERT_BASE_DIR/bert_config.json \
	--init_checkpoint=$BERT_BASE_DIR/model.ckpt \
	--layers=-2 \ # -2表示使用倒数第二层权重(优于使用最后一层-1)
	--max_seq_length=64 \
	--batch_size=8 \
	--do_lower_case=false # 多语言模型时

4. 读取.jsonl并转换为DataFrame

def read_jsonl(path):
    with open(path,'r') as load_f:
        json_list=list(load_f)
    data = []
    for json_str in json_list:
        result = json.loads(json_str)['features'][0]['layers'][0]['values']
        data.append(result)
    return pd.DataFrame(data)

你可能感兴趣的:(机器学习,Bert)