精华内容
下载资源
问答
  • NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分) 输出结果 1、测试对象 data1= '今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加...

    NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)

     

     

     

     

    目录

    输出结果

    设计思路

    相关资料

    1、关于代码

    2、关于数据集

    关于留言

    1、留言内容的注意事项

    2、如何留言?

    2.1、第一种方法——在对应的博客下留言

    2.2、备用第二种方法——论坛发帖

    后续补充发放资料的说明

    主要部分代码实现


     

     

    输出结果

    1、测试对象
    data1= '今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加幸福!'
    data2= '今天上海天气真差,非常讨厌下雨,把我冻坏了,心情太不高兴了,不高兴,我真的很生气!'
    data3= '美国华裔科学家,祖籍江苏扬州市高邮县,生于上海,斯坦福大学物理系,电子工程系和应用物理系终身教授!'

    2、输出结果
    很明显,data1情感更加积极!data2情感消极!data3情感中等!

    [[240.0, 104.0, 8.3, 3.6, 8.0, 2.4]]
    [[0.0, 134.0, 0.0, 4.8, 0.0, 3.2]]
    [[2, 66, 0.1, 3.3, 0.4, 1.7]]
    [[2, 2, 0.1, 0.1, 0.4, 0.4]]

     

    设计思路

    后期更新……

     

     

    相关资料

    1、关于代码

    NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码
     

    2、关于数据集

    如需数据集,请留言向博主索取。
    :当前为学生身份的网友,可留言向博主索取。非学生身份的社会人士,请靠积分下载!

     

     

    关于留言

    1、留言内容的注意事项

    • 1、请新增评论,不要直接回复,折叠后,我容易看不到,会漏掉。
    • 2、请在前缀加一个索取资料的当天日期。
    • 3、切记要留下邮箱!!!

    比如留言:“20200307,早上10.11,你好,博主,我的邮箱是,我想索取……”

     


    2、如何留言?

    2.1、第一种方法——在对应的博客下留言

    即在本博客下直接留言即可!

     

    2.2、备用第二种方法——论坛发帖

    在我的论坛中发帖即可,我会及时回复。
    地址:https://bbs.csdn.net/topics/395531480

     

     

    后续补充发放资料的说明

    此类网友,太伤人心,这位网友,一定不是大学生,当代大学生的素质肯定比这位网友高的多。

     

    主要部分代码实现

    import jieba
    import numpy as np
    
    ……
    
    
    def sentiment_score_list(dataset):
        seg_sentence = dataset.split('。')
    
        count1 = []
        count2 = []
        for sen in seg_sentence: #循环遍历每一个评论
            segtmp = jieba.lcut(sen, cut_all=False)  #把句子进行分词,以列表的形式返回
            i = 0 #记录扫描到的词的位置
            a = 0 #记录情感词的位置
            poscount = 0 #积极词的第一次分值
            poscount2 = 0 #积极词反转后的分值
            poscount3 = 0 #积极词的最后分值(包括叹号的分值)
            negcount = 0
            negcount2 = 0
            negcount3 = 0
            for word in segtmp:
                if word in posdict:  # 判断词语是否是情感词
                    poscount += 1
                    c = 0
                    for w in segtmp[a:i]:  # 扫描情感词前的程度词
                        if w in mostdict:
                            poscount *= 4.0
                        elif w in verydict:
                            poscount *= 3.0
                        elif w in moredict:
                            poscount *= 2.0
                        elif w in ishdict:
                            poscount *= 0.5
                        elif w in deny_word:
                            c += 1
                    if judgeodd(c) == 'odd':  # 扫描情感词前的否定词数
                        poscount *= -1.0
                        poscount2 += poscount
                        poscount = 0
                        poscount3 = poscount + poscount2 + poscount3
                        poscount2 = 0
                    else:
                        poscount3 = poscount + poscount2 + poscount3
                        poscount = 0
                    a = i + 1  # 情感词的位置变化
    
                elif word in negdict:  # 消极情感的分析,与上面一致
                    negcount += 1
                    d = 0
                    for w in segtmp[a:i]:
                        if w in mostdict:
                            negcount *= 4.0
                        elif w in verydict:
                            negcount *= 3.0
                        elif w in moredict:
                            negcount *= 2.0
                        elif w in ishdict:
                            negcount *= 0.5
                        elif w in degree_word:
                            d += 1
                    if judgeodd(d) == 'odd':
                        negcount *= -1.0
                        negcount2 += negcount
                        negcount = 0
                        negcount3 = negcount + negcount2 + negcount3
                        negcount2 = 0
                    else:
                        negcount3 = negcount + negcount2 + negcount3
                        negcount = 0
                    a = i + 1
                elif word == '!' or word == '!':  ##判断句子是否有感叹号
                    for w2 in segtmp[::-1]:  # 扫描感叹号前的情感词,发现后权值+2,然后退出循环
                        if w2 in posdict or negdict:
                            poscount3 += 2
                            negcount3 += 2
                            break
                i += 1 # 扫描词位置前移
    
    
                # 以下是防止出现负数的情况
                pos_count = 0
                neg_count = 0
                if poscount3 < 0 and negcount3 > 0:
                    neg_count += negcount3 - poscount3
                    pos_count = 0
                elif negcount3 < 0 and poscount3 > 0:
                    pos_count = poscount3 - negcount3
                    neg_count = 0
                elif poscount3 < 0 and negcount3 < 0:
                    neg_count = -poscount3
                    pos_count = -negcount3
                else:
                    pos_count = poscount3
                    neg_count = negcount3
    
                count1.append([pos_count, neg_count])
            count2.append(count1)
            count1 = []
    
        return count2
    
    def sentiment_score(senti_score_list):
        score = []
        for review in senti_score_list:
            score_array = np.array(review)
            Pos = np.sum(score_array[:, 0])
            Neg = np.sum(score_array[:, 1])
            AvgPos = np.mean(score_array[:, 0])
            AvgPos = float('%.1f'%AvgPos)
            AvgNeg = np.mean(score_array[:, 1])
            AvgNeg = float('%.1f'%AvgNeg)
            StdPos = np.std(score_array[:, 0])
            StdPos = float('%.1f'%StdPos)
            StdNeg = np.std(score_array[:, 1])
            StdNeg = float('%.1f'%StdNeg)
            score.append([Pos, Neg, AvgPos, AvgNeg, StdPos, StdNeg])
        return score
    
    
    
    data1= '今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加幸福!'
    data2= '今天上海天气真差,非常讨厌下雨,把我冻坏了,心情太不高兴了,不高兴,我真的很生气!'
    data3= '美国华裔科学家,祖籍江苏扬州市高邮县,生于上海,斯坦福大学物理系,电子工程系和应用物理系终身教授!'
    print(sentiment_score(sentiment_score_list(data1)))
    print(sentiment_score(sentiment_score_list(data2)))
    print(sentiment_score(sentiment_score_list(data3)))

     

    展开全文
  • 文本情感分析

    2013-04-22 17:36:54
    主要讨论了文本情感分析在网购评论文本中的应用前景。结合网购评论文本的特点,分别从网购评论文本情感信息的抽取、分类以及情感信息的检索与归纳三个方面来阐述文本情感分析在网购评论领域的实际应用。其中,网购...
  • 文本情感分析技术

    2017-11-27 13:48:33
    文本情感分析技术 文本情感分析技术 文本情感分析技术
  • python机器学习——文本情感分析(英文文本情感分析)代码下载,代码完整可以运行。希望可以帮助到正在学习的伙伴们。
  • NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码 目录 全部代码 相关文章 NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分) NLP...

    NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码

     

     

    目录

    全部代码


     

    相关文章
    NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)
    NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码

     

    全部代码

    # coding:utf-8
    import jieba
    import numpy as np
    
    
    #打开词典文件,返回列表
    def open_dict(Dict = 'hahah', path=r'data/Textming'):
        path = path + '%s.txt' % Dict
        dictionary = open(path, 'r', encoding='utf-8')
        dict = []
        for word in dictionary:
            word = word.strip('\n')
            dict.append(word)
        return dict
    
    
    
    def judgeodd(num):
        if (num % 2) == 0:
            return 'even'
        else:
            return 'odd'
    
    
    #注意,这里你要修改path路径。
    deny_word = open_dict(Dict = '否定词', path= r'F:/File_Python/Resources/data/Textming/')
    posdict = open_dict(Dict = 'positive', path= r'F:/File_Python/Resources/data/Textming/')
    negdict = open_dict(Dict = 'negative', path= r'F:/File_Python/Resources/data/Textming/')
    
    degree_word = open_dict(Dict = '程度级别词语', path= r'F:/File_Python/Resources/data/Textming/')
    mostdict = degree_word[degree_word.index('extreme')+1 : degree_word.index('very')]#权重4,即在情感词前乘以4
    verydict = degree_word[degree_word.index('very')+1 : degree_word.index('more')]#权重3
    moredict = degree_word[degree_word.index('more')+1 : degree_word.index('ish')]#权重2
    ishdict = degree_word[degree_word.index('ish')+1 : degree_word.index('last')]#权重0.5
    
    
    
    def sentiment_score_list(dataset):
        seg_sentence = dataset.split('。')
    
        count1 = []
        count2 = []
        for sen in seg_sentence: #循环遍历每一个评论
            segtmp = jieba.lcut(sen, cut_all=False)  #把句子进行分词,以列表的形式返回
            i = 0 #记录扫描到的词的位置
            a = 0 #记录情感词的位置
            poscount = 0 #积极词的第一次分值
            poscount2 = 0 #积极词反转后的分值
            poscount3 = 0 #积极词的最后分值(包括叹号的分值)
            negcount = 0
            negcount2 = 0
            negcount3 = 0
            for word in segtmp:
                if word in posdict:  # 判断词语是否是情感词
                    poscount += 1
                    c = 0
                    for w in segtmp[a:i]:  # 扫描情感词前的程度词
                        if w in mostdict:
                            poscount *= 4.0
                        elif w in verydict:
                            poscount *= 3.0
                        elif w in moredict:
                            poscount *= 2.0
                        elif w in ishdict:
                            poscount *= 0.5
                        elif w in deny_word:
                            c += 1
                    if judgeodd(c) == 'odd':  # 扫描情感词前的否定词数
                        poscount *= -1.0
                        poscount2 += poscount
                        poscount = 0
                        poscount3 = poscount + poscount2 + poscount3
                        poscount2 = 0
                    else:
                        poscount3 = poscount + poscount2 + poscount3
                        poscount = 0
                    a = i + 1  # 情感词的位置变化
    
                elif word in negdict:  # 消极情感的分析,与上面一致
                    negcount += 1
                    d = 0
                    for w in segtmp[a:i]:
                        if w in mostdict:
                            negcount *= 4.0
                        elif w in verydict:
                            negcount *= 3.0
                        elif w in moredict:
                            negcount *= 2.0
                        elif w in ishdict:
                            negcount *= 0.5
                        elif w in degree_word:
                            d += 1
                    if judgeodd(d) == 'odd':
                        negcount *= -1.0
                        negcount2 += negcount
                        negcount = 0
                        negcount3 = negcount + negcount2 + negcount3
                        negcount2 = 0
                    else:
                        negcount3 = negcount + negcount2 + negcount3
                        negcount = 0
                    a = i + 1
                elif word == '!' or word == '!':  ##判断句子是否有感叹号
                    for w2 in segtmp[::-1]:  # 扫描感叹号前的情感词,发现后权值+2,然后退出循环
                        if w2 in posdict or negdict:
                            poscount3 += 2
                            negcount3 += 2
                            break
                i += 1 # 扫描词位置前移
    
    
                # 以下是防止出现负数的情况
                pos_count = 0
                neg_count = 0
                if poscount3 < 0 and negcount3 > 0:
                    neg_count += negcount3 - poscount3
                    pos_count = 0
                elif negcount3 < 0 and poscount3 > 0:
                    pos_count = poscount3 - negcount3
                    neg_count = 0
                elif poscount3 < 0 and negcount3 < 0:
                    neg_count = -poscount3
                    pos_count = -negcount3
                else:
                    pos_count = poscount3
                    neg_count = negcount3
    
                count1.append([pos_count, neg_count])
            count2.append(count1)
            count1 = []
    
        return count2
    
    def sentiment_score(senti_score_list):
        score = []
        for review in senti_score_list:
            score_array = np.array(review)
            Pos = np.sum(score_array[:, 0])
            Neg = np.sum(score_array[:, 1])
            AvgPos = np.mean(score_array[:, 0])
            AvgPos = float('%.1f'%AvgPos)
            AvgNeg = np.mean(score_array[:, 1])
            AvgNeg = float('%.1f'%AvgNeg)
            StdPos = np.std(score_array[:, 0])
            StdPos = float('%.1f'%StdPos)
            StdNeg = np.std(score_array[:, 1])
            StdNeg = float('%.1f'%StdNeg)
            score.append([Pos, Neg, AvgPos, AvgNeg, StdPos, StdNeg]) #积极、消极情感值总和(最重要),积极、消极情感均值,积极、消极情感方差。
        return score
    
    def EmotionByScore(data):
        result_list=sentiment_score(sentiment_score_list(data))
        return result_list[0][0],result_list[0][1]
        
    
    
    def JudgingEmotionByScore(Pos, Neg):
        if Pos > Neg:
            str='1'
        elif Pos < Neg:
            str='-1'
        elif Pos == Neg:
            str='0'
        return str
    
    
    
    data1= '今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加幸福!'
    data2= '救命,你是个坏人,救命,你不要碰我,救命,你个大坏蛋!'
    data3= '美国华裔科学家,祖籍江苏扬州市高邮县,生于上海,斯坦福大学物理系,电子工程系和应用物理系终身教授!'
    
    
    print(sentiment_score(sentiment_score_list(data1)))
    print(sentiment_score(sentiment_score_list(data2)))
    print(sentiment_score(sentiment_score_list(data3)))
    
    
    a,b=EmotionByScore(data1)
    
    emotion=JudgingEmotionByScore(a,b)
    print(emotion)

     

    展开全文
  • 文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息。 本文使用python来做文本情感分析
  • Python做文本情感分析之情感极性分析-深度学习文档类资源96c4cc 在 2020-02-04 01:53:00 上传 2.99 MBPython文本情感分析文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别...

    Python做文本情感分析之情感极性分析-深度学习文档类资源

    96c4cc 在 2020-02-04 01:53:00 上传 2.99 MB

    Python

    文本情感分析

    文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息。

    本文使用python来做文本情感分析

    Puno做乂本情分析之感校性分析-闫书

    LOso

    massed

    from collections import defaultdict

    1.文本切剀

    def sent word(senter

    Segment a sentence to words

    Delete stopwords

    segresu1t-「1

    segResult. append(w)

    fcr word in segResult

    在此笔者使用 Jieba进行分词。

    122去除停用词

    遍历所有语料中的所有词语,删除其中的停用词

    e.g.这样)的酒店这样的价格/还算不错

    >酒店配/价格/算不错

    1.3枃建模型

    1.31将词语分类并记录其位置

    将句子中各类词分别存储并标注位置。

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    3/16

    Python做义本情戀分竹之情感性分析-间竹

    2.情感定位

    def classifywords ( wordDict)

    (1)情感词

    dInes( BasonNLP_ sentiment_scare. txt)

    senDict defaultdicto)

    for s in senlis

    senDict[s split()[0]]= s split(")[1]

    #(2)否定词

    netList =readLines("notDict. txt")

    #(3)程戊副词

    degreeList readLines("degreeDict txt")

    degreeDict - defaultdicto

    fcr d in degreelist

    degreeDict[d split(,")[0]l=dsplit(,)[1]

    senWord defaultdicto

    netword defaultdicto

    dcgrccword dcfaultdicto

    for word in wordDict keys()

    if word in senDict keys( and word not in notList and word not in degreeDict keys(

    senWord[wordDict[word]l= senDict[word]

    1if word in notlist and word nat in degreeDict keys

    elif word in degreeDict keys()

    degreeword i wordDict[word]]=degreeDict[word]

    return senwo

    1.32计算句子得分

    在此,简化的情感分数计算逻辑:所有情感词语组的分数之和

    定义一个情感词语组:两情感词之间的所有否定词和程度副词与这两情感词中的后一情

    感词构成—个情感词组,即 methords+ degreewords+ sentiwords,例如不是很交好,其中不

    是为否定词,很为程度副词,交好为情感词,那么议个情感词语组的分数为

    fna1 Sentiscore=(-1)1*1,25*9,74712773968

    其中1指的是—个否定词,1.25是程度副词的数值,θ.7471273958为交的情感分数

    伪代码如下:

    finalsentiscore=(-1)A(num of notWords)* degreeNum sentiScore

    finalScore sum( finalsentiScorc)

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    △1A

    Python做义本情戀分竹之情感性分析-间竹

    情感獒合

    def score sent( senNord, nothord degreeNord, segResult)

    e = a

    存所有情感词的位置的列表

    ≤PnL

    keys)

    notloc =-1

    遍历句中所有单词 segResu1t,i为单词绝对位置

    inge(e, len(segResult)

    如果该词为情感词

    #1oc为情感词位置列表序号

    scnloc 1= 1

    妾冻加该情感词分数

    score +=w* float(senWordrily

    #

    if senloc len(senLoc)-1:

    判断该情感词与下一情感词之间是否有否定词或程度剖词

    为绝对位置

    for j in range( senLoclsenloc], senLoclsenlDc +1):

    #如果有否定词

    if in notloc

    如果有程度副词

    elif j in degreeloc:

    #1定位至下一个情感词

    if senor len (senLoc)-1

    rcturn score

    1.4模型评价

    将600多条朋友圈文本的得分排序后做出散点图

    Sentiment score

    200

    300

    7p0

    Score distribution

    其中大多数文本被判为正向文本符合实际情况,旦绝大多数文本的情感得分的绝对值在

    10以內,这是因为笔者在计算一个文本的情感得分时,以句号作为一句话结束的志

    在一句话内,情感词语组的分数累加,如若一个文本中含有多句话时,则取其所有句子

    情感得分的平均值。

    然而,这个模型的缺点与局限性也非常明显

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    5/16

    Puno做乂本情分析之感校性分析-闫书

    首先,段落的得分是其所有句子得分的平均值,这一方法并不符合实际情况。正如文

    章中先后段落有重要性大小之分,一个段落中前后句子也同样有重要性的差异。

    其次,有一类文本使用贬义词来表示正向意义,这类情况常出现与宣传文本中,还是

    那个例子

    有车一族都用了这个宝贝,后果很严重哦[銜笑][偷笑][偷笑],交警工资汁会打5折,没有超速罚款了[吡牙]

    「牙][呲牙]2,移联邇公司大輕度裁贝,电话费少了[呲牙][呲牙][呲牙13,中石化中石汕裁员2成,路痴不

    再述路,省油[悠闲][終闲][悠闪]5,保险公司裁员2成,保费于1.折2成,全国通用[憨笑][憨笑]憨笑]买不买

    你白己看着办吧L调皮]调砹儿调皮]2989元钎轅魔镜带回家,推"还返利L得意」

    Score distribution中得分小于-16的几个文本都是与这类情况相似,这也许需要深度

    学习的方法才能有效解决这类问题,普通机器学习方法也是很难的

    ·对于正负向文本的判断,该算法忽略了很多其他的否定词、程度副词和情感词搭配的

    情况;用于判断情感強弱也过于简单。

    总之,这一模型只能用做 BENCHMARK

    2基于机器学习的文本情感极性分析

    21还是数据准备

    21.1停用词

    (同1.14)

    21.2正负向语料库

    来源于有关中文情感挖掘的酒店评论语料(htp:/ww. datatang. com/data/11936),其中

    正向7000条,负向3000条(笔者是不是可以认为这个世界还是充满着满满的筜意

    呢…),当然也可以参考情感分析资源(转)

    htt:/ wcnblogs. com/ finesite/p/3381803htm)使用其他语料作为训练集。

    213验证集

    Amazon上对 Phone6s的评论,来源已不可考

    22数据预处理

    2.21还是要分词

    (同12.1)

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    6/16

    Python做义本情戀分竹之情感性分析-间竹

    import codecs

    from skl

    from sklearn, externals import joblib

    trom sklearn preprocessing import scale

    from skI

    from sklearn decomposition import PCA

    ort stat

    from keras models import Sequential

    from keras layers import Dense, Dropout, Activation

    from keras optimizers import SGD

    from sklearn metrics import fl score

    from bayes opt import Bayesianoptimization as Bo

    from sklearn metrics import roc curve, auc

    import matplotlib. pyplot as plt

    def parsesent(sentence)

    seg_ list =jieba cut(sentence)

    ou tpuL

    join(list(seg_list)) use space to join them

    return output

    222也要去除停用词

    (同122)

    2.23训练词向量

    〔重点来了!)模型的输入需是数据元组,那么就需要将毎条数据的词语组合转

    化为一个数值向量

    常见的转化算法有但不仅限于如下几种

    请原谅不知死活的胖子直接用展示的pp截图作说明,没错,我就是懒,你打我呀

    · Bag of Words

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    711A

    Puno做乂本情分析之感校性分析-闫书

    Bag of Words(Bow)

    One-hot Representation

    向量中每个分量表示词典中对应单词在文档中出现的次数

    Bob likes to play basketball, Jim likes too

    Bob also likes to play football games

    构造词典

    Dict=1. Bob, 2- like, 3. to, 4. play, 5 basketball, 6: also, 7. football

    8: games. 9: Jim, 10: too]

    ,2.1110.0.0.1,1

    vec2=[1,1.1,10,1,1,L0.0

    缺陷

    词汇鸿沟”现象:稀疏方式存储,其独立性假设不太符合言文字实际

    分布情况,忽略了单词间的语法和序,无汯了解单词间的关联程度

    解决

    采用 SCPCD抽取整个短语

    采用高阶(2阶以上)统计语言模型,例如 bigram、 trigram等

    Bag of Words

    TF-IDF

    TF-IDF

    如果某个词在一篇文章中出现的频率高,且在其他文章中出现

    频率低,则认为该词具有很好的类别区分能力,赋予更高权重

    TF (Term Frequency)给定词在该文档中出现的次数

    IDF (Inverse Document Frequency):词普這重要性的度量

    缺陷

    单纯以词频作为羊词重要性的度量,对于位置没有敏感性

    解决

    人为添加权重

    例如:第一段和最后一段蹴予更高权重;每段第一句赋予更高权重

    TE-IDE

    ·Word2vec

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    9:1A

    Python做义本情戀分竹之情感性分析-间竹

    Word2Vec

    词向量空间上的相似度可以用来表示文本语义上的相似度,常被

    用于词语聚羹、找同义词、词性分析等

    ny-l

    CGOW 5kip-Gram

    COntinuous Bag of-Words Model) with

    cBoW:根椐上下文词颈位醫t词

    Sskip-Gran:用于预测位首的单词的上下文单词

    P(ww),其中t-c≤i≤P+c且i≠t

    特点

    可讲行向量的加法组合运算 Additive Compos)

    伤如:e(kng)-ve(man)+vec( woman")=vec!quer)

    训练高效

    Word2Vec

    在此笔者选用Word2vec将语料转化成向量,具体步骤可参考笔者的文章问答机器人的

    Python分类器(http://wwwjianshu.com/p/bacb99b6671b)

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    16

    Python做义本情戀分竹之情感性分析-间竹

    def getwordvecs wordList):

    word. replace( ,")

    try

    vecsappend(madel[ word

    return np array(vecs, dtype -"tloat")

    def buildvecs(filename)

    with open(filename, "rb") as txtfile

    tfile

    for lines in txtfile

    lines lines split(

    for line in lines:

    line jicba cut(linc)

    resultList getwordVecs(line)

    for each sentence, the mean vector of all its vectors is used to represent

    esultArray sum(np array (resultList))len(resultList)

    d(resultArray)

    return pcsInput

    load word 2vec format( corpus, model. bin", binary True)

    # textfile-[u"标准问太差房问还不如3的而且设施非常陈旧,建议酒店把老的标准间从改善,,u"这个丙

    posInput buildvecs( pos, txt")

    egInput buildvecs( pos. txt")

    y- np, concatenate((np, ones(len(posInput)), np zeros(len(negInput))))

    for neg in negInput

    x appe

    224标准化

    虽然笔者觉得在这一问题中,标准化对模型的准确率影响不大,当然也可以尝试其他的

    标准化的方法

    t standardization

    X

    225降维

    根据PCA结果,发现前100维能够 cover95%以上的 variance

    10

    httP /A lianshu comin/Acfrf16103737nomohile=ves

    10/1A

    务必Chrome下载

    下载所需:1 积分

    下载次数:1

    我要下载

    展开全文
  • 用于文本情感分析的情感词典集,可以用作电商评论文本分析。
  • 本人机器学习课程的小作业,记录一下,希望可以帮到一些小伙伴。 模型使用的是LSTM+RNN。 代码包括数据处理,模型训练,对新数据做出预测,并将预测...id sentiment review 分别表示:每段文本的唯一ID,情感色彩...

    本人机器学习课程的小作业,记录一下,希望可以帮到一些小伙伴。
    项目介绍,给一段英文文本(英文影评评论)来预测情感是正向还是负向
    模型使用的是LSTM+RNN。
    代码包括数据处理,模型训练,对新数据做出预测,并将预测结果(正向情感)保存到result.txt中
    软件:anaconda3

    代码下载链接:下载链接
    word文档(文本情感色彩分类技术报告)下载链接:下载链接

    一.数据集介绍

    数据集链接: https://pan.baidu.com/s/1oIXkaL_SL9GSN3S56ZwvWQ
    提取码: qgtg

    训练集labeledTrainData.tsv(24500条带标签的训练数据)
    id sentiment review 分别表示:每段文本的唯一ID,情感色彩类别标签,待分析的文本数据。
    在这里插入图片描述
    测试集(testData.tsv:22000条无标签测试数据)
    在这里插入图片描述

    二.代码详解

    import numpy as np
    import tensorflow as tf
    wordsList=np.load('C:/NLP/wordsList.npy') #包含40万个词的python列表
    wordsList=np.load('C:/NLP/wordsList.npy') #包含40万个词的python列表
    wordsList=wordsList.tolist()
    wordsList=[word.decode('UTF-8') for word in wordsList]
    wordVectors=np.load('C:/NLP/wordVectors.npy')
    baseballIndex=wordsList.index('baseball')
    print(wordVectors[baseballIndex])
    import pandas as pd
    #读入数据
    df=pd.read_csv('C:/NLP/labeledTrainData.tsv',sep='\t',escapechar='\\')
    
    numDimensions=300
    print("down")
    
    maxSeqLength=250
    import re
    strip_special_chars = re.compile("[^A-Za-z0-9 ]+")
    #清洗数据,HTML字符使用空格替代
    def cleanSentences(string):
        string = string.lower().replace("<br />", " ")
        return re.sub(strip_special_chars, "", string.lower())
    
    # #生成索引矩阵,得到24500*250的索引矩阵
    # ids=np.zeros((24500,maxSeqLength),dtype='int32')
    # #print(ids.shape) #输出结果为(24500,250)
    
    # fileCounter=0
    # for pf in range(0,len(df)): 
    #     #print(pf)
    #     indexCounter=0
    #     cleanedLine=cleanSentences(df['review'][pf])
    #     split=cleanedLine.split()
    #     for word in split:
    #         try:
    #             #print('111')
    #             ids[fileCounter][indexCounter]=wordsList.index(word)
    #         except ValueError:
    #             ids[fileCounter][indexCounter]=399999
    #         indexCounter=indexCounter+1
    #         if indexCounter>=maxSeqLength:
    #             break        
    #     fileCounter=fileCounter+1 
    # print('down1')
    # np.save('C:/NLP/idsMatrix',ids)
    #上述注释后,将生成的索引矩阵保存到idsMatrix.npy文件中。避免了每次都要生成索引矩阵
    ids=np.load('C:/NLP/idsMatrix.npy')
    print(ids.shape)
    
    #辅助函数
    from random import randint
    def getTrainBatch():
        labels=[]
        arr=np.zeros([batchSize,maxSeqLength])
        i=0
        for i in range(0,32):
            j=0
            while j<1:
                num=randint(1,19600)
                if df['sentiment'][num-1]==1:
                    j=j+1
                    labels.append([1,0])
                    arr[2*i]=ids[num-1:num]
            j=0
            while j<1:
                num=randint(1,19600)
                if df['sentiment'][num-1]==0:
                    j=j+1
                    labels.append([0,1])
                    arr[2*i+1]=ids[num-1:num]
        return arr,labels
    print('down')
    
    
    batchSize=64 #批处理大小
    lstmUnits=64 #LSTM单元个数
    numClasses=2 #分类类别
    iterations=50000 #训练次数
    print('down')
    
    import tensorflow as tf
    
    tf.reset_default_graph()
    
    labels = tf.placeholder(tf.float32, [None, numClasses])
    input_data = tf.placeholder(tf.int32, [None, 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.LSTMCell(lstm_units)
    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)
    
    pre=tf.nn.softmax(prediction)
    print(pre)
    
    correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(labels, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
        logits=prediction, labels=labels))
    optimizer = tf.train.AdamOptimizer().minimize(loss)
    
    print('down')
    
    
    sess=tf.InteractiveSession()
    saver=tf.train.Saver()
    sess.run(tf.global_variables_initializer())
    for i in range(0,40001):
        nextBatch,nextBatchLabels=getTrainBatch();
        #print(nextBatch.shape)
        #print(nextBatchLabels)
        sess.run(optimizer,{input_data:nextBatch,labels:nextBatchLabels})
        if(i%1000==0 and i!=0):
            loss_=sess.run(loss,{input_data:nextBatch,labels:nextBatchLabels})
            accuracy_=sess.run(accuracy,{input_data:nextBatch,labels:nextBatchLabels})
            print("i...{}".format(i),"loss... {}".format(loss_),"accuracy {}".format(accuracy_))
        if(i%10000==0 and i!=0):
            save_path=saver.save(sess,"C:/NLP/models1/pretrained_lstm.ckpt",global_step=i)
            print("saved to %s"%save_path)
    print('down')
    
    sess=tf.InteractiveSession()
    saver=tf.train.Saver()
    saver.restore(sess,"C:/NLP/models1/pretrained_lstm.ckpt-10000")
    print('down')
    
    #预测
    in3 = np.load('C:/NLP/test_review.npy')
    
    
    x_test=in3
    
    print(x_test.shape)
    
    arr=np.zeros([1,maxSeqLength])
    print(arr.shape)
    numpy_data=[]
    sum=0
    for i in range(0,2):
        arr = np.array([x_test[i]])
        print("result for test:",(sess.run(pre,{input_data:arr})))
        numpy_data.append(sess.run(pre,{input_data:arr}))
        #print("labels1:",labels1,"....result for test:",(sess.run(pre,{input_data:arr,labels:labels1})),"accuracy for test:",(sess.run(accuracy,{input_data:arr,labels:labels1})))
        #sum=sum+sess.run(accuracy,{input_data:arr,labels:labels1})
    #print(sum)
    print('down')
    
    result_data=[]
    #print(in3.shape)
    for i in range(0,22000):
        arr = np.array([x_test[i]])
        result_data.append(sess.run(pre,{input_data:arr}))
    print('down')
    
    f=open('C:/NLP/possubmission.txt','w')
    for i in range (22000):
        #print(i)
        f.write('\n'+str(result_data[i][0][0]))
    f.close()
    print('down')
    

    最终possubmission.txt中的内容如下(存储的是为正向情感的概率):
    在这里插入图片描述

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,183
精华内容 1,273
关键字:

文本情感分析