AttributeError:未找到lower;在scikit中使用带有CountVectorizer的管道 - 学习

时间:2015-11-09 09:25:59

标签: python scikit-learn pipeline

我有一个语料库:

X_train = [ ['this is an dummy example'] 
      ['in reality this line is very long']
      ...
      ['here is a last text in the training set']
    ]

和一些标签:

y_train = [1, 5, ... , 3]

我想使用Pipeline和GridSearch,如下所示:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('reg', SGDRegressor())
])


parameters = {
    'vect__max_df': (0.5, 0.75, 1.0),
    'tfidf__use_idf': (True, False),
    'reg__alpha': (0.00001, 0.000001),
}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=1, verbose=1)

grid_search.fit(X_train, y_train)

当我运行此操作时,出现错误AttributeError: lower not found

我搜索并发现了一个关于此错误here的问题,这让我相信我的文字没有被标记化(这听起来像是敲了敲头,因为我使用了作为输入数据的列表列表,其中每个列表包含一个单个不间断的字符串)。

我制作了一个快速而肮脏的标记器来测试这个理论:

def my_tokenizer(X):
    newlist = []
    for alist in X:
        newlist.append(alist[0].split(' '))
    return newlist

它做了它应该做的事情,但是当我在CountVectorizer的参数中使用它时:

pipeline = Pipeline([
    ('vect', CountVectorizer(tokenizer=my_tokenizer)),

......我仍然得到同样的错误,好像什么也没发生。

我注意到我可以通过在我的管道中注释掉CountVectorizer来规避错误。这很奇怪......我没有想到你可以使用TfidfTransformer()而不首先使用数据结构进行转换......在这种情况下是计数矩阵。

为什么我一直收到此错误?实际上,知道这个错误意味着什么会很好! (调用lower是否将文本转换为小写或其他内容?我无法通过读取堆栈跟踪来判断。我是否滥用了Pipeline ......或者问题确实是CountVectorizer单独参数的问题?

非常感谢任何建议。

2 个答案:

答案 0 :(得分:6)

这是因为您的数据集格式错误,您应该将"An iterable which yields either str, unicode or file objects"传递给CountVectorizer的拟合函数(或者进入管道,无关紧要)。不能与其他具有文本的iterables迭代(如在代码中)。在你的情况下,List是可迭代的,你应该传递其成员是字符串的扁平列表(而不是其他列表)。

即。您的数据集应如下所示:

X_train = ['this is an dummy example',
      'in reality this line is very long',
      ...
      'here is a last text in the training set'
    ]

看看这个例子,非常有用:Sample pipeline for text feature extraction and evaluation

答案 1 :(得分:1)

您可以像这样传递数据:

from sklearn import metrics
text_clf.fit(list(X_train), list(y_train))
predicted = text_clf.predict(list(X_test))
print(metrics.classification_report(list(y_test), predicted))