Pau*_*per 6 python nlp scipy sparse-matrix scikit-learn
我正在使用Python sklearn库.我有150,000多个句子.
我需要一个类似数组的对象,其中每一行用于句子,每列对应一个单词,每个元素是该句子中的单词数.
例如:如果两个句子是"狗跑"和"男孩跑",我需要
[ [1, 1, 1, 0]
, [0, 1, 1, 1] ]
Run Code Online (Sandbox Code Playgroud)
(列的顺序无关紧要,取决于哪个列分配给哪个单词)
我的数组将是稀疏的(每个句子将有一小部分可能的单词),所以我使用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)
Run Code Online (Sandbox Code Playgroud)
我想知道什么稀疏矩阵是最好的.
我尝试使用coo_matrix但出现错误:
TypeError:'coo_matrix'对象没有属性'__getitem__'
我查看了COO 的文档,但对以下内容感到非常困惑:
稀疏矩阵可用于算术运算......
COO格式的缺点......不直接支持:算术运算
我使用了dok_matrix,这很有用,但我不知道在这种情况下这是否表现最佳.
提前致谢.
尝试其中一个lil_matrix或dok_matrix; 那些很容易构建和检查(但在这种情况下lil_matrix,可能非常慢,因为每次插入需要线性时间).接受稀疏矩阵的Scikit-learn估计器将接受任何格式并在内部(通常csr_matrix)将它们转换为有效格式.您也可以使用这些方法自己做转换tocoo,todok,tocsr等上scipy.sparse矩阵.
或者,只需使用scikit-learn提供的CountVectorizer或DictVectorizer类就可以实现此目的.CountVectorizer将整个文档作为输入:
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
...虽然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}]
Run Code Online (Sandbox Code Playgroud)
(在几个版本之前添加了min_df参数CountVectorizer.如果您使用的是旧版本,请省略它,或者更确切地说,升级.)
编辑根据常见问题解答,我必须透露我的隶属关系,所以这里说:我是作者,DictVectorizer我也写了部分内容CountVectorizer.