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理解文本分段,暂时未能找到监督和干预方向,另外分段后的文本数据有部分丢失。其他体验还需要进一步深入才能知道。
以上就是本次学习的内容,如有认知错误,还请批评指正,谢谢。