【问题标题】:NLP: What is the appropriate way to use engineered features in a sklearn pipeline?NLP:在 sklearn 管道中使用工程特征的适当方法是什么?
【发布时间】:2018-08-21 11:20:03
【问题描述】:

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

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

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

但所有这些基本管道的得分都非常低。所以我想开始进行网格搜索并结合我自己的功能。

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

加入新功能

以 1 个新功能为例,它是一个布尔值,表示是否存在正词(只是一个基本示例)。我会创建一个 (len(X_train), 1) 维的布尔值数组,对应于每条推文。

我的想法:

  1. 在对推文进行预处理后,将它们标记化并用 word2index 字典中的值替换单词。将推文填充到相等的长度,然后将此数组与我的特征连接起来。然后像往常一样将它传递到管道中。

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

  3. 也许使用整数数组而不是字符串的转换会出现问题?

问题

有人可以建议使用 sklearn 进行此操作的最佳方法。

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

我认为这对其他刚开始使用 NLP 的人非常有帮助,所以请尽可能笼统。

【问题讨论】:

  • 使用 FeatureUnion 将您的新特征与从矢量化器中找到的特征结合起来。见this example
  • @VivekKumar 感谢您的评论。如果您有任何这样做的经验和一些空闲时间,如果您能创建一个答案,那就太好了。再次感谢您的链接。

标签: python scikit-learn nlp


【解决方案1】:

按照 Vivek Kumar 的建议,可以使用 sklearn 的 FeatureUnion 将功能整合到管道中,详细信息可在 scikit-learn 网站上找到:http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html

在使用 Pipeline 时,应该将其拆分为多个部分,其中有 3 个重要部分:数据提取,然后是 FeatureUnion,然后是分类器。在FeatureUnion内部,很可能会有多个管道对应不同的特征,比如词袋模型、Tfidf、ad-hoc特征等。

在上面提供的链接中可以详细看到,伪结构是这样的:

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

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 2017-12-23
    • 2019-12-12
    • 2019-05-02
    • 1970-01-01
    • 2019-08-10
    • 2017-12-29
    • 2016-03-26
    • 2015-11-23
    相关资源
    最近更新 更多