我有一个熊猫系列,里面有很多文本。使用sklearn
包中的CountVectorizer
函数,我计算了稀疏矩阵。我也确定了最重要的单词。现在我想过滤我的稀疏矩阵,只针对那些顶部单词。
原始数据包含多于7000
行且包含多于75000
字。因此,我在这里创建一个样本数据
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
words = pd.Series(['This is first row of the text column',
'This is second row of the text column',
'This is third row of the text column',
'This is fourth row of the text column',
'This is fifth row of the text column'])
count_vec = CountVectorizer(stop_words='english')
sparse_matrix = count_vec.fit_transform(words)
我已经为该列中的所有单词创建了稀疏矩阵。这里只是为了打印我的稀疏矩阵,我使用.toarray()
函数将其转换为数组。
print count_vec.get_feature_names()
print sparse_matrix.toarray()
[u'column', u'fifth', u'fourth', u'row', u'second', u'text']
[[1 0 0 1 0 1]
[1 0 0 1 1 1]
[1 0 0 1 0 1]
[1 0 1 1 0 1]
[1 1 0 1 0 1]]
现在我正在寻找频繁出现的单词使用以下
# Get frequency count of all features
features_count = sparse_matrix.sum(axis=0).tolist()[0]
features_names = count_vec.get_feature_names()
features = pd.DataFrame(zip(features_names, features_count),
columns=['features', 'count']
).sort_values(by=['count'], ascending=False)
features count
0 column 5
3 row 5
5 text 5
1 fifth 1
2 fourth 1
4 second 1
由以上结果可知,column
、row
&text
。现在我只想为这些单词过滤稀疏矩阵。我不想把稀疏矩阵转换成数组,然后进行滤波。因为我在原始数据中出现了内存错误,因为单词的数量相当高。
我能够得到稀疏矩阵的唯一方法是使用vocabulary
属性对那些特定的单词再次重复这些步骤,比如这个
countvec_subset = CountVectorizer(vocabulary= ['column', 'text', 'row'])
相反,我正在寻找一个更好的解决方案,在那里我可以直接过滤稀疏矩阵中的单词,而不是从头开始重新创建。
您可以对稀疏矩阵进行切片。您需要派生用于切片的列。sparse_matrix[:, columns]
In [56]: feature_count = sparse_matrix.sum(axis=0)
In [57]: columns = tuple(np.where(feature_count == feature_count.max())[1])
In [58]: columns
Out[58]: (0, 3, 5)
In [59]: sparse_matrix[:, columns].toarray()
Out[59]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]], dtype=int64)
In [60]: type(sparse_matrix[:, columns])
Out[60]: scipy.sparse.csr.csr_matrix
In [71]: np.array(features_names)[list(columns)]
Out[71]:
array([u'column', u'row', u'text'],
dtype='<U6')
切片子集仍然是scipy.sparse.csr.csr_matrix