【拥抱AI】向着号称地表最强的NLP预训练模型BERT前进

Google-BERT是什么?

Google-BERT(Bidirectional Encoder Representations from Transformers)是由Google研究团队开发的自然语言处理(NLP)预训练模型,开源的,我们可以自由地使用、修改和分发BERT模型,这促进了学术界和工业界的广泛应用。

Google-BERT的优点

  • 双向理解:BERT能够考虑词语前后的上下文信息,提高了文本理解的准确性。
  • 预训练-微调策略:模型在大规模数据上预训练后,只需少量带标签数据即可达到高性能,降低了数据依赖。
  • 通用性:BERT可广泛应用于多种NLP任务,且易于微调和扩展。
  • 开放源代码:谷歌的研究人员不仅分享了论文,还开源了代码和预训练模型,促进了技术的发展和应用。

Google-BERT的缺点

  • 计算资源要求高:训练BERT模型需要大量的计算资源,尤其是大型模型版本。
  • 微调成本:虽然预训练模型可以在多种任务上进行微调,但这仍然需要一定的计算资源和时间。

Google-BERT的主要功能和技术特点

  • Transformer架构:BERT基于Transformer架构,利用自注意力机制实现了序列的并行处理和双向理解。
  • 预训练任务:包括Masked Language Model(MLM)和Next Sentence Prediction(NSP),这些任务帮助模型学习语言的深层次表示。
  • 微调适应性:BERT可以通过微调在特定任务上实现高性能,如文本分类、问答系统、命名实体识别等。

Google-BERT的应用场景

BERT适用于多种NLP任务,包括但不限于:

  • 文本分类(情感分析、新闻主题分类等)
  • 问答系统(从给定的段落中找出问题的答案)
  • 机器翻译(虽然主要设计用于英语,但可调整用于其他语言)
  • 命名实体识别(识别文本中的人名、地点、组织名称等)
  • 文本生成(创作诗歌、故事等)。

BERT提供了简单的API和预训练模型,使得研究人员和开发者可以相对容易地将其集成到自己的应用中。Google还提供了详细的文档和教程,帮助用户理解如何使用和微调BERT模型。

BERT适用于需要高级文本理解能力的广泛应用领域,尤其是在资源有限的情况下,其预训练模型可以显著减少从头开始训练模型的需求。此外,BERT的多语言版本也扩展了其在不同语言环境中的应用。

实战演练

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

  • 安装比较简单,安装一下transformers库就可以了。

pip install transformers

下面直接上demo代码:

import torch
from transformers import BertTokenizer, BertModel
import re
import os
from scipy.spatial.distance import cosine


def get_sentence_embedding(sentence, model, tokenizer):
    """
    获取句子的嵌入表示
    
    参数:
    sentence(str):输入句子
    model (BertModel): 预训练的BERT模型
    tokenizer (BertTokenizer): BERT分词器
    
    返回:
    numpy.ndarray: 句子的嵌入向量
    """
    # 使用分词器处理输入句子,并转换为模型输入格式
    inputs = tokenizer(sentence, return_tensors="pt", padding=True, truncation=True)
    # 使用模型获取输出,不计算梯度
    with torch.no_grad():
        outputs = model(**inputs)
    # 返回最后一层隐藏状态的平均值作为句子嵌入
    return outputs.last_hidden_state.mean(dim=1).squeeze().numpy()
    
    
def split_text_by_semantic(text, max_length, similarity_threshold=0.5):
    """
    基于语义相似度对文本进行分块
    
    参数:
    text (str) : 输入的长文本
    max_length (int): 每个文本块的最大长度(以BERT分词器的token为单位)
    similarity_threshold (float): 语义相似度阈值,默认为0.5
    
    返回:
    list: 分割 后的文本块列表
    """
    # 加载BERT模型和分词器
    tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
    model = BertModel.from_pretrained('bert-base-chinese')
    model.eval()  # 设置模型为评估模式
    
    # 按句子分割文本 (使用常见的中文标点符号)
    sentences = re.split(r'(。|!|?|;)', text)
    # 重新组合句子和标点
    sentences = [s + p for s, p in zip(sentences[::2], sentences[1::2]) if s]
    
    chunks = []
    current_chunk = sentences[0]
    # 获取当前chunk的嵌入表示
    current_embedding = get_sentence_embedding(current_chunk, model, tokenizer)
    
    for sentence in sentences[1:]:
        # 获取当前句子的嵌入表示
        sentence_embedding = get_sentence_embedding(sentence, model, tokenizer)
        
        # 计算当前chunk和当前句子的余弦相似度
        similarity = 1 - cosine(current_embedding, sentence_embedding)
        
        # 如果相似度高于阈值且合并
        if similarity > similarity_threshold and len(tokenizer.tokenize(current_chunk)):
            current_chunk += sentence
        chunks.append(current_chunk)
    
    return chunks
    

# 读取文件
def read_text_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        return file.read()
        


def save_chunks_to_files(chunks, output_dir):
    """
    将分割后的文本块保存到文件
    
    参数:
    chunks(list): 文本块列表
    output_dir: 输出目录路径
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        
    for i, chunk in enumerate(chunks):
        chunk_file_path = os.path.join(output_dir, f"chunk_{i + 1}.txt")
        with open(chunk_file_path, 'w', encoding='utf-8') as file:
            file.write(chunk)
        print(f"已保存第{i + 1} 个文本块到{chunk_file_path}")
        


# 设置文本输入和输出路径
input_file_path = '1.md'#'./book/1.txt'
output_dir = './saveChunk/'

long_text = read_text_file(input_file_path)

max_length = 2048 # 文本长度限制
similarity_threshold = 0.5 

# 分割长文本
text_chunks = split_text_by_semantic(long_text, max_length, similarity_threshold)

save_chunks_to_files(text_chunks, output_dir)

学习总结

Google-BERT有着出色的文本理解能力,易于微调和扩展,但是资源要求较高。
个人在demo测试过程中发现NLP理解文本分段,暂时未能找到监督和干预方向,另外分段后的文本数据有部分丢失。其他体验还需要进一步深入才能知道。

以上就是本次学习的内容,如有认知错误,还请批评指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值