如何在Python中对含文本特征的数据集应用PCA降维?
文本特征适配PCA降维的解决方案
一、先将文本特征转为数值特征(必做步骤)
PCA仅支持数值型矩阵,所以必须先把文本特征转换成数值表示,常用方法如下:
1. 词袋模型(Bag of Words)
统计每个文本中词汇的出现频次,生成稀疏数值矩阵:
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd # 示例数据集(假设包含text列和其他数值列) df = pd.DataFrame({ "text": ["我喜欢机器学习", "PCA是常用降维方法", "文本转数值是关键"], "age": [25, 30, 28], "score": [85, 90, 88] }) # 初始化词袋模型并转换文本 vectorizer = CountVectorizer() text_bow = vectorizer.fit_transform(df["text"]).toarray()
2. TF-IDF
基于词频和逆文档权重生成更具区分度的数值特征,抑制高频无意义词汇:
from sklearn.feature_extraction.text import TfidfVectorizer tfidf = TfidfVectorizer() text_tfidf = tfidf.fit_transform(df["text"]).toarray()
3. 词嵌入(Word Embedding)
通过预训练或自定义模型生成带有语义信息的低维向量,比如Word2Vec或BERT句子嵌入:
import jieba import numpy as np from gensim.models import Word2Vec # 先对中文文本分词 df["cut_text"] = df["text"].apply(lambda x: jieba.lcut(x)) # 训练自定义Word2Vec模型 word2vec_model = Word2Vec(df["cut_text"], vector_size=100, window=5, min_count=1) # 计算单条文本的平均词向量作为文本特征 def get_avg_vec(cut_words): valid_vecs = [word2vec_model.wv[word] for word in cut_words if word in word2vec_model.wv] return np.mean(valid_vecs, axis=0) if valid_vecs else np.zeros(100) text_emb = df["cut_text"].apply(get_avg_vec).tolist()
二、合并特征后执行PCA降维
将转换后的文本数值特征与原数据集的其他数值特征拼接,再应用PCA:
from sklearn.decomposition import PCA # 获取原数值特征 num_features = df[["age", "score"]].values # 拼接文本特征与数值特征 combined_features = np.hstack([num_features, text_tfidf]) # 执行PCA降维(示例降到2维) pca = PCA(n_components=2) reduced_features = pca.fit_transform(combined_features)
三、针对文本的"类PCA"替代方案
不存在直接对原始文本字符串应用PCA的方法,但可以用潜在语义分析(LSA)——它本质是对词-文档矩阵做奇异值分解(SVD),效果类似PCA,专门适配文本场景:
from sklearn.decomposition import TruncatedSVD # 基于TF-IDF矩阵执行LSA降维 tfidf_matrix = tfidf.fit_transform(df["text"]) lsa = TruncatedSVD(n_components=2) text_reduced = lsa.fit_transform(tfidf_matrix)
内容的提问来源于stack exchange,提问作者saraafr
相关产品推荐
相关产品推荐

