我想用sklearn对一些句子进行分类。句子存储在Pandas DataFrame中。
首先,我想使用句子的长度和它的TF-IDF向量作为特征,所以我创建了这个管道:
pipeline = Pipeline([
('features', FeatureUnion([
('meta', Pipeline([
('length', LengthAnalyzer())
])),
('bag-of-words', Pipeline([
('tfidf', TfidfVectorizer())
]))
])),
('model', LogisticRegression())
其中LengthAnalyzer是自定义TransformerMixin
,其中包含:
def transform(self, documents):
for document in documents:
yield len(document)
因此,LengthAnalyzer返回一个数字(1维),而TfidfVectorizer返回一个n维列表。
当我尝试运行时,我得到了
ValueError: blocks[0,:] has incompatible row dimensions. Got blocks[0,1].shape[0] == 494, expected 1.
要使此功能组合有效,需要做些什么?
答案 0 :(得分:2)
似乎问题源自transform()中使用的yield
。也许由于yield
报告给scipy hstack
方法的行数为1而不是documents
中的实际样本数。
您的数据中应该有494行(样本)来自TfidfVectorizer
,但LengthAnalyzer
只报告一行。因此错误。
如果您可以将其更改为
return np.array([len(document) for document in documents]).reshape(-1,1)
然后管道适合成功。
注意: 我尝试在scikit-learn github上找到任何相关问题,但没有成功。您可以在此处发布此问题,以获得有关用法的实际反馈。