机器学习——影评倾向分析(三-1)
目前,有一个能对单词有一定语义理解的训练模型
一、词的数组表示
上一节训练的Word2Vec模型中,词汇表的每个单词有一个特征向量(词向量),存储在一个叫做syn0的numpy array中。
16400是把最小次数设置为40后,得到的总词汇量;300是设置的特征向量维度from gensim.modelsimport Word2Vec
model= Word2Vec.load("300features_40minwords_10context")
print(type(model.syn0))
print(model.syn0.shape)
如果报错AttributeError: 'Word2Vec' object has no attribute 'syn0',就把model.syn0,换成model.wv.syn0。
查看每个单词的词向量,例如flower的,会出现一个1x300的矩阵:
二、从单词到段落
1、Attemp1:向量平均
IMDB数据集的一大挑战就是评论是变长的,需要找到一个方法把每个词向量转换成一个特征集合,对于每个评论,特征向量要是等长的。
(1)由于词向量都是300维的,所以可以用向量操作来组合评论中的词。一种方法是,简单的取评论中的向量平均,因此我们移除停用词,防止增加噪声。
import numpy as np
#计算一个评论中所有特征向量(词向量)的平均值
def makeFeatureVec(words,model,num_features):
#预先初始化一个空的numpy数组
featureVec= np.zeros((num_features,),dtype="float32")
nwords= 0.
#index2word是词表中所有单词的名字list ,为了速度转为set
index2word_set= set(model.index2word)
#遍历评论中的所有单词,如果在词表的单词中,就把它的特征向量加到总和中
for word in words:
if word in index2word_set:
nwords= nwords+1.
featureVec= np.add(featureVec,model[word])
#求平均
featureVec= np.divide(featureVec, nwords)
return featureVec
model.index2word如果报错,换成model.wv.index2word
(2)给定一组评论(每个评论是一个单词list),计算每个评论的平均特征向量,返回一个二维数组
def getAvgFeatureVecs(reviews,model,num_features):
#初始化一个计数器,从而在长长的处理过程中显示进度
counter= 0.
#预分配一个二维numpy数组
reviewFeatureVecs= np.zeros((len(reviews),num_features),dtype="float32")
#遍历所有评论,为每个平均计算平均特征向量
for review in reviews:
if counter%1000. == 0.:
print("Review %d of %d" % (counter,len(reviews)))
reviewFeatureVecs[counter]= makeFeatureVec(review,model,num_features)
counter= counter+ 1.
return reviewFeatureVecs
(3)调用上面函数为训练集和测试集计算平均特征向量,移除停用词
from test2 import train, review_to_wordlist, test, num_features
print("Creating average feature vecs for train reviews")
clean_train_reviews= []
for review in train["review"]:
clean_train_reviews.append(review_to_wordlist(review,remove_stopwords=True))
trainDataVecs= getAvgFeatureVecs(clean_train_reviews, model, num_features)
print("Creating average feature vecs for test reviews")
clean_test_reviews= []
for review in test["review"]:
clean_test_reviews.append((review_to_wordlist(review,remove_stopwords=True)))
testDataVecs= getAvgFeatureVecs(clean_test_reviews, model, num_features)
(4)用平均段落向量来训练随机森林(注意只能用有标签的训练数据来做训练集)
from sklearn.ensembleimport RandomForestClassifier
#初始化100个树的随机森林分类器
forest= RandomForestClassifier(n_estimators=100)
print("Fitting a random forest to labeled training data...")
forest= forest.fit(trainDataVecs, train["sentiment"])
#预测测试集的结果
result= forest.predict(testDataVecs)
#将测试结果写入文件
output= pd.DataFrame(data={"id":test["id"],"sentiment":result})
output.to_csv("C:\\data\\Word2Vec_AverageVectors.csv",index=False,quoting=3)