美文网首页
机器学习——影评倾向分析(三-1)

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

作者: minlover | 来源:发表于2018-12-24 11:01 被阅读0次

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

    一、词的数组表示

    上一节训练的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)

    相关文章

      网友评论

          本文标题:机器学习——影评倾向分析(三-1)

          本文链接:https://www.haomeiwen.com/subject/ueyakqtx.html