NLP:在sklearn管道中使用工程特征的适当方法是什么?

时间:2018-03-13 09:10:08

标签: python scikit-learn nlp

我第一次进行文本分类任务(推特情绪分析),但我不确定如何将工程特征整合到我的sklearn管道中。

到目前为止,我在输出分类器之前尝试过转换。例如:

model = Pipeline([('t', 'mean_vectorizer'), ('logreg', LogisticRegression())])

但所有这些基本流水线都会产生非常低的分数。所以我想开始进行网格搜索并结合我自己的功能。

到目前为止,我的数据集(X_train)是行是推文(单个字符串)。这是由mean_vectorizer处理的格式(如果我使用它,则为tfidf_vectorizer)。

合并新功能

举例说明1个新功能,一个布尔值,表示是否存在正字(只是一个基本示例)。我将创建一个(len(X_train),1)维度的布尔值数组,对应于每条推文。

我的想法:

  1. 预处理推文后,将它们标记化并用word2index dict中的值替换单词。将推文填充到相等的长度,然后将此数组与我的功能连接起来。然后照常传递到管道中。

  2. 也许有一种方法可以将这些功能单独传递到管道中?

  3. 使用整数数组而不是字符串时,转换会出现问题吗?

  4. 问题

    有人可以使用sklearn建议最好的方法。

    假设数据是一个句子列表(与测试分开的训练),每个句子都是一个字符串。

    我认为这对于从NLP开始的其他人来说真的很有帮助,所以请尽可能一般。

1 个答案:

答案 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()),
])