我第一次进行文本分类任务(推特情绪分析),但我不确定如何将工程特征整合到我的sklearn管道中。
到目前为止,我在输出分类器之前尝试过转换。例如:
model = Pipeline([('t', 'mean_vectorizer'), ('logreg', LogisticRegression())])
但所有这些基本流水线都会产生非常低的分数。所以我想开始进行网格搜索并结合我自己的功能。
到目前为止,我的数据集(X_train)是行是推文(单个字符串)。这是由mean_vectorizer处理的格式(如果我使用它,则为tfidf_vectorizer)。
合并新功能
举例说明1个新功能,一个布尔值,表示是否存在正字(只是一个基本示例)。我将创建一个(len(X_train),1)维度的布尔值数组,对应于每条推文。
我的想法:
预处理推文后,将它们标记化并用word2index dict中的值替换单词。将推文填充到相等的长度,然后将此数组与我的功能连接起来。然后照常传递到管道中。
也许有一种方法可以将这些功能单独传递到管道中?
使用整数数组而不是字符串时,转换会出现问题吗?
问题
有人可以使用sklearn建议最好的方法。
假设数据是一个句子列表(与测试分开的训练),每个句子都是一个字符串。
我认为这对于从NLP开始的其他人来说真的很有帮助,所以请尽可能一般。
答案 0 :(得分:0)
如Vivek Kumar所建议的那样,可以使用sklearn' FeatureUnion
将功能合并到管道中,详细信息请参见scikit-learn网站:http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html。
使用Pipeline时,应将其拆分为多个部分,其中包含3个重要部分:数据提取,然后是FeatureUnion
,然后是分类器。在FeatureUnion
内,可能会有多个与不同功能相对应的管道,例如一袋单词模型,Tfidf,特殊功能等。
从上面提供的链接中可以看出,伪结构是这样的:
pipeline = Pipeline([
# Get array of text
('text', TextExtractor()),
# Use FeatureUnion to combine the features used in classification
('union', FeatureUnion(
transformer_list=[
('text2', Pipeline([('f', feature1)])),
('body_bow', Pipeline([('tfidf', some_vectorizer)])),
# Pipeline for pulling ad hoc features from text
('body_stats', Pipeline([('f2', feature_dictionary)]))])),
# Use a SVC classifier on the combined features
('clf', classifier()),
])