【问题标题】:Scikit Text Classification – Bad input shape errorScikit 文本分类 - 错误的输入形状错误
【发布时间】:2018-02-12 02:24:36
【问题描述】:

我已修改本教程 (http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html) 以在路透社语料库上构建文本分类器。但是,我得到一个错误的输入形状错误:

编辑:感谢@Vivek Kumar 的帮助,我解决了输入形状错误的问题。但是,现在我得到一个 AttributeError: lower not found。经过一些研究,我认为这可能与路透社语料库没有正确的形式有关。有什么办法可以解决这个问题吗?

这是我的代码:

from sklearn.datasets import fetch_rcv1 #import reuters corpus
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

rcv1 = fetch_rcv1()


reuters_train = fetch_rcv1(subset='train', shuffle=True, random_state=42)
reuters_train.target_names

count_vect = CountVectorizer()

train_counts = count_vect.fit_transform(reuters_train.data)
train_counts.shape
count_vect.vocabulary_.get(u'alogrithm')

tf_transformer = TfidfTransformer(use_idf=False).fit(train_counts)
train_tf = tf_transformer.transform(train_counts)
train_tf.shape
tfidf_transformer = TfidfTransformer()
train_tfidf = tfidf_transformer.fit_transform(train_counts)
train_tfidf.shape

clf = MultinomialNB().fit(train_tfidf, reuters_train.target)

text_clf = Pipeline([('vect', CountVectorizer()),
                     ('tfidf', TfidfTransformer()),
                     ('clf', MultinomialNB()),])

text_clf.fit(reuters_train.data, reuters_train.target)
Pipeline(...)

import numpy as np

reuters_testset = fetch_rcv1(subset='test', shuffle=True, random_state=42)

reuters_test = reuters_testset.data

predicted = text_clf.predict(reuters_test)

np.mean(predicted == reuters_test.target)

我是编程和 NLP 的真正初学者,所以我对所有这些东西真的不太了解(目前)。 感谢您的任何建议和帮助!

【问题讨论】:

    标签: python scikit-learn text-classification valueerror


    【解决方案1】:

    那是因为您没有使用 CountVectorizer 中的实际数据。您正在使用reuters_train,而您应该使用reuters_train.data

    变化:

    train_counts = count_vect.fit_transform(reuters_train)
    

    到:

    train_counts = count_vect.fit_transform(reuters_train.data)
    

    还有 CountVectorizer + TfidfTransformer = TfidfVectorizer。所以我建议使用它来代替两个对象。

    在进一步阅读RCV1 dataset here 的描述时,鉴于.data 包含:

    非零值包含余弦归一化的对数 TF-IDF 向量。

    所以实际上不需要对数据做 CountVectorizer 和 TfidfTransformer,你可以像这样直接使用它:

    clf = MultinomialNB().fit(reuters_train.data, reuters_train.target)
    

    但是您将再次遇到错误,这一次是由于目标数据的形状。您会看到 MultinomialNB().fit() 仅适用于单维目标(可能是多类或二进制),但不适用于多标签或多输出数据。

    TLDR; 因此,您需要从代码中删除 CountVectorizer 和 TfidfTransformer,因为它已经在数据中完成,您需要将分类器 MultinomialNB 更改为任何其他支持目标 @987654331 中的二维@ 可能是 DecisionTreeClassifier 或其他。

    【讨论】:

    • 谢谢,这很有帮助!但是,现在我得到一个 AttributeError: lower not found?知道我能做些什么吗?
    • @LittleEntertainer 在同一个代码上?或者你有没有改变它。请编辑问题并添加详细信息。还要添加错误的完整堆栈跟踪。
    • @LittleEntertainer 嘿,我已经编辑了我的答案以适应您遇到的第二个错误。
    猜你喜欢
    • 2013-12-18
    • 2018-04-30
    • 2020-06-12
    • 2018-09-22
    • 2016-02-15
    • 2015-06-26
    • 2019-05-11
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多