TF-IDF实战用Python从零实现文本关键词提取附完整代码在信息爆炸的时代如何从海量文本中快速提取核心内容成为每个开发者的必备技能。TF-IDF算法作为自然语言处理领域的经典方法以其简单高效的特点在搜索引擎、推荐系统和文本分类等场景中广泛应用。本文将带你从零开始用两种不同的Python实现方式掌握TF-IDF的核心技术要点。1. 环境准备与数据加载1.1 安装必要库工欲善其事必先利其器。我们需要准备以下Python库pip install numpy scikit-learn pandas jupyter建议使用Jupyter Notebook进行交互式开发方便查看中间结果。1.2 构建示例语料库让我们创建一个包含技术文档的小型语料库用于后续分析corpus [ Python是一种解释型高级编程语言, 机器学习算法需要大量数据进行训练, 深度学习是机器学习的一个子领域, 自然语言处理是人工智能的重要方向, TF-IDF算法常用于文本关键词提取 ]2. 基于scikit-learn的快速实现2.1 基础TF-IDF实现sklearn提供了现成的TF-IDF实现只需几行代码from sklearn.feature_extraction.text import TfidfVectorizer vectorizer TfidfVectorizer() tfidf_matrix vectorizer.fit_transform(corpus) feature_names vectorizer.get_feature_names_out() # 查看第一个文档的TF-IDF特征 print(dict(zip(feature_names, tfidf_matrix[0].toarray()[0])))注意默认情况下TfidfVectorizer会自动将文本转换为小写并移除标点符号。2.2 停用词处理优化中文需要特别处理停用词我们可以扩展默认配置custom_stop_words [是, 的, 一个, 种, 需要] vectorizer TfidfVectorizer(stop_wordscustom_stop_words)对于英文可以直接使用内置停用词表vectorizer TfidfVectorizer(stop_wordsenglish)3. 从零实现TF-IDF算法3.1 计算词频(TF)词频反映词语在文档中的重要性def compute_tf(text): tf_dict {} words text.split() word_count len(words) for word in words: tf_dict[word] tf_dict.get(word, 0) 1/word_count return tf_dict3.2 计算逆文档频率(IDF)IDF衡量词语在整个语料库中的稀有程度import math def compute_idf(documents): idf_dict {} total_documents len(documents) # 统计包含每个词的文档数 for doc in documents: words set(doc.split()) for word in words: idf_dict[word] idf_dict.get(word, 0) 1 # 计算IDF值 for word, count in idf_dict.items(): idf_dict[word] math.log(total_documents / float(count)) return idf_dict3.3 组合计算TF-IDF将TF和IDF相乘得到最终权重def compute_tfidf(corpus): # 预处理将所有文档拼接为字符串列表 documents [ .join(doc.split()) for doc in corpus] tfidf [] idf compute_idf(documents) for doc in documents: tf compute_tf(doc) doc_tfidf {} for word, tf_val in tf.items(): doc_tfidf[word] tf_val * idf.get(word, 0) tfidf.append(doc_tfidf) return tfidf4. 工程优化与性能提升4.1 稀疏矩阵处理当处理大规模文本时内存优化至关重要from scipy.sparse import csr_matrix def create_sparse_matrix(tfidf_results, feature_index): row_indices [] col_indices [] data [] for doc_idx, doc in enumerate(tfidf_results): for word, score in doc.items(): if word in feature_index: row_indices.append(doc_idx) col_indices.append(feature_index[word]) data.append(score) return csr_matrix((data, (row_indices, col_indices)))4.2 并行计算加速利用多核CPU加速处理from joblib import Parallel, delayed def parallel_tfidf(corpus, n_jobs4): documents [ .join(doc.split()) for doc in corpus] idf compute_idf(documents) def process_doc(doc): tf compute_tf(doc) return {word: tf_val * idf.get(word, 0) for word, tf_val in tf.items()} return Parallel(n_jobsn_jobs)(delayed(process_doc)(doc) for doc in documents)5. 实际应用案例分析5.1 关键词提取实现基于TF-IDF值提取文档关键词def extract_keywords(tfidf_result, top_n5): keywords [] for doc in tfidf_result: sorted_words sorted(doc.items(), keylambda x: x[1], reverseTrue) keywords.append([word for word, score in sorted_words[:top_n]]) return keywords5.2 相似文档检索利用TF-IDF向量计算文档相似度from sklearn.metrics.pairwise import cosine_similarity def find_similar_documents(query, corpus, vectorizer): query_vec vectorizer.transform([query]) doc_vectors vectorizer.transform(corpus) similarities cosine_similarity(query_vec, doc_vectors) sorted_indices similarities.argsort()[0][::-1] return [(corpus[i], similarities[0,i]) for i in sorted_indices]6. 进阶技巧与问题排查6.1 处理生僻词问题当语料库中出现极低频词时可以设置最小文档频率vectorizer TfidfVectorizer(min_df2) # 忽略只出现在1个文档中的词6.2 权重调整技巧有时需要调整TF和IDF的权重比例# 使用sublinear_tf平滑词频 vectorizer TfidfVectorizer(sublinear_tfTrue) # 使用不同的IDF计算公式 vectorizer TfidfVectorizer(smooth_idfFalse)6.3 常见问题解决方案问题1内存不足方案使用HashingVectorizer替代TfidfVectorizerfrom sklearn.feature_extraction.text import HashingVectorizer hv HashingVectorizer(n_features2**18)问题2处理中文分词方案结合jieba等分词工具import jieba def chinese_tokenizer(text): return list(jieba.cut(text)) vectorizer TfidfVectorizer(tokenizerchinese_tokenizer)
TF-IDF实战:用Python从零实现文本关键词提取(附完整代码)
TF-IDF实战用Python从零实现文本关键词提取附完整代码在信息爆炸的时代如何从海量文本中快速提取核心内容成为每个开发者的必备技能。TF-IDF算法作为自然语言处理领域的经典方法以其简单高效的特点在搜索引擎、推荐系统和文本分类等场景中广泛应用。本文将带你从零开始用两种不同的Python实现方式掌握TF-IDF的核心技术要点。1. 环境准备与数据加载1.1 安装必要库工欲善其事必先利其器。我们需要准备以下Python库pip install numpy scikit-learn pandas jupyter建议使用Jupyter Notebook进行交互式开发方便查看中间结果。1.2 构建示例语料库让我们创建一个包含技术文档的小型语料库用于后续分析corpus [ Python是一种解释型高级编程语言, 机器学习算法需要大量数据进行训练, 深度学习是机器学习的一个子领域, 自然语言处理是人工智能的重要方向, TF-IDF算法常用于文本关键词提取 ]2. 基于scikit-learn的快速实现2.1 基础TF-IDF实现sklearn提供了现成的TF-IDF实现只需几行代码from sklearn.feature_extraction.text import TfidfVectorizer vectorizer TfidfVectorizer() tfidf_matrix vectorizer.fit_transform(corpus) feature_names vectorizer.get_feature_names_out() # 查看第一个文档的TF-IDF特征 print(dict(zip(feature_names, tfidf_matrix[0].toarray()[0])))注意默认情况下TfidfVectorizer会自动将文本转换为小写并移除标点符号。2.2 停用词处理优化中文需要特别处理停用词我们可以扩展默认配置custom_stop_words [是, 的, 一个, 种, 需要] vectorizer TfidfVectorizer(stop_wordscustom_stop_words)对于英文可以直接使用内置停用词表vectorizer TfidfVectorizer(stop_wordsenglish)3. 从零实现TF-IDF算法3.1 计算词频(TF)词频反映词语在文档中的重要性def compute_tf(text): tf_dict {} words text.split() word_count len(words) for word in words: tf_dict[word] tf_dict.get(word, 0) 1/word_count return tf_dict3.2 计算逆文档频率(IDF)IDF衡量词语在整个语料库中的稀有程度import math def compute_idf(documents): idf_dict {} total_documents len(documents) # 统计包含每个词的文档数 for doc in documents: words set(doc.split()) for word in words: idf_dict[word] idf_dict.get(word, 0) 1 # 计算IDF值 for word, count in idf_dict.items(): idf_dict[word] math.log(total_documents / float(count)) return idf_dict3.3 组合计算TF-IDF将TF和IDF相乘得到最终权重def compute_tfidf(corpus): # 预处理将所有文档拼接为字符串列表 documents [ .join(doc.split()) for doc in corpus] tfidf [] idf compute_idf(documents) for doc in documents: tf compute_tf(doc) doc_tfidf {} for word, tf_val in tf.items(): doc_tfidf[word] tf_val * idf.get(word, 0) tfidf.append(doc_tfidf) return tfidf4. 工程优化与性能提升4.1 稀疏矩阵处理当处理大规模文本时内存优化至关重要from scipy.sparse import csr_matrix def create_sparse_matrix(tfidf_results, feature_index): row_indices [] col_indices [] data [] for doc_idx, doc in enumerate(tfidf_results): for word, score in doc.items(): if word in feature_index: row_indices.append(doc_idx) col_indices.append(feature_index[word]) data.append(score) return csr_matrix((data, (row_indices, col_indices)))4.2 并行计算加速利用多核CPU加速处理from joblib import Parallel, delayed def parallel_tfidf(corpus, n_jobs4): documents [ .join(doc.split()) for doc in corpus] idf compute_idf(documents) def process_doc(doc): tf compute_tf(doc) return {word: tf_val * idf.get(word, 0) for word, tf_val in tf.items()} return Parallel(n_jobsn_jobs)(delayed(process_doc)(doc) for doc in documents)5. 实际应用案例分析5.1 关键词提取实现基于TF-IDF值提取文档关键词def extract_keywords(tfidf_result, top_n5): keywords [] for doc in tfidf_result: sorted_words sorted(doc.items(), keylambda x: x[1], reverseTrue) keywords.append([word for word, score in sorted_words[:top_n]]) return keywords5.2 相似文档检索利用TF-IDF向量计算文档相似度from sklearn.metrics.pairwise import cosine_similarity def find_similar_documents(query, corpus, vectorizer): query_vec vectorizer.transform([query]) doc_vectors vectorizer.transform(corpus) similarities cosine_similarity(query_vec, doc_vectors) sorted_indices similarities.argsort()[0][::-1] return [(corpus[i], similarities[0,i]) for i in sorted_indices]6. 进阶技巧与问题排查6.1 处理生僻词问题当语料库中出现极低频词时可以设置最小文档频率vectorizer TfidfVectorizer(min_df2) # 忽略只出现在1个文档中的词6.2 权重调整技巧有时需要调整TF和IDF的权重比例# 使用sublinear_tf平滑词频 vectorizer TfidfVectorizer(sublinear_tfTrue) # 使用不同的IDF计算公式 vectorizer TfidfVectorizer(smooth_idfFalse)6.3 常见问题解决方案问题1内存不足方案使用HashingVectorizer替代TfidfVectorizerfrom sklearn.feature_extraction.text import HashingVectorizer hv HashingVectorizer(n_features2**18)问题2处理中文分词方案结合jieba等分词工具import jieba def chinese_tokenizer(text): return list(jieba.cut(text)) vectorizer TfidfVectorizer(tokenizerchinese_tokenizer)