Python 使用scipy.sparse进行计数

Python 使用scipy.sparse进行计数,python,nlp,scipy,sparse-matrix,scikit-learn,Python,Nlp,Scipy,Sparse Matrix,Scikit Learn,我正在使用Python学习库。 我有15万多句话 我需要一个类似数组的对象,其中每一行对应一个句子,每一列对应一个单词,每个元素是该句子中的单词数 例如:如果这两句话是“狗跑了”和“男孩跑了”,我需要 (列的顺序不相关,取决于将哪个列指定给哪个单词) 我的数组将是稀疏的(每个句子将有可能的单词的一小部分),因此我使用scipy.sparse def word_counts(texts, word_map): w_counts = sp.???_matrix((len(texts),len

我正在使用Python学习库。 我有15万多句话

我需要一个类似数组的对象,其中每一行对应一个句子,每一列对应一个单词,每个元素是该句子中的单词数

例如:如果这两句话是“狗跑了”和“男孩跑了”,我需要

(列的顺序不相关,取决于将哪个列指定给哪个单词)

我的数组将是稀疏的(每个句子将有可能的单词的一小部分),因此我使用scipy.sparse

def word_counts(texts, word_map):
    w_counts = sp.???_matrix((len(texts),len(word_map)))

    for n in range(0,len(texts)-1):
        for word in re.findall(r"[\w']+", texts[n]):
            index = word_map.get(word)
            if index != None:
                w_counts[n,index] += 1
    return w_counts

...
nb = MultinomialNB() #from sklearn
words = features.word_list(texts)
nb.fit(features.word_counts(texts,words), classes)
我想知道什么样的稀疏矩阵最好

我尝试使用coo_矩阵,但出现了一个错误:

TypeError:“coo_matrix”对象没有属性“\uuuu getitem\uuuuu”

我看了一下首席运营官的简历,但对以下内容感到非常困惑:

稀疏矩阵可用于算术运算…
COO格式的缺点。。。 不直接支持: 算术运算

我使用了dok_矩阵,这很有效,但我不知道这在这种情况下是否表现最好


提前感谢。

尝试
lil_矩阵
dok_矩阵
;这些很容易构造和检查(但是在
lil_矩阵
的情况下,由于每次插入都需要线性时间,因此可能非常慢)。Scikit学习接受稀疏矩阵的估计器将接受任何格式,并在内部将其转换为有效格式(通常为
csr\u矩阵
)。您也可以使用
scipy.sparse
矩阵上的
tocoo
todok
tocsr
等方法自己进行转换

或者,只需使用scikit learn提供的或类即可<代码>计数向量器将整个文档作为输入:

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> documents = ["The dog ran", "The boy ran"]
>>> vectorizer = CountVectorizer(min_df=0)
>>> vectorizer = CountVectorizer(min_df=0, stop_words=[])
>>> X = CountVectorizer.fit_transform(documents)
>>> X = vectorizer.fit_transform(documents)
>>> X.toarray()
array([[0, 1, 1, 1],
       [1, 0, 1, 1]])
。。。而
DictVectorizer
假设您已经完成了标记化和计数,其结果为每个样本的
dict

>>> from sklearn.feature_extraction import DictVectorizer
>>> documents = [{"the":1, "boy":1, "ran":1}, {"the":1, "dog":1, "ran":1}]
>>> X = vectorizer.fit_transform(documents)
>>> X.toarray()
array([[ 1.,  0.,  1.,  1.],
       [ 0.,  1.,  1.,  1.]])
>>> vectorizer.inverse_transform(X[0])
[{'ran': 1.0, 'boy': 1.0, 'the': 1.0}]
(数个版本之前添加了
countvectorier
min_df
参数。如果您使用的是旧版本,请省略它,或者升级。)


编辑根据常见问题,我必须公开我的从属关系,因此我是
DictVectorizer
的作者,我还写了
CountVectorizer

的部分内容,因为CountVectorizer是这里的真实答案。(也可能是听写器,但我还没试过。)
>>> from sklearn.feature_extraction import DictVectorizer
>>> documents = [{"the":1, "boy":1, "ran":1}, {"the":1, "dog":1, "ran":1}]
>>> X = vectorizer.fit_transform(documents)
>>> X.toarray()
array([[ 1.,  0.,  1.,  1.],
       [ 0.,  1.,  1.,  1.]])
>>> vectorizer.inverse_transform(X[0])
[{'ran': 1.0, 'boy': 1.0, 'the': 1.0}]