我有以下情形:我必须分析大量文本文档(大约3,000个),并执行一些聚类技术以获取对此的一些了解。要提取特征,我使用的是tf-idf,但是它会产生20,000多个特征,因此很难通过聚类获得良好的效果。因此,我开始使用LSA来减少尺寸并改善结果。这是使用sci-kit Learn的实现的示例代码:

dataset = fetch_20newsgroups(subset='all', categories=categories,
                              shuffle=True, random_state=42)
data = dataset.data
labels = dataset.target

vectorizer =TfidfVectorizer(use_idf=True, stop_words='english', ngram_range=(1,1),
                             min_df=2, max_df=0.5, strip_accents='unicode',
                             smooth_idf=1, sublinear_tf=1)
X = vectorizer.fit_transform(data)

svd = TruncatedSVD(n_components=k)
normalizer = Normalizer(copy=False)
lsa = make_pipeline(svd, normalizer)

X = lsa.fit_transform(X)

# clustering over X


如上所述,我拥有20,000个功能,并且希望减少到一半,但是,如果对n_components使用如此大的值,则lsa.fit_transform(X)会精确返回n_components = n_documents。可以正常工作的唯一值是文档数量以下的值。这是我理论上缺少的东西,还是实现有此限制?据我从LSA技术的理论所知,减少维数的组件数量是无限制且直观的,我认为使用数量更接近特征数量的组件会比使用特征数量少的组件更好。第四,因为它将需要较少的概念归为更高层次的概念。如果我错了,请更正。

最佳答案

我只知道对于主成分分析是肯定的,但是我想它对LSA的工作原理相似,没有人回答这个问题,因此我将尝试。想象一下,您有2个文档和3个要素,从而形成具有两个数据点的3维坐标系。这两个数据点可以用一条直线连接,因此仅需描述一个二维坐标系。

因此,两个主要成分将足以解释数据中的所有差异。如果您具有更高的维度,则拥有的文档数量将决定描述数据所需的维度。

关于python - sklearn截断SVD(LSA)实现的局限性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51264478/

10-09 03:04