从 CountVectorizer 按类别提取 n 个最高频率

Posted

技术标签:

【中文标题】从 CountVectorizer 按类别提取 n 个最高频率【英文标题】:Extracting n-highest frequencies by class from CountVectorizer 【发布时间】:2018-02-22 02:23:21 【问题描述】:

在进行训练/测试拆分后,我使用 sklearn CountVectorizer 在 X_train 上创建了一个 scipy-sparse 矩阵。我有一个两类问题(消极与积极)。

我想弄清楚矩阵中每个类别的前 20 个最高频率和最低频率术语是什么。到目前为止,我已经弄清楚了如何在整个矩阵上做到这一点。

feature_names = np.array(vect.get_feature_names())

sorted_countvect_index = X_train_vectorized.max(0).toarray()[0].argsort()

values = X_train_vectorized.max(0).toarray()[0]

small_idf = pd.Series(values[sorted_tfidf_index[:20]], index=feature_names[sorted_tfidf_index[:20]]).sort_index()

large_idf = pd.Series(values[sorted_tfidf_index[:-21:-1]], index=feature_names[sorted_tfidf_index[:-21:-1]]).sort_index()

想法?

【问题讨论】:

【参考方案1】:

我假设你的类是指你有一些布尔向量y_train,其形状为X_train_vectorized 高度。

您可以通过这个向量的子集来检索适当的正/负示例:

X_train_vectorized_positive = X_train_vectorized[y_train, :]
X_train_vectorized_negative = X_train_vectorized[~y_train, :]

然后运行您在 X_train_vectorized 上运行的其余代码。

更多信息请查看numpy indexing。

【讨论】:

谢谢你,雅库布。它似乎工作。只是为了更好地理解 - 当我按 y_train 和 ~y_train 切片时,两者都返回了相同形状的矩阵,尽管我最初的理解是形状应该不同。我是不是想太多了? 你确定这些向量是布尔值吗?也许它们是标签的向量。如果标签是 X1、X2,那么 y_train_bool = y_train == X1 应该可以解决问题 那么,我认为形状应该不同是正确的吗?向量是 100% 布尔值,基本上是:0 & 1 我又检查了一次 - 不同之处在于对象。对于负 - ',其中 38583 个存储元素采用压缩稀疏行格式>以压缩稀疏行格式存储元素> 好的。问题是我被 pandas.Series 对象切片。将其转换为 numpy 布尔掩码,完成工作。

以上是关于从 CountVectorizer 按类别提取 n 个最高频率的主要内容,如果未能解决你的问题,请参考以下文章

机器学习之路:python 文本特征提取 CountVectorizer, TfidfVectorizer

我可以在 scikit-learn 中使用 CountVectorizer 来计算未用于提取标记的文档的频率吗?

零基础学Python--机器学习:特征提取

如何在 Scikit-learn 的管道中创建我们的自定义特征提取器函数并将其与 countvectorizer 一起使用

Spark CountVectorizer

Spark 机器学习 ---CountVectorizer