AttributeError:找不到下限;在scikit learn中使用带有CountVectorizer的Pipel



我有一个这样的语料库:

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 = 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

我在这里搜索并发现了一个关于这个错误的问题,这让我相信我的文本没有被标记化是有问题的(这听起来像是一针见血,因为我使用了一个列表列表作为输入数据,其中每个列表都包含一个未断开的字符串)。

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

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是为了将文本转换为小写还是其他什么?我从读取堆栈跟踪中看不出来)。我是不是滥用了管道。。。还是这个问题真的只是CountVectorizer的论点的问题?

如有任何建议,我们将不胜感激。

这是因为您的数据集格式错误,您应该将"一个产生str、unicode或文件对象的迭代"传递到CountVectorizer的拟合函数中(或者传递到管道中,无关紧要)。不可在具有文本的其他可迭代项上迭代(如在您的代码中)。在您的情况下,List是可迭代的,您应该传递成员为字符串的平面列表(而不是其他列表)。

即,您的数据集应该看起来像:

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

看看这个例子,非常有用:用于文本特征提取和评估的示例管道

您可以像这样传递数据:

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))

相关内容

  • 没有找到相关文章

最新更新