我想用sklearn对一些句子进行分类。这些句子存储在 Pandas 数据帧中。
首先,我想使用句子的长度和它的 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.
必须执行哪些操作才能使此功能组合正常工作?
似乎问题源于 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上找到任何相关问题,但没有成功。您可以在此处发布此问题以获取有关使用的一些真实反馈。