使用SciKit对句子进行分类

我有两个包含大量句子的文件。一个文件中的句子含有正面词汇,另一个文件中的句子含有负面词汇。我正在尝试训练一个分类器,用于“正面”和“负面”两个类别,以便当我给出一个新句子时,它可以告诉我该句子属于哪个类别。以下是我目前的进展:

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注