首页 文章

使用scikit学习's GaussianNB with nltk doesn' t工作

提问于
浏览
0

我正在尝试将nltk的包装器用于scikit-learn的分类器 . 我使用此代码来训练分类器:

classifier = SklearnClassifier(GaussianNB())
classifier.train(self.training_set)

training_set 的样子

[({'name':'Alpha Hotel', 'clicks':765, 'zip_code':75025},'no bookings')]

我得到的错误是

TypeError:传递了稀疏矩阵,但需要密集数据 . 使用X.toarray()转换为密集的numpy数组 .

train 方法的't know how to convert to a dense array, especially since nltk'文档需要 A list of (featureset, label) where each featureset is a dict mapping strings to either numbers, booleans or strings.

2 回答

  • 0

    您有三个功能,其中只有两个是数字格式 . 您首先应将“名称”功能转换为数字 . 如果name变量是分类的,那么您可以按照这里描述的有意义的方式对其进行编码:

    http://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features

    我认为你的标签也有限,所以你也可以对它们进行编码 . 最后一步非常简单,您只需将nltk格式转换为numpy数组格式即可 . 只需读取循环中的每个功能,然后在X(功能)和Y(标签)中插入所需的功能:

    http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html

  • 0

    也许它已经很晚了,但也许可以帮助其他人得到同样的问题(因为我昨天遇到了这个问题) .

    TypeError:传递了稀疏矩阵,但需要密集数据 . 使用X.toarray()转换为密集的numpy数组 .

    像错误一样,它需要转换为数组,所以我只是将其转换为数组,因为错误说

    vector = vectorizer.transform(corpus).toarray()
    

    所以只需添加.toarray()就可以解决这个问题 .
    ;)

    当我切换到MultinomialNB或BernoulliNB时,他们都没有错误 . 有或没有toarray() .

    注意:别忘了转换为适合并将文本转换为单词表示(数值) .

相关问题