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

Word and Char ngram with different ngram range on TFIDFVectorizer Pipeline

我正在尝试 运行 具有 3 到 5 个字符 n-gram 和 1 到 2 个单词 n-gram 的管道,以及管道和 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', TfidfVectorizer(min_df=2,sublinear_tf=True,analyzer="word",max_df=0.01,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 向量化器,因此在第一个向量化器之后,您将获得 numerical 特征,然后将其传递到第二个。但是您的目标是 连接 两个不同的 TfidfVectorizer 特征矩阵。管道按顺序应用转换器(如果给定的话还有最终估计器),而 FeatureUnion 分别运行所有转换器并将结果连接成一个特征 space.

解决方案:

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