最全NLP中文文本分类实践(中)——SVM和基于keras的TextCNN实现

本文对比了SVM和基于Keras的TextCNN在NLP中文文本分类任务上的应用。SVM模型实现了89.48%的accuracy和87.42%的macro f1,而TextCNN达到约80%的macro f1,表现出过拟合。尽管TextCNN结构复杂,但在数据规模和特征工程不足的情况下,SVM表现更优。
摘要由CSDN通过智能技术生成

在上一篇文章中,我们获取了分词的向量表达,接下来要考虑怎么样构建模型。在这一部分,我将分别按普通的机器学习分类器和稍复杂的神经网络TextCNN模型来进行功能的实现。关于上一篇文章的详细内容请查看下面的链接。

最全NLP中文文本分类实践(上)——中文分词获取和Word2Vec模型构建

1 SVM实现

我们确实拥有了词的向量表达,可是,每个文章都包含不同数量的单词,我们怎么样用训练出来的词向量表示不同的文章呢?在这里,我用的是计算平均词向量来表示文档的方法。这其实挺好理解的,就是文章内包含的所有词的向量相加再取平均,这样,我们就可以得到一个和词向量维度相同的指示文章信息的向量。

import numpy as np
#num_features表示的文本单词大小
def average_word_vectors(words,model,vocabulary,num_features):
    feature_vector=np.zeros((num_features,),dtype='float64')
    nwords=0
    for word in words:
        if word in vocabulary:
            nwords=nwords+1
            feature_vector=np.add(feature_vector,model[word])
    if nwords:
        feature_vector=np.divide(feature_vector,nwords)
    return feature_vector

def averaged_word_vectorizer(corpus,model,num_features):
    #get the all vocabulary
    vocabulary=set(model.wv.index2word)
    features=[average_word_vectors(tokenized_sentence,model,vocabulary,num_features) for tokenized_sentence in corpus]
    return np.array(features)

def get_word_vectors(data):
    words_art=[]
    for i in range(len(data)):
        words_art.append(eval(data.loc[i]))
    return averaged_word_vectorizer(words_art,model=w2vmodel,num_features=300)

计算平均向量的函数已经写好了,下面我们就把他应用到我们预先保存好以文章形式保存的分词列表上。

w2v_model = gensim.models.KeyedVectors.load_word2vec_format('word2vec_ensemble.txt',binary=False)
train = pd.read_csv('article_features_train.csv')
test = pd.read_csv('article_features_test.csv')
X_train = get_word_vectors(train.Words)
y_train = train.label
X_test = get_word_vectors(test.Words)
y_test = test.label

接下来,利用GridSearchCV来找到设置条件下f1_macro最高的模型。

from sklearn import svm
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import f1_score
clf = svm.SVC()
grid_values = {
   'gamma': [0.001, 0.01, 0.05, 0.1, 1, 10],
               'C':[0.01, 0.1, 1, 10, 100]}

grid_clf = GridSearchCV(clf, param_grid = grid_values,scoring = 'f1_macro')
grid_clf.fit(X_train, y_train)
y_grid_pred = grid_clf.predict(X_test)

print('Test set F1: ', f1_score(y_test,y_grid_pred,average='macro'))
print('Grid best parameter (max. f1): ', grid_clf.best_params_)
print('Grid best score (accuracy): ', grid_clf.best_score_)

在我的测试中,我得到的模型效果最好的参数是{‘C’: 10, ‘gamma’: 1}。将这些参数重新设置训练并保存模型。

from sklearn.externals import joblib
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

clf = svm.SVC(C=10, gamma= 1,probability
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值