我有文本分类问题,想要添加两个功能。我的数据是电影评论(imbd数据集)。我想使用两个特征作为输入变量来将评论分类为正面或负面情绪。这两个特征是:评论长度(所以使用的单词)和评论的词袋表示。
所以另一件事是我想用sklearn中的FeatureUnion
对象来完成它。所以我想出了如何在没有使用hstack
来连接两个稀疏矩阵的情况下做到这一点。但作为一个学习目的,我很好奇如何用FeatureUnion
做这件事,因为我无法绕道而行。
我迄今使用的资源:
到目前为止,我有以下代码:
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.feature_extraction.text import CountVectorizer
# Instantiate pipeline: pl
pl = Pipeline([
('union', FeatureUnion(
transformer_list = [
('numeric_features', Pipeline([
('extract', ColumnExtractor(cols)),
('length', AverageWordLengthExtractor())
])),
('text_features', Pipeline([
('vectorizer', CountVectorizer())
]))
]
)),
('clf', LinearSVC())
])
自定义变形金刚:
class AverageWordLengthExtractor(TransformerMixin):
"""Takes in dataframe, extracts road name column, outputs average word length"""
def review_length(self, review):
"""Helper code to compute length of a review"""
return len(review.split())
def fit(self, X, y=None):
"""Returns `self` unless something different happens in train and test"""
return self
def transform(self, X, y=None):
"""The workhorse of this feature extractor"""
return X.apply(self.review_length)
和另一个自定义Transformer:
class ColumnExtractor(TransformerMixin):
"""Takes in dataframe, extracts road name column, outputs average word length"""
def __init__(self, cols):
self.cols = cols
def fit(self, X, y=None):
"""Returns `self` unless something different happens in train and test"""
return self
def transform(self, X, y=None):
"""The workhorse of this feature extractor"""
return X[self.cols]
请注意,X_train,y_train,X_test和y_test数据集将转换为pandas DataFrame,因此管道的输入将是一个数据帧。
我认为错误的是CountVectorizer
,因为这会输出一个稀疏矩阵。我应该使用CountVectorizer
类型创建自己的自定义转换器,这样它会返回一个数据帧吗?如果是这样,使用大型语料库的计算成本是否非常昂贵?我真的可以使用一些帮助我的想法是我无法在CountVectorizer
课程中使用FeatureUnion
完整的图片。