TFIDFVectorizer 管道上具有不同 ngram 范围的 Word 和 Char ngram

问题描述

我正在尝试使用 3 到 5 个字符的 n-gram 和 1 到 2 个单词的 n-gram,使用 Pipeline 和 GridSearch 运行管道,但我遇到了一些错误。完整代码如下:

def prediction(dataFrame):
     allText = []
     for index,row in dataFrame.iterrows():
        allText.append(res)

    pipeline = Pipeline([
          ('vect',TfidfVectorizer(min_df=2,analyzer="char",sublinear_tf=True,max_df=0.01,ngram_range=(3,5))),('vec',analyzer="word",ngram_range=(1,2))),('clf',LinearSVC()),])
     parameters = [{
          'clf__C': [0.1,0.5,1,1.5,5]
     }]
     grid_search = gridsearchcv(pipeline,parameters,scoring="accuracy",cv=5)
     grid_search.fit(allText,dataFrame.gender)
     print("Best parameter (CV score=%0.3f):" % grid_search.best_score_)

我在 FeatureExtraction 上遇到了一些错误,比如“AttributeError:lower not found”,除了所有文本似乎都是正确的。

这种情况有什么问题?

解决方法

使用 Pipeline,您可以链接两个 TfidfVectorizer 向量化器,因此在第一个向量化器之后,您可以获得数值特征,然后将这些特征传递给第二个。但您的目标是连接两个不同的 TfidfVectorizer 特征矩阵。管道按顺序应用转换器(如果给定了最终估计器),而 FeatureUnion 分别运行所有转换器并将结果连接到单个特征空间中。

解决方案:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import FeatureUnion,Pipeline
from sklearn.svm import LinearSVC

# Replace your pipeline with this:
char_tfidf = TfidfVectorizer(analyzer='char',ngram_range=(3,5))
word_tfidf = TfidfVectorizer(analyzer='word',ngram_range=(1,2))
tfidf = FeatureUnion([('char',char_tfidf),('word',word_tfidf)])
pipeline = Pipeline([('tfidf',tfidf),('clf',LinearSVC())])