我正在尝试使用 PCA 对我的数据集进行一些分析,以便我可以使用 kmeans 有效地对其进行聚类。
我的预处理数据被标记化、过滤(停用词、标点符号等)、POS 标记和词形还原
通过将平均词向量乘以它们的 tfidf 分数,我创建了一个包含大约 120 万个推文向量(每个 300 个特征)的数据集,如下所示:
# trained with same corpus as tfidf
# size=300, epochs=5, and min_count=10
tweet_w2v = Word2Vec.load('./models/tweet2vec_lemmatized_trained.model')
tweet_tfidf = TfidfVectorizer()
with open('./corpus/ttokens_doc_lemmatized.txt', 'r') as infile:
tweet_tfidf.fit(infile)
tweet_tfidf_dict = dict(zip(tweet_tfidf.get_feature_names(), list(tweet_tfidf.idf_)))
tfidf_tweet_vectors = []
with open('./corpus/ttokens_doc_lemmatized.txt', 'r') as infile:
for line in infile:
word_vecs = []
words = line.replace('\n', '').split(' ')
if len(words) == 0:
continue
for word in words:
try:
word_vec = tweet_w2v.wv[word]
word_weight = tweet_tfidf_dict[word]
word_vecs.append(word_vec * word_weight)
except KeyError:
continue
if len(word_vecs) != 0:
tweet_vec = np.average(np.array(word_vecs), axis=0)
else:
continue
tfidf_tweet_vectors.append(tweet_vec)
我还尝试了仅使用平均推文向量(无 tfidf)的上述代码,但我的问题最终仍然发生。
我开始认为也许我的数据集不够大,或者我没有正确训练我的 word2vec 模型?我可以使用大约 1 亿条推文,但在过滤掉转推并只获得英语后,大约有 130 万条。
我不确定发生了什么以及下一步应该采取什么步骤。任何解释表示赞赏。
# Load in the data
df = pd.read_csv('./models/tfidf_weighted_tweet_vectors.csv')
df.drop(df.columns[0], axis=1, inplace=True)
# Standardize the data to have a mean of ~0 and a variance of 1
X_std = StandardScaler().fit_transform(df)
# Create a PCA instance: pca
pca = PCA(n_components=20)
principalComponents = pca.fit_transform(X_std)
# Plot the explained variances
features = range(pca.n_components_)
plt.bar(features, pca.explained_variance_ratio_, color='black')
plt.xlabel('PCA features')
plt.ylabel('variance %')
plt.xticks(features)