精华内容
下载资源
问答
  • 自己写论文手工标注的8分类的数据集,做文本情感分类
  • 目标情感分类

    2018-04-16 20:27:38
    emNLP中的一篇论文,主要写的是关于目标的情感分类
  • 微博中推文的标签情感分类
  • 随着网民的数量不断增加,用户上网产生的数据量也在成倍增多,随处可见各种各样的评论数据,所以构建一种高效的情感分类模型就非常有必要.本文结合Word2Vec与LSTM神经网络构建了一种三分类的情感分类模型:首先用...
  • 情感分类文献

    2012-11-25 00:26:16
    情感分类文献,最新发表在DSS上面的哈。Lexicon-based Comments-oriented News Sentiment Analyzer system.pdf
  • python情感分类

    2018-04-04 16:01:14
    python机器学习方法进行情感分析,里面含有源码,以及详细的解释,代码测试过,是完全可以调出来运行的
  • 情感分类资源

    2018-05-28 09:19:58
    利用SVM法处理微博文本数据并对其进行情感分类(Python)
  • 基于多层区域卷积神经网络的图像情感分类
  • 依据基于二叉树思想的分类支持向量机算法,进行了天气图像的情感分类方法的研究。通过定性分析和计算对比,确定了图像情感分类的可行算法和合理参数选取方法。结果表明,完全二叉决策树SVM算法对于天气图像的情感...
  • LSTM情感分类代码

    2018-07-18 11:33:29
    本文是关于英文情感分类的源码,详情请参考博客https://blog.csdn.net/pursue_myheart/article/details/81095094
  • 文档级别的方面情感分类为机器理解
  • NLP情感分析之情感分类

    万次阅读 2018-09-26 15:38:35
    情感分析与情感分类 情感分析(sentiment ...情感分析包含较的任务,如情感分类(sentiment classification)、观点抽取(opinion extraction)、观点问答和观点摘要等。因此很难简单地将其划归为某一个领域,...

    情感分析与情感分类

    情感分析(sentiment analysis)是近年来国内外研究的热点,其任务是帮助用户快速获取、整理和分析相关评价信息,对带有情感色彩的主观性文本进行分析、处理、归纳和推理。

    情感分析包含较多的任务,如情感分类(sentiment classification)、观点抽取(opinion extraction)、观点问答观点摘要等。因此很难简单地将其划归为某一个领域,往往从不同的角度将其划归到不同的方向。如果单纯地判别文本的倾向性,可以将其看作是一个分类任务;如果要从观点句中抽取相关的要素(观点持有者、观点评价对象等),则是一个信息抽取任务;而如果要从海量文本中找到对某一事物的观点,则可以看作是一个检索任务。

    随着互联网技术的迅速发展和普及,对网络内容管理、监控和有害(或垃圾)信息过滤的需求越来越大,网络信息的主观倾向性分类受到越来越多的关注。这种分类与传统的文本分类不同,传统的文本分类所关注的是文本的客观内容(objective),而倾向性分类所研究的对象是文本的“主观因素”,即作者所表达出来的主观倾向性,分类的结果是对于一个特定的文本要得到它是否支持某种观点的信息。这种独特的文本分类任务又称为情感分类

    情感分类

    情感分类是指根据文本所表达的含义和情感信息将文本划分成褒扬的或贬义的两种或几种类型,是对文本作者倾向性和观点、态度的划分,因此有时也称倾向性分析(opinion analysis)。

    情感分类作为一种特殊的分类问题,既有一般模式分类的共性问题,也有其特殊性,如情感信息表达的隐蔽性、多义性和极性不明显等。

    针对这些问题人们做了大量研究,提出了很多分类方法。这些方法可以按机器学习方法归类,也可以按情感文本的特点划分。

    1.按机器学习方法分类

    根据机器学习方法所使用训练样本的标注情况,情感文本分类可以大致分为有监督学习方法、半监督学习方法和无监督学习方法三类。

    有监督学习方法:基于有监督学习的情感分类方法使用机器学习方法用于训练大量标注样本。
    2002首次将有监督的学习方法应用到情感分类中,文献中分别比较了多种分类算法以及各种特征和特征权值选择策略在基于监督学习的情感分类中的效果。2004将主观句摘要引入情感分类中;2010分析了极性转移对情感分类的影响;2011使用基于特征空间及分类算法的集成学习方法有效地提高了情感分类的性能。

    半监督学习方法:基于半监督学习的情感分类方法是通过在少量标注样本上训练,并在大量未标注样本上进行学习的方式构建分类模型。
    2009将多种机器学习方法(例如:聚类方法、集成学习等)融入基于半监督学习的情感分类中;面对情感分类中汉语标注语料匮乏的问题,2009采用协同学习方法使用标注的英文语料和无标注的中文语料实现了高性能的中文情感分类。2010将情感文本的表达分为个人的和非个人的两种视图,应用协同学习进行情感分类的半监督学习。

    无监督学习方法:基于无监督学习的情感分类方法是指仅使用非标注样本进行情感分类建模。
    以往的大部分研究工作都是通过情感分类标注的种子词集来实现无监督分类,2002通过计算文本中候选单词与种子情感词之间的点互信息来计算文本的情感倾向性,选择“excellent”和“poor”作为种子词,在得到每个单词与种子词之间的点互信息后,根据SO-PMI计算每个词的情感倾向性,并通过词语计数的方式计算文本的整体情感倾向性。2006通过基于HowNet的语义分析抽取单词的情感信息。2009根据样本空间中文档与单词的共现关系,基于潜在狄利克雷分布(latent Dirichlet allocation,LDA)的浅层语义分析方法获取未标注样本的标签。

    2.按研究问题分类

    根据情感文本分类中侧重关注的问题,可以将情感分类研究划分为领域相关性研究和数据不平衡问题研究两类。

    领域相关性研究:情感分类是一个领域相关(domain-specific)的问题,当训练集和测试集属于不同的领域时,基于监督学习的情感分类方法通常会表现出较差的效果。因此,领域适应性(domain adaptation)研究成为一个重要课题,其目的就是尽量使情感分类器在跨领域学习时保持一定的分类性能。

    2005针对领域适应中的特征选择、分类器融合和训练集的组合等问题做了详细分析。2007提出了一种基于结构共现学习(structural correspondence learning,SCL)的情感分类领域适应方法,在跨领域情感分类中取得了较好的性能。2010利用基于图模型的Graph-Ranking算法处理中文情感分类中的领域适应问题。2011将集成学习方法应用于“多领域”情感分类,让多个领域的资源互相帮助,从而使整体的情感分类性能获得提升。

    数据不平衡问题研究:情感分类往往牵涉样本的正负类别分布不平衡的问题。

    Li et al.(2011b)对实际情况中的样本不平衡问题做了深入分析。假设在情感分类中有N个样本的训练数据,其中包含N+个正类样本和N-个负类样本。目前大多数研究总是假设正类样本数和负类样本数是平衡的,即N+=N-,但实际情况并非如此,更一般的情况是训练数据中一类样本要远远多于另一类样本。

    针对不平衡数据的有监督情感分类问题,Li et al.(2011c)提出了一种基于中心向量的不平衡情感分类方法。
    该方法包括以下几个步骤对不平衡数据的标注样本进行训练:
    ①将“多类”里面的所有训练样本进行聚类;
    ②在各个聚类里面进行内部层次采样,获得同“少类”相同规模的样本;
    ③使用这些采样样本并结合整个类的中心向量构建的新向量进行训练学习。该方法借鉴中心向量充分利用“多类”里面所有样本的分类信息,获得了比其他传统采样方法或者代价敏感方法更优的分类性能。

    针对不平衡数据的半监督情感分类问题,Li et al.(2011b)提出了一种基于协同学习的半监督学习方法。
    该方法有如下两个特点:
    ①使用欠采样技术对训练样本进行平衡采样,用于构建多个欠采样分类器,利用多个分类器对非标注样本进行标注;
    ②采用动态特征子空间的方式,即每次迭代重新生产特征子空间,增加多分类器之间的差异性,进一步提升协同学习的性能。
    实验结果表明,该方法在处理情感分类的数据不平衡问题上,能够利用非标注样本提高分类性能。另外,该工作的一个贡献是首次提出了一种针对不平衡数据分类的半监督学习方法。

    针对不平衡数据的情感分类中的主动学习问题,Li et al.(2012b)提出了一种集成确定性和不确定性样本选择策略的方法,用于主动选择不平衡数据中信息量大的样本以提高分类性能。其中,确定性和不确定性分布由两个分开的特征子空间进行控制,不确定性用于选择信息量大的样本,确定性用于选择尽量平衡的数据。此外,对于确定性判断出来的“多类”非标注样本进行自动标注,进一步降低样本的标注规模。实验证明,在同样的标注情况下该方法能够大幅度提高不平衡数据的分类性能。

     

    展开全文
  • 针对传统机器学习的情感分类方法存在长距离依赖问题与深度学习存在忽略情感词库的弊端,提出了一种基于注意力机制与双向长短记忆网络和卷积神经网络模型相结合的维吾尔文情感分类方法。将特征拼接向量作为双向长短...
  • 传统情感分类方法与深度学习的情感分类方法对比

    万次阅读 多人点赞 2018-11-10 16:57:16
    标注:本博客是参考论文《传统情感分类方法与机遇深度学习的情感分类方法对比分析》写的,作者段传明。 情感分类是自然语言处理的重要分支,传统情感分类主要有基于情感词典的和基于机器学习的,最新的方法是基于...

    标注:本博客是参考论文有《传统情感分类方法与机遇深度学习的情感分类方法对比分析》、《自然语言处理中的深度学习:方法及应用》

    情感分类是自然语言处理的重要分支,传统情感分类主要有基于情感词典的和基于机器学习的,最新的方法是基于深度学习的。

    1、基于情感词典的方法

    缺点:受限于情感词典的质量和覆盖度。
    定义:是对人脑的简单模拟,核心模式是基于词典和规则,即以情感词典作为判断评论情感极性的主要依据,根据以往经验对现有词汇做出评价的一种模型,eg1:通常把讨厌、糟糕作为消极词,把高兴。快乐作为积极词,通过句子中出现的情感词,预测该句子的情感极性。
    依赖于:情感词典的构建和判断规则质量,而两者都需要耗费很多人力,包括人工设计和先验知识。
    在这里插入图片描述

    2、基于机器学习

    核心:模型训练
    缺点:模型训练依赖于标注数据集的质量,高质量的数据集需要投入大量人工成本。需要高质量的特征构造和选取。
    常用特征有:N-gram特征、句法特征等。
    在这里插入图片描述

    3、基于深度学习模型


    1. 定义:

      深度学习是基于特征自学习和深度神经网络(DNN)的一系列机器学习算法的总称。目前深度学习的研究有了长足发展,在传统特征选择与提取框架上取得巨大突破,在自然语言处理、生物医学分析、遥感影像解译等诸多领域产生越来越重要影响,并在计算机视觉和语音识别领域取得革命性突破。

    2. NLP研究任务包括

      词性标注、机器翻译、命名实体识别、机器问答、情感分析、自动文摘、句法分析和共指消解等。

    3. 深度学习应用在NLP领域原因:
      文本间的关系难以度量,相关研究高度依赖人工构建特征。而深度学习方法的优势恰恰在于其请打的判别能力和特征自学习能力,非常适合高维数、无标签和大数据的特点。

    4. 不使用传统神经网络原因

      传统神经网络无法处理前后关联问题,而深度学习模型RNN解决了该问题。随着距离和先验知识的增加,RNN会出现梯度消失或梯度爆炸情况,因此无法解决长久依赖问题。而LSTM通过三个门结构控制细胞cell,解决上述问题。

    5. 深度学习优点:

      基于深度学习抽象特征,可避免人工提取特征的工作,且通过Word2Vec技术模拟词语之间联系,有局部特征抽象画以及记忆功能,在情感分类中具有极大优势。

    6. 现有深度学习方法主要分为两个步骤:

      • 将需要分类的评论语料表达为语义词向量(Word Embedding);
      • 通过不同语义合成方法用词向量得到所对应句子或文档的特征表达式,最后通过深度神经网络进行分类。

    在这里插入图片描述

    3.1 语义词向量表达

    在自然语言处理中,很重要的一个问题是如何将一个句子用向量表示。词向量通常是指通过语言模型学习到的词的分布式特征表示,也被称为词编码。可以非稀疏的表示大规模语料中复杂的上下文信息。

    BOW(Bag of Words)。

    传统文档表示方法是基于词袋模型。
    BOW核心思想:忽略文本中的次序和语法、句法,仅看成这些词汇的排列组合,且文本中的词汇没有任何关系。
    缺点:

    1. 极高维度:文本向量的维数与训练数据集中出现的所有单词数一样多,且若某一词汇在训练集中未出现过,则会忽视这个词,在测试集中无法成为该文本特征。
    2. 向量极度稀疏
    3. 认为词语之间无关系,很难表示一个句子或一篇短文的语义,
    4. 不同语境下,词袋法很难区分一个词的意义。

    Word2Vec

    该模型由Mikolov等人提出,核心思想是通过高维向量表示词语,相近词语放在相近位置,因此Word2Vec适合处理序列数据,因为序列局部间的数据存在很大关联。通过Word2Vec可训练语料库模型,获得词向量,且词向量的高维性解决了词语多方向发散问题,从而保证模型的稳定性。
    有两种模型:(1)CBOW:通过上下文预测当前词
    (2)Skip-gram:通过当前次预测上下文。

    3.2句子向量

    通过不同语义合成(Semantic Composition)方法用词向量得到所对应句子或文档的特征表达,语义词向量就是利用原始词向量合成更高层次的文本特征向量。

    3.3深度学习模型

    • 循环神经网络和长短记忆神经网络

      循环神经网络(Recurrent neural networks,RNN)是隐藏层和自身存在连接的一类神经网络。相较于前馈神经网络,RNN可将本次隐藏层的结果用于下次隐藏层的计算,因此可以用来处理时间序列问题,比如文本生成【28】、机器翻译【29】和语音识别【30】,RNN的优化算法为BPTT算法(backpropagation through time)【31】,由于梯度消失的原因,RNN的反馈误差往往只能向后传递5-10层,因此文献【32】在RNN的基础上提出来长短记忆神经网络(long-short term memory,LSTM).LSTM使用Celljiegou 记忆之前的输入,使得网络可以学习到合适的时机重置Cell结构。

    • 卷积神经网络(Convolutional neural networks,CNN)

      CNN由文献【40】提出并由文献【41】改进的深度神经网络。在一般前馈神经网络中,输入层和隐藏层之间采用全连接结构,而在CNN中每一个卷积层节点只与一个固定大小的区域有连接,连接的权重矩阵称为卷积核。池化(pooling)是CNN所采用的另一个关键技术,在固定大小的区域使用平均值或最大值代替原有的矩阵区域,既减少了特征数目又增加了网络的鲁棒性。
      目前CNN在NLP领域的应有有许多新的尝试。文献【6】将CNN用于语义角色标注,文献【42】使用字符作为语义特征,采用大规模文本语料训练CNN迷行用于本体分类、情感分析和文本分类。

    4 基于情感词典、机器学习、深度学习在情感分类中对比

    在这里插入图片描述

    5深度学习瓶颈

    目前深度学习的理论依据还处于起步阶段,大部分的研究成果都是经验性的,没有足够的理论来指导实验,研究者无法确定网络架构。超参数设置是否已是最优组合。除此之外,目前仍没有一种通用的神经网络或学习策略可以适用于大多数的应用任务,因此深度学习领域的研究者正在不断尝试新的网络架构和学习策略,以提升网络的泛化能力。
    目前深度学习用于NLP领域的主要步骤可以归结为如下3 步:

    • 将原始文本作为输入,自学习得到文本特征的分布表示。
    • 将分布式向量特征作为深度神经网络的输入。
    • 针对不同的应用需求,使用不同的深度学习模型,有监督的训练网络权重。
    展开全文
  • LSTM情感分类

    千次阅读 2018-07-18 11:30:50
    这篇博客我主要介绍一情感分类的问题,比如我们拿到电影的影评,我们能快速区分是pos,还是neg,本文采用LSTM的网络框架,主要针对英文的评论进行分析。本文的代码,我是借鉴GitHub上的代码,这是我修改后的代码,可以...

    这篇博客我主要介绍一情感分类的问题,比如我们拿到电影的影评,我们能快速区分是pos,还是neg,本文采用LSTM的网络框架,主要针对英文的评论进行分析。本文的代码,我是借鉴GitHub上的代码,这是我修改后的代码,可以直接用Python IDE跑起来,本文需要结合代码,博客更好的理解。

    1.预处理

    首先,我们先导入数据,在这里我们使用训练好的Glove,选用的是50维的向量,方便我们在自己的电脑上复现结果,那么我们拿到Glove矩阵之后,我们需要对我们的数据进行匹配,得到ID_Matrix,比方说:

    import tensorflow as tf
    maxSeqLength = 10 #Maximum length of sentence
    numDimensions = 300 #Dimensions for each word vector
    firstSentence = np.zeros((maxSeqLength), dtype='int32')
    # print(firstSentence.shape)
    firstSentence[0] = wordsList.index("i")
    firstSentence[1] = wordsList.index("thought")
    firstSentence[2] = wordsList.index("the")
    firstSentence[3] = wordsList.index("movie")
    firstSentence[4] = wordsList.index("was")
    firstSentence[5] = wordsList.index("incredible")
    firstSentence[6] = wordsList.index("and")
    firstSentence[7] = wordsList.index("inspiring")
    #firstSentence[8] and firstSentence[9] are going to be 0
    print(firstSentence) #Shows the row index for each word
    [    41    804 201534   1005     15   7446      5  13767      0      0]

    有了ID_Matrix,Glove向量矩阵,我们就导入我们的输入数据,根据输入数据单词,找到ID,找出序列向量(Sequence Vector)

    在这里我们需要注意的是,我输入数据前我们需要对其预处理,因为数据当中包含一些特殊符号之类的,比如这一段话:

     

    This film had a lot of promise, and the plot was relatively interesting, however the actors, director and editors seriously let this film down.<br /><br />I feel bad for the writers, it could have been good. The acting is wooden, very few of the characters are believable.<br /><br />Who ever edited this clearly just learnt some new edit techniques and wanted to splash them all over the film. There are lots of quick 'flashy' edits in almost every scene, which are clearly meant to be symbolic but just end up as annoying.<br /><br />I wanted to like this film and expected there to be a decent resolution to the breakdown of equilibrium but alas no, it left me feeling like I'd wasted my time and the film makers had wasted their money.
    import re
    strip_special_chars = re.compile("[^A-Za-z0-9 ]+")
    
    def cleanSentences(string):
        string = string.lower().replace("<br />", " ")
        return re.sub(strip_special_chars, "", string.lower())
    firstFile = np.zeros((maxSeqLength), dtype='int32')
    with open(fname) as f:
        indexCounter = 0
        line=f.readline()
        cleanedLine = cleanSentences(line)
        print(cleanedLine)
        split = cleanedLine.split()
        for word in split:
            if indexCounter < maxSeqLength:
                try:
                    firstFile[indexCounter] = wordsList.index(word)
                except ValueError:
                    firstFile[indexCounter] = 399999 #Vector for unknown words
            indexCounter = indexCounter + 1

    里面有<br />,其次我们在输入数据前还要确定一下SeqMaxLength,因为我们输入向量的时候必须要长度一致,否则不好进行比如矩阵相加的运算等,我们在这里设置SeqMaxLength=250

    还有要生成batch,这里我们令batch_size = 24,生成测试集的batch代码:

    def getTrainBatch():
        labels = []
        arr = np.zeros([batchSize, maxSeqLength])
        for i in range(batchSize):
            if (i % 2 == 0): 
                num = randint(1,11499)
                labels.append([1,0])
            else:
                num = randint(13499,24999)
                labels.append([0,1])
            arr[i] = ids[num-1:num]
        return arr, labels

    2.LSTM建模

    做完上面的预处理之后,我们就可以对其建模,其中也包括保存模型

    import tensorflow as tf
    tf.reset_default_graph()
    
    labels = tf.placeholder(tf.float32,[batchSize,numClasses])
    input_data = tf.placeholder(tf.int32,[batchSize,maxSeqLength])
    
    data = tf.Variable(tf.zeros([batchSize, maxSeqLength, numDimensions]),dtype=tf.float32)
    data = tf.nn.embedding_lookup(wordVectors,input_data)
    
    lstmCell = tf.contrib.rnn.BasicLSTMCell(lstmUnits)
    lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell,output_keep_prob = 0.75)
    value,_ = tf.nn.dynamic_rnn(lstmCell,data,dtype=tf.float32)
    
    weight = tf.Variable(tf.truncated_normal([lstmUnits,numClasses]))
    bias = tf.Variable(tf.constant(0.1,shape=[numClasses]))
    value = tf.transpose(value,[1,0,2])
    
    last = tf.gather(value,int(value.get_shape()[0]-1))
    
    prediction = (tf.matmul(last,weight)+bias)
    
    correctPred = tf.equal(tf.arg_max(prediction,1),tf.arg_max(labels,1))
    accuracy = tf.reduce_mean(tf.cast(correctPred,tf.float32))
    
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=labels))
    optimizer = tf.train.AdamOptimizer().minimize(loss)
    保存模型
    sess = tf.InteractiveSession()
    saver = tf.train.Saver()
    sess.run(tf.global_variables_initializer())
    for i in range(iterations):
       #Next Batch of reviews
        nextBatch, nextBatchLabels = getTrainBatch()
        sess.run(optimizer, {input_data: nextBatch, labels: nextBatchLabels})
    
        if (i % 1000 == 0 and i != 0):
            save_path = saver.save(sess, "models/pretrained_lstm.ckpt", global_step=i)
            print("saved to %s" % save_path)

     3.测试

    接下来测试,我们可以输入一句话进行测试,判断是pos还是neg

    import tensorflow as tf
    tf.reset_default_graph()
    
    labels = tf.placeholder(tf.float32, [batchSize, numClasses])
    input_data = tf.placeholder(tf.int32, [batchSize, maxSeqLength])
    
    data = tf.Variable(tf.zeros([batchSize, maxSeqLength, numDimensions]),dtype=tf.float32)
    data = tf.nn.embedding_lookup(wordVectors,input_data)
    
    lstmCell = tf.contrib.rnn.BasicLSTMCell(lstmUnits)
    lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell, output_keep_prob=0.25)
    value, _ = tf.nn.dynamic_rnn(lstmCell, data, dtype=tf.float32)
    
    weight = tf.Variable(tf.truncated_normal([lstmUnits, numClasses]))
    bias = tf.Variable(tf.constant(0.1, shape=[numClasses]))
    value = tf.transpose(value, [1, 0, 2])
    last = tf.gather(value, int(value.get_shape()[0]) - 1)
    prediction = (tf.matmul(last, weight) + bias)
    
    correctPred = tf.equal(tf.argmax(prediction,1), tf.argmax(labels,1))
    accuracy = tf.reduce_mean(tf.cast(correctPred, tf.float32))
    print("completely!")
    
    
    sess = tf.InteractiveSession()
    saver = tf.train.Saver()
    saver.restore(sess, tf.train.latest_checkpoint('./models'))
    
    # Removes punctuation, parentheses, question marks, etc., and leaves only alphanumeric characters
    
    inputText = "That movie was terrible."
    inputMatrix = getSentenceMatrix(inputText)
    
    predictedSentiment = sess.run(prediction, {input_data: inputMatrix})[0]
    # predictedSentiment[0] represents output score for positive sentiment
    # predictedSentiment[1] represents output score for negative sentiment
    
    if (predictedSentiment[0] > predictedSentiment[1]):
        print ("Positive Sentiment")
    else:
        print ("Negative Sentiment")
    
    secondInputText = "That movie was the best one I have ever seen."
    secondInputMatrix = getSentenceMatrix(secondInputText)
    predictedSentiment = sess.run(prediction, {input_data: secondInputMatrix})[0]
    if (predictedSentiment[0] > predictedSentiment[1]):
        print("Positive Sentiment")
    else:
        print ("Negative Sentiment")

     

     

     

    展开全文
  • 情感分类 情感分类情感分类的项目。(以Yelp审查为输入) 资料资源 什么是新的 3.1 探索其他数字特征(而不是仅文本) 利用“有用”信息(由yelp提供的属性)进行weighted samples实验 使用“均值”处理缺失值 ...
  • 文本情感分类

    千次阅读 2017-06-27 19:14:32
    电影文本情感分类 Github地址 Kaggle地址 这个任务主要是对电影评论文本进行情感分类,主要分为正面评论和负面评论,所以是一个二分类问题,二分类模型我们可以选取一些常见的模型比如贝叶斯、逻辑回归等,...

    电影文本情感分类

    Github地址
    Kaggle地址

    这个任务主要是对电影评论文本进行情感分类,主要分为正面评论和负面评论,所以是一个二分类问题,二分类模型我们可以选取一些常见的模型比如贝叶斯、逻辑回归等,这里挑战之一是文本内容的向量化,因此,我们首先尝试基于TF-IDF的向量化方法,然后尝试word2vec。

    # -*- coding: UTF-8 -*-
    import pandas as pd
    import numpy as np
    import re
    from bs4 import BeautifulSoup
    
    def review_to_wordlist(review):
        '''
        把IMDB的评论转成词序列
        参考:http://blog.csdn.net/longxinchen_ml/article/details/50629613
        '''
        # 去掉HTML标签,拿到内容
        review_text = BeautifulSoup(review, "html.parser").get_text()
        # 用正则表达式取出符合规范的部分
        review_text = re.sub("[^a-zA-Z]"," ", review_text)
        # 小写化所有的词,并转成词list
        words = review_text.lower().split()
        # 返回words
        return words

    载入数据集

    # 载入数据集
    train = pd.read_csv('/Users/frank/Documents/workspace/kaggle/dataset/Bag_of_Words_Meets_Bags_of_Popcorn/labeledTrainData.tsv', header=0, delimiter="\t", quoting=3)
    test = pd.read_csv('/Users/frank/Documents/workspace/kaggle/dataset/Bag_of_Words_Meets_Bags_of_Popcorn/testData.tsv', header=0, delimiter="\t", quoting=3)
    print train.head()
    print test.head()
             id  sentiment                                             review
    0  "5814_8"          1  "With all this stuff going down at the moment ...
    1  "2381_9"          1  "\"The Classic War of the Worlds\" by Timothy ...
    2  "7759_3"          0  "The film starts with a manager (Nicholas Bell...
    3  "3630_4"          0  "It must be assumed that those who praised thi...
    4  "9495_8"          1  "Superbly trashy and wondrously unpretentious ...
               id                                             review
    0  "12311_10"  "Naturally in a film who's main themes are of ...
    1    "8348_2"  "This movie is a disaster within a disaster fi...
    2    "5828_4"  "All in all, this is a movie for kids. We saw ...
    3    "7186_2"  "Afraid of the Dark left me with the impressio...
    4   "12128_7"  "A very accurate depiction of small time mob l...

    预处理数据

    # 预处理数据
    label = train['sentiment']
    train_data = []
    for i in range(len(train['review'])):
        train_data.append(' '.join(review_to_wordlist(train['review'][i])))
    test_data = []
    for i in range(len(test['review'])):
        test_data.append(' '.join(review_to_wordlist(test['review'][i])))
    
    # 预览数据
    print train_data[0], '\n'
    print test_data[0]
    with all this stuff going down at the moment with mj i ve started listening to his music watching the odd documentary here and there watched the wiz and watched moonwalker again maybe i just want to get a certain insight into this guy who i thought was really cool in the eighties just to maybe make up my mind whether he is guilty or innocent moonwalker is part biography part feature film which i remember going to see at the cinema when it was originally released some of it has subtle messages about mj s feeling towards the press and also the obvious message of drugs are bad m kay visually impressive but of course this is all about michael jackson so unless you remotely like mj in anyway then you are going to hate this and find it boring some may call mj an egotist for consenting to the making of this movie but mj and most of his fans would say that he made it for the fans which if true is really nice of him the actual feature film bit when it finally starts is only on for minutes or so excluding the smooth criminal sequence and joe pesci is convincing as a psychopathic all powerful drug lord why he wants mj dead so bad is beyond me because mj overheard his plans nah joe pesci s character ranted that he wanted people to know it is he who is supplying drugs etc so i dunno maybe he just hates mj s music lots of cool things in this like mj turning into a car and a robot and the whole speed demon sequence also the director must have had the patience of a saint when it came to filming the kiddy bad sequence as usually directors hate working with one kid let alone a whole bunch of them performing a complex dance scene bottom line this movie is for people who like mj on one level or another which i think is most people if not then stay away it does try and give off a wholesome message and ironically mj s bestest buddy in this movie is a girl michael jackson is truly one of the most talented people ever to grace this planet but is he guilty well with all the attention i ve gave this subject hmmm well i don t know because people can be different behind closed doors i know this for a fact he is either an extremely nice but stupid guy or one of the most sickest liars i hope he is not the latter
    
    naturally in a film who s main themes are of mortality nostalgia and loss of innocence it is perhaps not surprising that it is rated more highly by older viewers than younger ones however there is a craftsmanship and completeness to the film which anyone can enjoy the pace is steady and constant the characters full and engaging the relationships and interactions natural showing that you do not need floods of tears to show emotion screams to show fear shouting to show dispute or violence to show anger naturally joyce s short story lends the film a ready made structure as perfect as a polished diamond but the small changes huston makes such as the inclusion of the poem fit in neatly it is truly a masterpiece of tact subtlety and overwhelming beauty

    特征处理

    直接丢给计算机这些词文本,计算机是无法计算的,因此我们需要把文本转换为向量,有几种常见的文本向量处理方法,比如:

    1. 单词计数
    2. TF-IDF向量
    3. Word2vec向量
      我们先使用TF-IDF来试一下。
    from sklearn.feature_extraction.text import TfidfVectorizer as TFIDF
    # 参考:http://blog.csdn.net/longxinchen_ml/article/details/50629613
    tfidf = TFIDF(min_df=2, # 最小支持度为2
               max_features=None,
               strip_accents='unicode',
               analyzer='word',
               token_pattern=r'\w{1,}',
               ngram_range=(1, 3),  # 二元文法模型
               use_idf=1,
               smooth_idf=1,
               sublinear_tf=1,
               stop_words = 'english') # 去掉英文停用词
    
    # 合并训练和测试集以便进行TFIDF向量化操作
    data_all = train_data + test_data
    len_train = len(train_data)
    
    tfidf.fit(data_all)
    data_all = tfidf.transform(data_all)
    # 恢复成训练集和测试集部分
    train_x = data_all[:len_train]
    test_x = data_all[len_train:]
    print 'TF-IDF处理结束.'
    TF-IDF处理结束.

    朴素贝叶斯训练

    from sklearn.naive_bayes import MultinomialNB as MNB
    
    model_NB = MNB()
    model_NB.fit(train_x, label)
    MNB(alpha=1.0, class_prior=None, fit_prior=True)
    
    from sklearn.cross_validation import cross_val_score
    import numpy as np
    
    print "多项式贝叶斯分类器10折交叉验证得分: ", np.mean(cross_val_score(model_NB, train_x, label, cv=10, scoring='roc_auc'))
    多项式贝叶斯分类器10折交叉验证得分:  0.94983968
    test_predicted = np.array(model_NB.predict(test_x))
    print '保存结果...'
    nb_output = pd.DataFrame(data=test_predicted, columns=['sentiment'])
    nb_output['id'] = test['id']
    nb_output = nb_output[['id', 'sentiment']]
    nb_output.to_csv('nb_output.csv', index=False)
    print '结束.'
    保存结果...
    结束.
    1. 提交最终的结果到kaggle,AUC为:0.85728,排名300左右,50%的水平
    2. ngram_range = 3, 三元文法,AUC为0.85924

    逻辑回归

    from sklearn.linear_model import LogisticRegression as LR
    from sklearn.grid_search import GridSearchCV
    
    # 设定grid search的参数
    grid_values = {'C':[30]}  
    # 设定打分为roc_auc
    model_LR = GridSearchCV(LR(penalty = 'L2', dual = True, random_state = 0), grid_values, scoring = 'roc_auc', cv = 20)
    model_LR.fit(train_x, label)
    # 20折交叉验证
    GridSearchCV(cv=20, estimator=LR(C=1.0, class_weight=None, dual=True,
                 fit_intercept=True, intercept_scaling=1, penalty='L2', random_state=0, tol=0.0001),
            fit_params={}, iid=True, n_jobs=1,
            param_grid={'C': [30]}, pre_dispatch='2*n_jobs', refit=True,
            scoring='roc_auc', verbose=0)
    #输出结果
    print model_LR.grid_scores_
    [mean: 0.96497, std: 0.00476, params: {'C': 30}]
    test_predicted = np.array(model_LR.predict(test_x))
    print '保存结果...'
    lr_output = pd.DataFrame(data=test_predicted, columns=['sentiment'])
    lr_output['id'] = test['id']
    lr_output = lr_output[['id', 'sentiment']]
    lr_output.to_csv('lr_output.csv', index=False)
    print '结束.'
    保存结果...
    结束.
    1. 提交最终的结果到kaggle,AUC为:0.88956,排名260左右,比之前贝叶斯模型有所提高
    2. 三元文法,AUC为0.89076

    Word2vec

    神经网络语言模型L = SUM[log(p(w|contect(w))],即在w的上下文下计算当前词w的概率,由公式可以看到,我们的核心是计算p(w|contect(w), Word2vec给出了构造这个概率的一个方法。

    import gensim
    import nltk
    from nltk.corpus import stopwords
    
    tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
    
    def review_to_wordlist( review, remove_stopwords=False ):
        review_text = BeautifulSoup(review, "html.parser").get_text()
        review_text = re.sub("[^a-zA-Z]"," ", review_text)
    
        words = review_text.lower().split()
    
        if remove_stopwords:
            stops = set(stopwords.words("english"))
            words = [w for w in words if not w in stops]
    
        return(words)
    
    def review_to_sentences( review, tokenizer, remove_stopwords=False ):
        '''
        将评论段落转换为句子,返回句子列表,每个句子由一堆词组成
        '''
        raw_sentences = tokenizer.tokenize(review.strip().decode('utf8'))
    
        sentences = []
        for raw_sentence in raw_sentences:
            if len(raw_sentence) > 0:
                # 获取句子中的词列表
                sentences.append( review_to_wordlist( raw_sentence, remove_stopwords ))
        return sentences
    sentences = []
    for i, review in enumerate(train["review"]):
        sentences += review_to_sentences(review, tokenizer)
    unlabeled_train = pd.read_csv("/Users/frank/Documents/workspace/kaggle/dataset/Bag_of_Words_Meets_Bags_of_Popcorn/unlabeledTrainData.tsv", header=0, delimiter="\t", quoting=3 )
    for review in unlabeled_train["review"]:
        sentences += review_to_sentences(review, tokenizer)
    print '预处理unlabeled_train data...'
    print len(train_data)
    print len(sentences)
        预处理unlabeled_train data...
        25000
        795538

    构建word2vec模型

    import time
    from gensim.models import Word2Vec
    # 模型参数
    num_features = 300    # Word vector dimensionality                      
    min_word_count = 40   # Minimum word count                        
    num_workers = 4       # Number of threads to run in parallel
    context = 10          # Context window size                                                                                    
    downsampling = 1e-3   # Downsample setting for frequent words
    %%time
    # 训练模型
    print("训练模型中...")
    model = Word2Vec(sentences, workers=num_workers, \
                size=num_features, min_count = min_word_count, \
                window = context, sample = downsampling)
    训练模型中...
    CPU times: user 6min 16s, sys: 8.34 s, total: 6min 24s
    Wall time: 2min 27s
    print '保存模型...'
    model.init_sims(replace=True)
    model_name = "300features_40minwords_10context"
    model.save(model_name)
    保存模型...

    预览模型

    model.doesnt_match("man woman child kitchen".split())
    'kitchen'
    model.doesnt_match("france england germany berlin".split())
    'berlin'
    model.doesnt_match("paris berlin london austria".split())
    'london'
    model.most_similar("man")
    [(u'woman', 0.6246455907821655),
     (u'lady', 0.6008599400520325),
     (u'lad', 0.5698915719985962),
     (u'businessman', 0.5431989431381226),
     (u'chap', 0.53116375207901),
     (u'monk', 0.5250570774078369),
     (u'men', 0.5177899599075317),
     (u'guy', 0.517480731010437),
     (u'farmer', 0.5114585757255554),
     (u'person', 0.5109285116195679)]
    model.most_similar("queen")
    [(u'princess', 0.6759523153305054),
     (u'bride', 0.6207793951034546),
     (u'belle', 0.6001157760620117),
     (u'shearer', 0.5995810031890869),
     (u'stepmother', 0.596365749835968),
     (u'victoria', 0.5917614698410034),
     (u'dame', 0.589063286781311),
     (u'latifah', 0.5790275931358337),
     (u'countess', 0.5776904821395874),
     (u'widow', 0.5727116465568542)]
    model.most_similar("awful")
    [(u'terrible', 0.7642339468002319),
     (u'atrocious', 0.7405279874801636),
     (u'horrible', 0.7376815676689148),
     (u'abysmal', 0.7010303139686584),
     (u'dreadful', 0.6942194104194641),
     (u'appalling', 0.6887971758842468),
     (u'lousy', 0.6646767854690552),
     (u'horrid', 0.6554058194160461),
     (u'horrendous', 0.6533403992652893),
     (u'amateurish', 0.6079087853431702)]

    使用Word2vec特征

    def makeFeatureVec(words, model, num_features):
        '''
        对段落中的所有词向量进行取平均操作
        '''
        featureVec = np.zeros((num_features,), dtype="float32")
        nwords = 0.
    
        # Index2word包含了词表中的所有词,为了检索速度,保存到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
    
    
    def getAvgFeatureVecs(reviews, model, num_features):
        '''
        给定一个文本列表,每个文本由一个词列表组成,返回每个文本的词向量平均值
        '''
        counter = 0.
    
        reviewFeatureVecs = np.zeros((len(reviews), num_features), dtype="float32")
    
        for review in reviews:
           if counter % 5000. == 0.:
               print("Review %d of %d" % (counter, len(reviews)))
    
           reviewFeatureVecs[counter] = makeFeatureVec(review, model, \
               num_features)
    
           counter = counter + 1.
        return reviewFeatureVecs
    %time trainDataVecs = getAvgFeatureVecs( train_data, model, num_features )
    Review 0 of 25000
    Review 5000 of 25000
    Review 10000 of 25000
    Review 15000 of 25000
    Review 20000 of 25000
    CPU times: user 1min 49s, sys: 1.9 s, total: 1min 51s
    Wall time: 1min 54s
    %time testDataVecs = getAvgFeatureVecs(test_data, model, num_features)
    Review 0 of 25000
    Review 5000 of 25000
    Review 10000 of 25000
    Review 15000 of 25000
    Review 20000 of 25000
    CPU times: user 1min 44s, sys: 1.56 s, total: 1min 46s
    Wall time: 1min 48s

    高斯贝叶斯+Word2vec训练

    from sklearn.naive_bayes import GaussianNB as GNB
    
    model_GNB = GNB()
    model_GNB.fit(trainDataVecs, label)
    
    from sklearn.cross_validation import cross_val_score
    import numpy as np
    
    print "高斯贝叶斯分类器10折交叉验证得分: ", np.mean(cross_val_score(model_GNB, trainDataVecs, label, cv=10, scoring='roc_auc'))
    
    result = forest.predict( testDataVecs )
    
    output = pd.DataFrame( data={"id":test["id"], "sentiment":result} )
    output.to_csv( "gnb_word2vec.csv", index=False, quoting=3 )
    多项式贝叶斯分类器10折交叉验证得分:  0.625579296

    从验证结果来看,没有超过基于TF-IDF多项式贝叶斯模型

    随机森林+Word2vec训练

    from sklearn.ensemble import RandomForestClassifier
    
    forest = RandomForestClassifier( n_estimators = 100, n_jobs=2)
    
    print("Fitting a random forest to labeled training data...")
    %time forest = forest.fit( trainDataVecs, label )
    print "随机森林分类器10折交叉验证得分: ", np.mean(cross_val_score(forest, trainDataVecs, label, cv=10, scoring='roc_auc'))
    
    # 测试集
    result = forest.predict( testDataVecs )
    
    output = pd.DataFrame( data={"id":test["id"], "sentiment":result} )
    output.to_csv( "rf_word2vec.csv", index=False, quoting=3 )
    Fitting a random forest to labeled training data...
    CPU times: user 45 s, sys: 460 ms, total: 45.5 s
    Wall time: 24.2 s
    随机森林分类器10折交叉验证得分:  0.648426368

    改用随机森林之后,效果有提升,但是依然没有超过基于TF-IDF多项式贝叶斯模型

    转自:http://blog.csdn.net/nicholas_liu2017/article/details/73743969


    展开全文
  • 针对上述问题,该文提出了一种基于粒度计算和准则融合的无监督情感分类方法。该方法通过粒度计算,提高现有基于情感词的无监督情感分类精度;同时通过准则融合来减少伪标注数据错误率。在 3 个真实中文数据集上...
  • 中文情感分类一般分成基于情感词典和基于特征分类两种方法进行研究,但没有考虑过将两种方法得到的特征进行融合来提高分类效果。基于特征分类的方法忽视了特征词在情感词典的褒贬性以及词倾向性的强弱。用基于特征...
  • 情感分类文本数据.zip

    2019-11-28 14:48:20
    中文情感分类文本数据,为正负二分类数据,包括pad,水果,洗发水,酒店等评论。每个场景正负样本共1万,共5个场景。同时还包含不分场景的数据6万(不重复)
  • 音乐情感分类

    千次阅读 2018-04-20 09:40:41
    音乐情感分类Thayer模型 Thayer情感模型是二维情感模型 纵坐标表示的是能量维度,从“平静的”到“活力的”变化,反映的是主体的情感活跃程度;横坐标表示的是压力维度。 从“消极”到“积极”的变化,反映了主体...
  • 朴素贝叶斯和情感分类

    千次阅读 2019-08-01 17:05:26
    朴素贝叶斯和情感分类 1 朴素贝叶斯分类器 2 训练朴素贝叶斯分类器 3 例子 4 情感分析优化 5 朴素贝叶斯作为一种语言模型 6 评估指标:精确度,召回率,F-measure 7 测试集和交叉验证 8 特征选择 9 小结 ...
  • 基于BLSTM-MC的代码转换文本多情感分类方法
  • Web文本情感分类研究综述 Web文本情感分类研究综述Web文本情感分类研究综述Web文本情感分类研究综述
  • 基于卷积神经网络的标签中文微博情感分类
  • 使用主题丰富的原型WordEmbeddings改善Twitter情感分类
  • 基于RNN的影评情感分类代码
  • 在本文中,我们介绍了一种用于对短文本进行用户情感分类标签最大熵(MME)模型。 MME通过对个用户共同评分的个情感标签和价进行建模,从而生成丰富的功能。 为了提高该方法在变尺度语料库上的鲁棒性,我们...
  • 传统情感分类方法与基于深度学习的情感分类方法对比分析.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,211
精华内容 13,684
关键字:

多分类情感分类