基于TF-IDF提取列表长句元素Top10关键词的代码实现咨询
现有代码问题梳理
- 每次循环单句拟合向量器:TF-IDF的权重是基于全语料的词出现频次计算的,单句拟合无法得到正确的全局词权重,且循环内重复实例化向量器只会保留最后一个句子的拟合结果,完全失效
- 转换函数逻辑错误:
transfom(存在拼写错误,正确拼写为transform)函数内直接调用fit(train_data),train_data属于未传入的外部变量会直接报错,且每次预测都重新拟合会极大浪费算力 - 缺少关键词匹配逻辑:仅返回向量化结果,没有将TF-IDF分值和对应词汇映射、取TopN的逻辑
调整后完整实现
from sklearn.feature_extraction.text import TfidfVectorizer from nltk.tokenize import word_tokenize # 保留你原有自定义停用词/特殊字符清洗逻辑 def remove(text): # 此处补充你原本的清洗规则 return text def fit(train_data): # 全量清洗训练语料 cleaned_lst = [remove(element) for element in train_data] # 全局实例化向量器,基于全语料拟合得到全局词权重 vectorizer = TfidfVectorizer(tokenizer=word_tokenize) vectorizer.fit(cleaned_lst) return vectorizer def get_top_n_keywords(vectorizer, sentence, n=10): # 清洗目标句子后转TF-IDF矩阵 tfidf_matrix = vectorizer.transform([remove(sentence)]) # 获取词汇表和对应分值 feature_names = vectorizer.get_feature_names_out() tfidf_scores = tfidf_matrix.toarray()[0] # 按分值倒序排序,过滤分值为0的非句内词汇,取前n个 word_score_pairs = list(zip(feature_names, tfidf_scores)) sorted_pairs = sorted(word_score_pairs, key=lambda x: x[1], reverse=True) top_n = [pair[0] for pair in sorted_pairs if pair[1] > 0][:n] return top_n
使用示例
# 替换为你自己的语料数据 corpus = [ "人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器", "机器学习是人工智能的一个分支,它让计算机系统无需明确编程就能自动从数据中学习和提升性能", "自然语言处理是人工智能和语言学的交叉领域,研究实现人与计算机之间用自然语言进行有效通信的理论和方法" ] # 1. 基于全量语料拟合向量器 vectorizer = fit(corpus) # 2. 遍历每个句子提取10个关键词 for sent in corpus: keywords = get_top_n_keywords(vectorizer, sent, n=10) print(f"关键词:{keywords}")
补充说明
- 如果不需要全局语料统计、仅基于单句本身的词频提取关键词,无需单独做fit步骤,直接对每个句子单独拟合TF-IDF向量器即可
- 可以给
TfidfVectorizer添加stop_words参数传入内置停用词表,减少无意义停用词被提取为关键词
内容的提问来源于stack exchange,提问作者KIMIA Ghassemzadeh
相关产品推荐
相关产品推荐

