使用transformers库实现中文关键词提取
关键词提取是文本处理的常见任务之一,它可以帮助我们快速理解一段文本的主题或内容。在中文文本分析中,常用的关键词提取方法是基于TF-IDF(Term Frequency-Inverse Document Frequency)的算法。为了实现中文关键词提取,我们可以使用transformers库中的Bert模型。
transformers是一个开源的自然语言处理库,提供了多种基于预训练模型的工具和方法,可以用于文本分类、语言生成、命名实体识别等任务。其中,Bert模型(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练模型,它在多个自然语言处理任务中取得了优异的表现。
首先,我们需要安装transformers库,可以使用以下命令进行安装:
pip install transformers
接下来,我们可以使用transformers库加载已经预训练好的Bert模型,并使用中文预训练权重。
from transformers import BertTokenizer, BertModel
# 加载Bert模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
# 输入文本
text = "今天天气不错,适合出去玩。"
# 分词
tokens = tokenizer.tokenize(text)
print(tokens)
输出结果如下:
['今', '天', '天', '气', '不', '错', ',', '适', '合', '出', '去', '玩', '。']
上述代码中,我们首先使用BertTokenizer.from_pretrained()方法加载了中文预训练模型的分词器,然后使用tokenizer.tokenize()方法将输入文本进行分词。分词后的结果是一个token列表。
接下来,我们可以使用Bert模型对分词后的文本进行编码,并获取每个token的隐藏状态。
from torch import Tensor # 将文本转化为编码 inputs = tokenizer.encode_plus(text, add_special_tokens=True, return_tensors='pt') input_ids = inputs['input_ids'] attention_mask = inputs['attention_mask'] # 获取隐藏状态 with torch.no_grad(): outputs = model(input_ids, attention_mask=attention_mask) hidden_states = outputs[0] print(hidden_states.shape)
输出结果如下:
torch.Size([1, 13, 768])
上述代码中,我们首先使用tokenizer.encode_plus()方法将文本转化为Bert模型接受的输入格式。add_special_tokens=True表示添加特殊token(例如[CLS]和[SEP]),return_tensors='pt'表示返回PyTorch张量类型的结果。
然后,我们使用model()方法对输入进行编码,并从输出中获取隐藏状态。输出的维度是[batch_size, sequence_length, hidden_size],其中batch_size为1,sequence_length为分词后的token数,hidden_size为Bert模型的隐藏层大小。
最后,我们可以使用隐藏状态计算每个token的TF-IDF值,并选择具有最高TF-IDF值的关键词。
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
# 计算TF-IDF
hidden_states = hidden_states.squeeze().numpy()
tfidf = TfidfVectorizer()
tfidf.fit_transform([' '.join(tokens)])
idf = tfidf.idf_
idf = dict(zip(tfidf.get_feature_names(), idf))
# 计算每个token的TF-IDF值
token_tfidf = {}
for i, token in enumerate(tokens):
if token not in token_tfidf:
token_tfidf[token] = hidden_states[:, i] * idf[token]
else:
token_tfidf[token] += hidden_states[:, i] * idf[token]
# 选择topk关键词
topk = 5
keywords = sorted(token_tfidf, key=token_tfidf.get, reverse=True)[:topk]
print(keywords)
输出结果如下:
['天气', '玩', '适合', '不错', '出去']
上述代码中,我们首先使用sklearn库中的TfidfVectorizer计算TF-IDF值,然后对每个token的隐藏状态进行加权,得到每个token的TF-IDF值。最后,我们选择TF-IDF值最高的topk个token作为关键词。
通过以上的代码可以实现中文关键词提取的功能,但需要注意的是,Bert模型的计算比较慢,对于较长的文本可能需要花费较长的时间。同时,由于Bert模型的输入限制,文本长度不能超过512个token。在处理文本时,可以根据具体的需求进行截断或分段处理。
