在上一篇文章中,我们获取了分词的向量表达,接下来要考虑怎么样构建模型。在这一部分,我将分别按普通的机器学习分类器和稍复杂的神经网络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