问题描述
我正在尝试使用 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())])