[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
目录
文章目录
1. 背景介绍
1.1 关键词提取
关键词提取是信息检索和文本挖掘中的一项重要技术,它涉及从文本中识别和提取出最能代表文档内容的词语或短语。如下图所示,对于亚马逊上面的商品标题,在构建底层索引时,通常需要对标题做分词,提取里面核心词,用于构建倒排索引或者用于关键词匹配计算等。关键词提取技术可以通过多种方法实现,包括无监督学习和有监督学习的方法。
无监督关键词提取方法
无监督方法不依赖于预先标注的数据,而是通过算法自动发现文本中的关键词。这些方法包括:
- 基于统计特征的方法:如TF-IDF算法,通过词频(TF)和逆文档频率(IDF)来评估词的重要性。
- 基于词图模型的方法:如TextRank算法,构建词与词之间的关系图,并通过网络分析来确定关键词。
- 基于主题模型的方法:如LDA模型,通过主题分布来提取关键词。
- **基于语言模型的方法: 采用基于BERT, GPT这类大语言模型。
有监督关键词提取方法
有监督方法将关键词提取视为一个分类问题,需要预先标注的训练数据来训练模型。这些方法包括:
- 训练分类器:通过机器学习算法,如支持向量机(SVM)或随机森林,来区分关键词和非关键词。
关键词提取实现步骤
传统关键词提取的过程通常包括以下步骤:
- 文本预处理:包括去除停用词、标点符号,进行词干提取或词形还原。
- 特征提取:根据所选算法提取特征,如TF-IDF值。
- 关键词候选生成:根据特征值生成候选关键词列表。
- 评估和排序:评估每个候选词的重要性并进行排序。
- 选择关键词:选择排名最高的词作为最终的关键词。
2. 基于BERT模型的关键词提取
2.1 算法原理
BERT(Bidirectional Encoder Representations from Transformers)是由Google在这篇论文中首次提出的一种预训练深度双向Transformers模型,用于语言理解。
基于BERT模型进行关键词提取的方法主要利用了BERT模型强大的语义理解能力。BERT(Bidirectional Encoder Representations from Transformers)通过在大量文本上进行预训练,学习到了丰富的语言特征,这使得它在处理自然语言时能够考虑到整个文本的上下文信息。
使用BERT进行关键词提取的基本步骤通常包括:
-
文档表示:首先使用BERT模型获取整个文档的嵌入向量,这通常意味着要通过模型获取一个能够代表整个文档的向量表示。
-
候选词/短语生成:然后,从文档中提取候选词或短语,并使用相同的模型为这些候选词/短语生成嵌入向量。
-
相似度计算:通过计算文档向量与候选词/短语向量之间的相似度(常用的是余弦相似度),来评估候选词/短语与文档内容的匹配程度。
-
关键词提取:最后,根据计算出的相似度对候选词/短语进行排序,选择最相似的词/短语作为关键词。
BERT之所以适用于关键词提取,是因为它能够捕获到复杂的语义关系和长距离的依赖,这对于理解文档的主旨和提取关键信息至关重要。BERT的双向训练机制让它能够同时考虑词语的前后文信息,生成的嵌入向量能够很好地表示词语在特定上下文中的含义。
此外,还有一些基于BERT的关键词提取工具和框架,如KeyBERT,它是一个利用BERT嵌入来查找与文档最相似的关键词和关键短语的库。KeyBERT通过简单的余弦相似度度量来实现这一目标,并且易于使用,可以通过pip安装,只需几行代码即可实现关键词提取 。
2.1 工程实践
这类我们展示如何使用PyTorch开发一个基于Bert模型进行商品标题中关键词提取的程序。
首先,我们需要确保系统里面已经安装transformers库,这是由Hugging Face提供的一个非常流行的库,它包含了预训练的BERT模型和其他许多自然语言处理工具。
安装方法如下:
pip instal transformers torch
接着,我们使用Pytorch开发核心代码:
from transformers import BertTokenizer, BertModel
import torch
# 确保你的设备可以运行BERT模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
model.to(device)
def extract_keywords(title, num_keywords=5):
# 对标题进行分词
tokens = tokenizer.tokenize(title)
# 将分词结果转换为BERT模型可以处理的格式
tokens = ['[CLS]'] + tokens + ['[SEP]']
token_ids = tokenizer.convert_tokens_to_ids(tokens)
token_type_ids = [0] * len(token_ids) # 单句子输入,所有token_type_ids为0
attention_mask = [1] * len(token_ids) # 标记每个token是实际的输入
# 将数据发送到设备
token_ids = torch.tensor([token_ids]).to(device)
token_type_ids = torch.tensor([token_type_ids]).to(device)
attention_mask = torch.tensor([attention_mask]).to(device)
# 模型预测
with torch.no_grad():
outputs = model(</