用SciKit对句子进行分类

时间:2017-05-02 15:11:02

标签: python machine-learning scikit-learn

我有两个包含一堆句子的文件。其中一个文件的句子带有正面的单词,而另一个带有负面的单词。我正在尝试在两个班级上训练一个分类器,"积极的"和"否定"因此,当我给它一个新句子时,它将告诉它属于哪个类别。这就是我到目前为止所做的:

...
from sklearn.feature_extraction.text import 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'].values

a_train, a_test, b_train, b_test = train_test_split(X, y, test_size=0.33, random_state=42)

from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=10)

classifier.fit(a_train.toarray(), b_train)
prediction = classifier.predict(a_test.toarray())

from sklearn import metrics
print(metrics.f1_score(b_test, prediction, average='macro'))

# classify a new sentence
df= pd.DataFrame({'text': ['A negative sentence', 'A positive sentence'],'class': [1, 0]})
print(classifier.predict(tfidf_vect.transform(df['text'].values)))

当我尝试对新句子进行分类时,我得到的功能不匹配。我的问题是,这段代码中正在考虑的功能究竟是什么?我如何定义这些特征(例如,如果我想做的不仅仅是一个单词并且每个单词的每个向量都能编码更多的东西)?

1 个答案:

答案 0 :(得分:1)

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'].values

print(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'].values

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