我有两个包含大量句子的文件。一个文件中的句子含有正面词汇,另一个文件中的句子含有负面词汇。我正在尝试训练一个分类器,用于“正面”和“负面”两个类别,以便当我给出一个新句子时,它可以告诉我该句子属于哪个类别。以下是我目前的进展:
...from sklearn.feature_extraction.text import TfidfVectorizertfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False)input_list = ['A positive sentence', 'A negative sentence', ...]class_list = [0, 1, ...]df= pd.DataFrame({'text':input_list,'class': class_list})X = tfidf_vect.fit_transform(df['text'].values)y = df['class'].valuesa_train, a_test, b_train, b_test = train_test_split(X, y, test_size=0.33, random_state=42)from sklearn.ensemble import RandomForestClassifierclassifier = RandomForestClassifier(n_estimators=10)classifier.fit(a_train.toarray(), b_train)prediction = classifier.predict(a_test.toarray())from sklearn import metricsprint(metrics.f1_score(b_test, prediction, average='macro'))# classify a new sentencedf= pd.DataFrame({'text': ['A negative sentence', 'A positive sentence'],'class': [1, 0]})print(classifier.predict(tfidf_vect.transform(df['text'].values)))
当我尝试对新句子进行分类时,我遇到了特征不匹配的问题。我的问题是,这段代码中考虑的特征到底是什么?以及我如何定义特征(例如,如果我想不仅仅是词袋模型,并且希望每个单词的向量编码更多信息)?
回答:
TfidfVectorizer
内置了一个很好的功能来帮助解决这个问题。对于下面的例子,你可以看到特征对应哪些单词。
tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False)input_list = ['A positive sentence', 'A negative sentence', ]class_list = [0, 1]df= pd.DataFrame({'text':input_list,'class': class_list})X = tfidf_vect.fit_transform(df['text'].values)y = df['class'].valuesprint(tfidf_vect.get_feature_names())print()print(X.todense())
输出
[u'negative', u'positive', u'sentence'][[ 0. 0.81480247 0.57973867] [ 0.81480247 0. 0.57973867]]
如果你想扩展模型以包含单词对,这也很容易做到:
tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False, ngram_range=(1, 2))input_list = ['A positive sentence', 'A negative sentence', ]class_list = [0, 1]df= pd.DataFrame({'text':input_list,'class': class_list})X = tfidf_vect.fit_transform(df['text'].values)y = df['class'].valuesprint(tfidf_vect.get_feature_names())print()print(X.todense())
输出
[u'negative', u'negative sentence', u'positive', u'positive sentence', u'sentence'][[ 0. 0. 0.6316672 0.6316672 0.44943642] [ 0.6316672 0.6316672 0. 0. 0.44943642]]
如果你想添加更多的自定义特征,你可以像这样将它们添加到末尾:
X = np.array(X.todense())my_feature = np.array([[0.7, 1.2]])np.concatenate((X, my_feature.T), axis=1)
输出:
array([[ 0. , 0. , 0.6316672 , 0.6316672 , 0.44943642, 0.7 ], [ 0.6316672 , 0.6316672 , 0. , 0. , 0.44943642, 1.2 ]])