机器学习——影评倾向分析(三-1)

2018-12-24  本文已影响0人  minlover

目前,有一个能对单词有一定语义理解的训练模型

一、词的数组表示

上一节训练的Word2Vec模型中,词汇表的每个单词有一个特征向量(词向量),存储在一个叫做syn0的numpy array中。

from gensim.modelsimport Word2Vec

model= Word2Vec.load("300features_40minwords_10context")

print(type(model.syn0))

print(model.syn0.shape)

16400是把最小次数设置为40后,得到的总词汇量;300是设置的特征向量维度

如果报错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)

上一篇下一篇

猜你喜欢

热点阅读