在 scikit learn 中设置字数上限
Imposing a cap on word count in scikit learn
我正在分析歌词,其中重复不一定意味着更高的重要性,所以我想限制每个文档的字数 。例如,如果一个单词在一首歌中出现 n
次,其中 n > threshold
,那么我会将 n
替换为 threshold
.
我检查了CountVectorizer docs,有min_df
和max_df
的选项,但这些只能忽略出现在某些中的单词文档,而不是在 单个 文档中出现 n 次 的单词。
我正在考虑更改稀疏矩阵的元素(例如,找到所有元素 > 阈值,然后替换),但我也找不到办法。提前致谢!
我不知道在 scikit learn 中有任何预建的功能,但是你绝对可以直接编辑你的文档术语矩阵,例如 numpy.where :
x = numpy.where(x < threshold, x, threshold)
其中 x
是您的文档术语矩阵,threshold
是您的阈值。
编辑:
我没有意识到 numpy.where 不适用于 scipy 稀疏矩阵。您可以使用 scipy.sparse
中的 find
function 将 return 稀疏矩阵中的所有非 0 索引,以便直接访问和修改这些值:
from scipy.sparse import find
results = find(x > threshold)
for i in range(len(results[0])):
x[results[0][i], results[1][i]] = threshold
它明显不够优雅,但它确实有效。
我正在分析歌词,其中重复不一定意味着更高的重要性,所以我想限制每个文档的字数 。例如,如果一个单词在一首歌中出现 n
次,其中 n > threshold
,那么我会将 n
替换为 threshold
.
我检查了CountVectorizer docs,有min_df
和max_df
的选项,但这些只能忽略出现在某些中的单词文档,而不是在 单个 文档中出现 n 次 的单词。
我正在考虑更改稀疏矩阵的元素(例如,找到所有元素 > 阈值,然后替换),但我也找不到办法。提前致谢!
我不知道在 scikit learn 中有任何预建的功能,但是你绝对可以直接编辑你的文档术语矩阵,例如 numpy.where :
x = numpy.where(x < threshold, x, threshold)
其中 x
是您的文档术语矩阵,threshold
是您的阈值。
编辑:
我没有意识到 numpy.where 不适用于 scipy 稀疏矩阵。您可以使用 scipy.sparse
中的 find
function 将 return 稀疏矩阵中的所有非 0 索引,以便直接访问和修改这些值:
from scipy.sparse import find
results = find(x > threshold)
for i in range(len(results[0])):
x[results[0][i], results[1][i]] = threshold
它明显不够优雅,但它确实有效。