目标
我试图复制一篇论文(第4.1节)中描述的应用,该应用将稀疏主成分分析应用于文本语料库,输出为K个主成分,每个成分显示出“否则隐藏的结构”。换句话说,每个主成分应该包含一组词,这些词共享一个共同的主题。
我使用了sklearn的MiniBatchSparsePCA包来尝试复制这个应用,但我的输出是一个零矩阵。
数据
我的数据来自一项调查,该调查在Stata中进行了清理。它是一个包含386个答案的向量,这些答案是句子。
我的尝试
# 导入库 #####################################import pandas as pdfrom sklearn.feature_extraction.text import TfidfVectorizerimport numpy as npfrom sklearn import decomposition##################################### 使用sklearn导入Stata数据。 ## 数据来自一项调查,使用Stata进行了清理。####################################data_source = "/Users/****/q19_free_text.dta"raw_data = pd.read_stata(data_source) # 从Stata文件中读取数据。 text_data = raw_data.iloc[:,1] # 清除观察ID号。text_data.shape # Out[268]: (368, ) - 有368个文本(句子)答案。##################################### 词频 - 逆文档词频#################################### vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,stop_words='english')X_train = vectorizer.fit_transform(text_data)spca = decomposition.MiniBatchSparsePCA(n_components=2, alpha=0.5)spca.fit(X_train) #TypeError: 传递了一个稀疏矩阵,但需要密集数据。使用X.toarray()转换为密集的numpy数组。X_train2 = X_train.toarray() # 尝试使用密集数组...spca.fit(X_train2)components = spca.components_print(components) #Out: [[ 0. 0. 0. ..., 0. 0. 0.] # [ 0. 0. 0. ..., 0. 0. 0.]]components.shape #Out: (2, 916)# 空输出!
其他说明
我使用了以下来源编写上述代码:
回答:
(…) 做类似于论文链接中第4.1节所做的事情。他们使用SPCA“总结”文本语料库,输出为K个成分,每个成分是一组词(或特征)。
如果我理解正确的话,你问的是如何检索成分中的词。
你可以通过检索成分中非零条目的索引来做到这一点(在components
上使用适当的numpy
代码)。然后使用vectorizer.vocabulary_
,你可以找出哪些索引(词/标记)在你的成分中出现。
请查看这个笔记本以获取示例实现(我使用了20个新闻组数据集)。