精华内容
下载资源
问答
  • python中文文本情感分析
    千次阅读
    2020-11-23 15:19:04

    注:本文转载自知乎专栏

    情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪。

    原理

    比如这么一句话:“这手机的画面极好,操作也比较流畅。不过拍照真的太烂了!系统也不好。”

    ① 情感词

    要分析一句话是积极的还是消极的,最简单最基础的方法就是找出句子里面的情感词,积极的情感词比如:赞,好,顺手,华丽等,消极情感词比如:差,烂,坏,坑爹等。出现一个积极词就+1,出现一个消极词就-1。

    里面就有“好”,“流畅”两个积极情感词,“烂”一个消极情感词。那它的情感分值就是1+1-1+1=2. 很明显这个分值是不合理的,下面一步步修改它。

    ② 程度词

    “好”,“流畅”和‘烂“前面都有一个程度修饰词。”极好“就比”较好“或者”好“的情感更强,”太烂“也比”有点烂“情感强得多。所以需要在找到情感词后往前找一下有没有程度修饰,并给不同的程度一个权值。比如”极“,”无比“,”太“就要把情感分值4,”较“,”还算“就情感分值2,”只算“,”仅仅“这些就0.5了。那么这句话的情感分值就是:41+12-14+1=3。

    ③ 感叹号

    可以发现太烂了后面有感叹号,叹号意味着情感强烈。因此发现叹号可以为情感值+2. 那么这句话的情感分值就变成了:41+12-1*4-2+1 = 1

    ④ 否定词

    明眼人一眼就看出最后面那个”好“并不是表示”好“,因为前面还有一个”不“字。所以在找到情感词的时候,需要往前找否定词。比如”不“,”不能“这些词。而且还要数这些否定词出现的次数,如果是单数,情感分值就-1,但如果是偶数,那情感就没有反转,还是1。在这句话里面,可以看出”好“前面只有一个”不“,所以”好“的情感值应该反转,-1。

    因此这句话的准确情感分值是:41+12-14-2+1*-1 = -1

    ⑤ 积极和消极分开来

    再接下来,很明显就可以看出,这句话里面有褒有贬,不能用一个分值来表示它的情感倾向。而且这个权值的设置也会影响最终的情感分值,敏感度太高了。因此对这句话的最终的正确的处理,是得出这句话的一个积极分值,一个消极分值(这样消极分值也是正数,无需使用负数了)。它们同时代表了这句话的情感倾向。所以这句评论应该是”积极分值:6,消极分值:7。

    ⑥ 以分句的情感为基础

    再仔细一步,详细一点,一条评论的情感分值是由不同的分句加起来的,因此要得到一条评论的情感分值,就要先计算出评论中每个句子的情感分值。这条例子评论有四个分句,因此其结构如下([积极分值, 消极分值]):[[4, 0], [2, 0], [0, 6], [0, 1]] 。

    以上就是使用情感词典来进行情感分析的主要流程了,算法的设计也会按照这个思路来实现。

    算法设计

    第一步:读取评论数据,对评论进行分句。

    第二步:查找对分句的情感词,记录积极还是消极,以及位置。

    第三步:往情感词前查找程度词,找到就停止搜寻。为程度词设权值,乘以情感值。

    第四步:往情感词前查找否定词,找完全部否定词,若数量为奇数,乘以-1,若为偶数,乘以1。

    第五步:判断分句结尾是否有感叹号,有叹号则往前寻找情感词,有则相应的情感值+2。

    第六步:计算完一条评论所有分句的情感值,用数组(list)记录起来。

    第七步:计算并记录所有评论的情感值。

    第八步:通过分句计算每条评论的积极情感均值,消极情感均值,积极情感方差,消极情感方差。

    实战

    这里是作者参考已有代码,结合自己需要,对代码进行了简单的修改。本脚本运行环境是python3.5 ,使用2.x的盆友们见谅。

    import jieba

    import numpy as np

    #打开词典文件,返回列表

    def open_dict(Dict = 'hahah', path=r'/Users/apple888/PycharmProjects/Textming/Sent_Dict/Hownet/'):

    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'/Users/apple888/PycharmProjects/Textming/')

    posdict = open_dict(Dict = 'positive', path= r'/Users/apple888/PycharmProjects/Textming/')

    negdict = open_dict(Dict = 'negative', path= r'/Users/apple888/PycharmProjects/Textming/')

    degree_word = open_dict(Dict = '程度级别词语', path= r'/Users/apple888/PycharmProjects/Textming/')

    mostdict = degree_word[degree_word.index('extreme')+1 : degree_word.index('very')]#权重4,即在情感词前乘以3

    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

    data = '你就是个王八蛋,混账玩意!你们的手机真不好用!非常生气,我非常郁闷!!!!'

    data2= '我好开心啊,非常非常非常高兴!今天我得了一百分,我很兴奋开心,愉快,开心'

    print(sentiment_score(sentiment_score_list(data)))

    print(sentiment_score(sentiment_score_list(data2)))

    运行结果:

    [[78.0, 169.0, 3.1, 6.8, 3.1, 6.5]]

    [[327.0, 30.0, 14.9, 1.4, 22.5, 0.9]]

    从得分我们看到第一段话是消极的,第二段是积极的。(主要看Pos与Neg大小)

    运行代码及词典下载

    链接:http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1jIRoOxK

    密码:6wq4

    下载完代码,一定要注意代码中的path,修改成泥电脑中的文件路径,否则没法用。有什么问题可以给作者留言。

    欢迎关注作者公众号:大邓带你玩转python

    更多相关内容
  • python中文文本情感分析

    千次阅读 2021-03-07 14:34:34
    要做一个项目要用到中文文本情感分析,查找了多种资料,在网上看了很多博客后,终于完成,对自己帮助最大的两篇博客为【python机器学习】中文情感分析和 [Python开发 之 Sklearn的模型 和 CountVectorizer 、...

    python中文文本情感分析

    导语

    要做一个项目要用到中文文本情感分析,查找了多种资料,在网上看了很多博客后,终于完成,对自己帮助最大的两篇博客为【python机器学习】中文情感分析Python开发之Sklearn的模型和CountVectorizer Transformer保存和使用中模型的加载与保存,之后又在之前手写数字识别中采用svm、决策树、朴素贝叶斯、knn等算法分别训练模型,采用了data1.csv作为数据集

    训练模型保存并测试正确率

    import pickle
    
    from sklearn import svm
    # 离散型朴素贝叶斯
    from sklearn.naive_bayes import MultinomialNB
    import os
    import joblib
    import jieba
    import numpy as np
    import pandas as pd
    import jieba
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.tree import DecisionTreeClassifier
    from snownlp import SnowNLP
    from sklearn.model_selection import train_test_split
    from sklearn.feature_extraction.text import CountVectorizer
    
    
    def make_label(star):
        if star > 3:
            return 1
        else:
            return 0
    
    
    
    def snow_result(comment):
        s = SnowNLP(comment)
        if s.sentiments >= 0.5:
            return 1
        else:
            return 0
    
    
    # jieba分词
    def chinese_word_cut(mytext):
        return " ".join(jieba.cut(mytext))
    
    
    def get_custom_stopwords(stop_words_file):
        with open(stop_words_file, 'r', encoding='UTF-8') as f:
            stopwords = f.read()
        stopwords_list = stopwords.split('\n')
        custom_stopwords_list = [i for i in stopwords_list]
        return custom_stopwords_list
    
    
    def nb_mode_train(x_train,y_train,Vectorizer):
        nb = MultinomialNB()
    
        nb.fit(x_train, y_train)
    
        # 创建文件目录
        dirs = 'testModel'
        if not os.path.exists(dirs):
            os.makedirs(dirs)
    
        # 保存模型
        joblib.dump(nb, dirs + '/nb.pkl')
        feature_path = 'testFeature'
        if not os.path.exists(feature_path):
            os.makedirs(feature_path)
        feature_path = feature_path + '/nb.pkl'
        with open(feature_path, 'wb') as fw:
            pickle.dump(Vectorizer.vocabulary_, fw)
    
        return nb
    
    
    # svm训练模型
    def svm_model_train(x_train,y_train,Vectorizer):
        svm_model = svm.LinearSVC()
    
        svm_model.fit(x_train, y_train)
    
        # 创建文件目录
        dirs = 'testModel'
        if not os.path.exists(dirs):
            os.makedirs(dirs)
    
        # 保存模型
        joblib.dump(svm_model, dirs + '/svm_model.pkl')
        feature_path = 'testFeature'
        if not os.path.exists(feature_path):
            os.makedirs(feature_path)
        feature_path = feature_path + '/svm_model.pkl'
        with open(feature_path, 'wb') as fw:
            pickle.dump(Vectorizer.vocabulary_, fw)
    
        return svm_model
    
    
    # 决策树算法训练模型
    def tree_model_train(x_train,y_train,Vectorizer):
        tree_model = DecisionTreeClassifier(criterion="entropy")
    
        tree_model.fit(x_train, y_train)
    
        # 创建文件目录
        dirs = 'testModel'
        if not os.path.exists(dirs):
            os.makedirs(dirs)
    
        # 保存模型
        joblib.dump(tree_model, dirs + '/tree_model.pkl')
        feature_path = 'testFeature'
        if not os.path.exists(feature_path):
            os.makedirs(feature_path)
        feature_path = feature_path + '/tree_model.pkl'
        with open(feature_path, 'wb') as fw:
            pickle.dump(Vectorizer.vocabulary_, fw)
    
        return tree_model
    
    
    # Knn算法训练模型
    def knn_model_train(x_train,y_train,Vectorizer):
        knn_model = KNeighborsClassifier(n_neighbors=3)
    
        knn_model.fit(x_train, y_train)
    
        # 创建文件目录
        dirs = 'testModel'
        if not os.path.exists(dirs):
            os.makedirs(dirs)
    
        # 保存模型
        joblib.dump(knn_model, dirs + '/knn_model.pkl')
        feature_path = 'testFeature'
        if not os.path.exists(feature_path):
            os.makedirs(feature_path)
        feature_path = feature_path + '/knn_model.pkl'
        with open(feature_path, 'wb') as fw:
            pickle.dump(Vectorizer.vocabulary_, fw)
    
        return knn_model
    
    
    if __name__ == '__main__':
        data = pd.read_csv('data1.csv')
    
        data['sentiment'] = data.star.apply(make_label)
        data['snlp_result'] = data.comment.apply(snow_result)
    
        counts = 0
        for i in range(len(data)):
            if data.iloc[i, 2] == data.iloc[i, 3]:
                counts += 1
        print("snowNLP构建模型测试准确率",counts / len(data))
    
        # jieba分词
        data['cut_comment'] = data.comment.apply(chinese_word_cut)
    
        # 划分数据集
        X = data['cut_comment']
        y = data.sentiment
    
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=19113122)
        # 设置停用词表
    
        stop_words_file = '哈工大停用词表.txt'
        stopwords = get_custom_stopwords(stop_words_file)
        # print(stopwords)
    
        Vectorizer = CountVectorizer(max_df=0.8,
                                     min_df=3,
                                     token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',
                                     stop_words=frozenset(stopwords))
    
        test = pd.DataFrame(Vectorizer.fit_transform(X_train).toarray(),
                            columns=Vectorizer.get_feature_names())
    
        X_train_vect = Vectorizer.fit_transform(X_train)
        X_test_vect = Vectorizer.transform(X_test)
    
        # 训练模型并保存训练模型和特征
        nb = nb_mode_train(X_train_vect,y_train,Vectorizer)
    
        z = nb.predict(X_test_vect)
        print('朴素贝叶斯构建模型测试集测试准确率:', np.sum(z == y_test) / z.size)
    
        #train_score = nb.score(X_train_vect, y_train)
        #print('朴树贝叶斯训练集测试正确率',train_score)
    
    
        #print('朴树贝叶斯测试集测试正确率',nb.score(X_test_vect, y_test))
    
        # 训练模型并保存训练模型和特征
        svm_model = svm_model_train(X_train_vect, y_train, Vectorizer)
        z = svm_model.predict(X_test_vect)
        print('svm构建模型测试集测试准确率:', np.sum(z == y_test) / z.size)
    
        # 训练模型并保存训练模型和特征
        tree_model = tree_model_train(X_train_vect, y_train, Vectorizer)
        z = tree_model.predict(X_test_vect)
        print('决策树构建模型测试集测试准确率:', np.sum(z == y_test) / z.size)
    
        # 训练模型并保存训练模型和特征
        knn_model = knn_model_train(X_train_vect, y_train, Vectorizer)
        z = knn_model.predict(X_test_vect)
        print('knn构建模型测试集测试准确率:', np.sum(z == y_test) / z.size)
    

    在这里插入图片描述

    使用保存的模型

    import pickle
    
    import joblib
    import jieba
    from sklearn.feature_extraction.text import CountVectorizer
    
    
    # jieba分词
    def chinese_word_cut(mytext):
        return " ".join(jieba.cut(mytext))
    
    
    def get_custom_stopwords(stop_words_file):
        with open(stop_words_file, 'r', encoding='UTF-8') as f:
            stopwords = f.read()
        stopwords_list = stopwords.split('\n')
        custom_stopwords_list = [i for i in stopwords_list]
        return custom_stopwords_list
    
    # 处理文本数据
    def content_handler(content,Vectorizer):
        content = chinese_word_cut(content)
        content = [content]
        content_ver = Vectorizer.transform(content)
    
        return content_ver
    
    # 使用模型
    def useModel(model_name,feature_name,content):
        dirs = 'testModel'
        nb = joblib.load(dirs + '/' +model_name)
    
        features = 'testFeature'
        feature_path = features + '/' +feature_name
        Vectorizer = CountVectorizer(decode_error="replace", vocabulary=pickle.load(open(feature_path, "rb")))
    
        return nb,content_handler(content,Vectorizer)
    
    
    
    
    if __name__ == '__main__':
        content = '开心有时也很容易啊,比如刚到车站车就来了,随机播放正好是最近喜欢的歌,还有今天的风真舒服。'
    
        nb,content_vec = useModel('nb.pkl','nb.pkl',content)
    
        result = nb.predict(content_vec)
        print(result)
        print('___________________')
    
        print("朴素贝叶斯")
        print(float(nb.predict_proba(content_vec)[:, 1]))
    
    
    
    
    展开全文
  • 文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息。 本文使用python来做文本情感分析
  • 本文实例讲述了Python实现购物评论文本情感分析操作。分享给大家供大家参考,具体如下: 昨晚上发现了snownlp这个库,很开心。先说说我开心的原因。我本科毕业设计做的是文本挖掘,用R语言做的,发现R语言对文本处理...
  • python实现人工智能中文情感分析
  • 中文ULMFiT 情感分析 文本分类
  • 利用python 实现knn算法的情感分类
  • 前言前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如下: 数据情况和处理数据情况这里的数据为大众点评上的评论数据(王树义老师...

    ceea214d0eb55334bda754c7080cfa8f.png

    前言

    前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如下:

    4ba81921615320053e06e7631897589f.png

    数据情况和处理

    数据情况

    这里的数据为大众点评上的评论数据(王树义老师提供),主要就是评论文字和打分。我们首先读入数据,看下数据的情况:

    importnumpyasnp

    importpandasaspd

    data=pd.read_csv('data1.csv')

    data.head()

    1b5ecb167d63e7bcb8f0aed36f15ee6a.png

    情感划分

    对star字段看唯一值,打分有1,2,4,5。

    03324be3765f4ada2d6f719e0457337c.png

    中文文本情感分析属于我们的分类问题(也就是消极和积极),这里是分数,那我们设计代码,让分数小于3的为消极(0),大于3的就是积极(1)。

    定义一个函数,然后用apply方法,这样就得到了一个新列(数据分析里的知识点)

    defmake_label(star):

    ifstar>3:

    return1

    else:

    return0

    data['sentiment']=data.star.apply(make_label)

    9ff9b39c59e8e6b766a0ce29698dffe8.png

    工具包(snownlp)

    我们首先不用机器学习方法,我们用一个第三库(snownlp),这个库可以直接对文本进行情感分析(记得安装),使用方法也是很简单。返回的是积极性的概率。

    fromsnownlpimportSnowNLP

    text1='这个东西不错'

    text2='这个东西很垃圾'

    s1=SnowNLP(text1)

    s2=SnowNLP(text2)

    print(s1.sentiments,s2.sentiments)

    # result 0.8623218777387431 0.21406279508712744

    这样,我们就定义大于0.6,就是积极的,同样的方法,就能得到结果。

    defsnow_result(comemnt):

    s=SnowNLP(comemnt)

    ifs.sentiments>=0.6:

    return1

    else:

    return0

    data['snlp_result']=data.comment.apply(snow_result)

    1eeaf75939b000e5a706ee30b56d6a96.png

    上面前五行的结果看上去很差(5个就2个是对的),那到底有多少是对的了?我们可以将结果与sentiment字段对比,相等的我就计数,这样在除以总样本,就能看大概的精度了。

    counts=0

    foriinrange(len(data)):

    ifdata.iloc[i,2]==data.iloc[i,3]:

    counts+=1

    print(counts/len(data))

    # result 0.763

    朴素贝叶斯

    前面利用第三库的方法,结果不是特别理想(0.763),而且这种方法存在一个很大的弊端:针对性差。

    什么意思了?我们都知道,不同场景下,语言表达都是不同的,例如这个在商品评价中有用,在博客评论中可能就不适用了。

    所以,我们需要针对这个场景,训练自己的模型。本文将使用sklearn实现朴素贝叶斯模型(原理在后文中讲解)。slearn小抄先送上(下文有高清下载地址)。

    大概流程为:

    导入数据

    切分数据

    数据预处理

    训练模型

    测试模型

    00adbf635e27d5393f11ecacbaaa65bc.png

    jieba分词

    首先,我们对评论数据分词。为什么要分词了?中文和英文不一样,例如:i love python,就是通过空格来分词的;我们中文不一样,例如:我喜欢编程,我们要分成我/喜欢/编程(通过空格隔开),这个主要是为了后面词向量做准备。

    importjieba

    defchinese_word_cut(mytext):

    return" ".join(jieba.cut(mytext))

    data['cut_comment']=data.comment.apply(chinese_word_cut)

    b85804d08d87368b56dfe5874b2dfaad.png

    划分数据集

    分类问题需要x(特征),和y(label)。这里分词后的评论为x,情感为y。按8:2的比例切分为训练集和测试集。

    X=data['cut_comment']

    y=data.sentiment

    fromsklearn.model_selectionimporttrain_test_split

    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=22)

    词向量(数据处理)

    电脑是没法识别文字的,只能识别数字。那文本怎么处理了,最简单的就是词向量。什么是词向量,我们通过一个案例来说明下,下面是我们的文本:

    I love the dog

    I hate the dog

    词向量处理后就是这样的:

    01b30b5442972519403b0af300e06361.png

    简单的说,词向量就是我们将整个文本出现的单词一一排列,然后每行数据去映射到这些列上,出现的就是1,没出现就是0,这样,文本数据就转换成了01稀疏矩阵(这也是上文中文分词的原因,这样一个词就是一个列)。

    好在,sklearn中直接有这样的方法给我们使用。CountVectorizer方法常用的参数:

    max_df:在超过这一比例的文档中出现的关键词(过于平凡),去除掉。

    min_df:在低于这一数量的文档中出现的关键词(过于独特),去除掉。

    token_pattern:主要是通过正则处理掉数字和标点符号。

    stop_words:设置停用词表,这样的词我们就不会统计出来(多半是虚拟词,冠词等等),需要列表结构,所以代码中定义了一个函数来处理停用词表。

    fromsklearn.feature_extraction.textimportCountVectorizer

    defget_custom_stopwords(stop_words_file):

    withopen(stop_words_file)asf:

    stopwords=f.read()

    stopwords_list=stopwords.split('\n')

    custom_stopwords_list=[iforiinstopwords_list]

    returncustom_stopwords_list

    stop_words_file='哈工大停用词表.txt'

    stopwords=get_custom_stopwords(stop_words_file)

    vect=CountVectorizer(max_df=0.8,

    min_df=3,

    token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',

    stop_words=frozenset(stopwords))

    如果想看到底出来的是什么数据,可通过下面代码查看。

    test=pd.DataFrame(vect.fit_transform(X_train).toarray(),columns=vect.get_feature_names())

    test.head()

    ea4317eb0c357951b720196176811dd6.png

    训练模型

    训练模型,很简单,用的是朴素贝叶斯算法,结果为0.899,比之前的snownlp好很多了。

    fromsklearn.naive_bayesimportMultinomialNB

    nb=MultinomialNB()

    X_train_vect=vect.fit_transform(X_train)

    nb.fit(X_train_vect,y_train)

    train_score=nb.score(X_train_vect,y_train)

    print(train_score)

    # result 0.899375

    测试数据

    当然,我们需要测试数据来验证精确度了,结果为0.8275,精度还是不错的。

    X_test_vect=vect.transform(X_test)

    print(nb.score(X_test_vect,y_test))

    # result 0.8275

    当然,我们也可以将结果放到data数据中:

    X_vec=vect.transform(X)

    nb_result=nb.predict(X_vec)

    data['nb_result']=nb_result

    4b52f954fbe9947a0bdbfcf41ce93329.png

    讨论和不足

    样本量少

    模型没调参

    没有交叉验证

    今日互动

    代码下载:https://github.com/panluoluo/crawler-analysis,下载完整数据和代码。

    留言打卡:说说评论杠精那些事。公众号后台回复【入群】,加入学习交流群群,2019年一起搞事情。

    展开全文
  • 中文文本情感分析案例 课程配套程序 该文件夹是本次课程配套的程序,打来即可使用 课后作业数据集 为大家课后作业的数据集,可以在该数据集上进行相关训练 test.tsv为测试数据集,测试模型准确度 train.tsv为训练...
  • python实现中文情感分析与可视化

    千次阅读 多人点赞 2021-07-16 16:57:15
    目录 一、导入原始数据 二、结巴分词/绘制词云图 三、计算情感值,情感分析 # 方法一、SnowNLP计算情感得分 # 方法二、使用字典计算情感得分 四、# 数据可视化展示 五、绘制相关系数热力图 一、导入原始数据 #导入...

     

    目录

    一、导入原始数据

     二、结巴分词/绘制词云图

     三、计算情感值,情感分析

             # 方法一、SnowNLP计算情感得分

    # 方法二、使用字典计算情感得分

     四、# 数据可视化展示

    五、绘制相关系数热力图 


    一、导入原始数据

    #导入模块
    import pandas as pd 
    import numpy as np 
    from collections import defaultdict
    import os
    import re
    import jieba
    import codecs
    data=pd.read_csv("earphone_sentiment.csv",encoding='gbk')
    data.head()
    content_idcontentsubjectsentiment_wordsentiment_value
    00Silent Angel期待您的光临,共赏美好的声音!其他1
    12这只HD650在1k的失真左声道是右声道的6倍左右,也超出官方规格参数范围(0.05%),看...其他NaN0
    23达音科 17周年 倒是数据最好看,而且便宜配置1
    34bose,beats,apple的消費者根本不知道有曲線的存在其他NaN0
    45不错的数据配置不错1
    #数据分组
    s1=data[data['sentiment_value'].values==1]
    s2=data[data['sentiment_value']==0]
    s3=data[data['sentiment_value']==-1]
    print(s3['content'])                    #输出其中一组数据
    33       支持斑竹,标题不明了的话,有的时候根本就懒得进去看,起码我是这样的,别人我就不知道啦,呵呵~...
    118                                                没有拜亚,差评
    129      都有GDX2了,用PC直连的话,音源的质量堪忧,建议加USB隔离,比界面的效果明显多了,毕竟...
    131                                                     蛋疼
    142      这是我第一只大耳机不过不知道真货什么声,我是20买的仿货。仿货低频混沌但有魔幻风格,有包围感...
                                   ...                        
    16994    搓了根三芯卡侬母转四芯卡侬母的线接解码屁股,直接推耳机。发现没有耳放动态确实弱了不少,别的倒...
    17020                                    差距很大,前提是你的系统揭示力足够
    17057                                               大小差这么多
    17080                 差距最明显的20hz低频也不过和原始数据相差2db左右,不值得大惊小怪。
    17168                    我8005接s7都没觉得比自带耳机口差……最多就是提升不明显罢了。
    Name: content, Length: 590, dtype: object

     二、结巴分词/绘制词云图

    with open('stop_word/HGD_StopWords.txt','r',encoding='utf-8') as f:
        stopwords=set([line.replace('\n','')for line in f])
    f.close()
    #加载用户自定义词典
    segs=data['content']
    def clean_data(content):
        words =' '
        for seg_text in content:
            seg_text=jieba.cut(seg_text)
            for seg in seg_text:
                if seg not in stopwords and seg!=" " and len(seg)!=1:    # #文本清洗  
                      words = words +  seg + ' '
        return words
    print(clean_data(s1['content']))

    Silent Angel 期待 光临 共赏 美好 声音 达音科 17 周年 数据 好看 便宜 不错 数据 觉得 器材 级别 搭配 达到 线材 区别 一件 非常容易 事情 网页 手机 无法 退到 一层 希望 做好 版块 名称 显示 不全 问题 提交 软件 开发商 估计 还要 时间 入门 贴子 几个 不太 系统 建议 近期 整理 找些 资料 新手 东西 温故 可知 不错 DD 支持 顶一下 东西 树莓 能响 想出 好声 ZEN 比较 升级 直接 加个 can 就行 感受 解码 前级 PS1200 1200 解码 细节 拉满 声部 互无 关联 放到 前级 知道 前级 声音 影响 比较 比较 反正 声音 起来 目前 解码 机器 店家 所谓 国产 发烧 喜好 低端 耳机 建议 买太多 早晚 T1 800S 老路 参数 感有 很大 关系 是否 好听 绝对 关系 高价 名机 参数 就行了 参数 太低 考虑 参数 前排 好听 参数 前排 好听 我用 诗德 声音 不错 喜好 现在 看起来 简单 器材 好不好 感觉 参数 好坏 算了 最近 鼓吹 参数 绝口不提 起来 搞乱 思路 怀疑 这种 参数 图个 器材 离开 测试 仪器 分辨 能力 家里 零火 反接 最好 电笔 段时间 着迷 电源 补习 电源 相位 知识 插头 仔细检查 安置 治好 多年 颈椎病 推好 T1 低音 下潜 极深 类似 进口 12 喇叭 那种 低音 暗流 涌动 极其 凶狠 非常 过瘾 T1 音场 人声 HD800 还远 觉得 人声 声场 宽深 推力 没有 声场 推开 二狗 气质 中国 牌子 中国 产品 英文名 中文名 巴不得 消费者 白皮 私生子 百多年 西崽 气质 下贱 港灿绿蛙 引以为荣 大陆 不绝 久居 鲍鱼之肆 不觉 其臭 白灯 监听 模式 解析 最好 耐听 绿灯 hifi 模式 乐感 黄灯 暖糊 模式 人声 颗粒感 红灯 甜润 模式 人声 润喉 味道 四种 模式 高频 依次 削减 qutest 本来 高频 最后 觉得 红灯 模式 最耐 隔离 牛不香 难看 界面 更好 值不值 男儿 当自强 林子祥 还好 平板 好听 自然 高敏 失真 失真 难听 厂家 早就 秘密 烧友 se v4 韭菜 故障率 高品 控差 更是 老生常谈 只能 烧友 早就 忍受着 还要 平板 这么回事 明白 深思 真的 好事 真实性 需要 验证 老铁 耳放 看来 不错 ADX5000 外观 质感 喜欢 明显 精工细作 感觉 档次 听过 800 800s 反正 编制 确实 流行 摇滚 不行 很想 听听 大乌 好文 支持 看来 官放才 归宿 知道 官放 音色 KT 好想断 货挺 本来 打算 没货 知道 声音 翻车 现在 不太能 受得了 刺激 声音 AWKT 知道 跳水 价格 8K 暂时 好像 不太可能 缺货 厉害 西装 5000ANV 真的 甜润 5000ANV 七八年 这放 对付 低阻 耳机 铁家 木碗 真的 一套 W1000Z 中频 味道 插上 5000ANV 中频 立马 味道 不错 手上 木碗 翻车 知道 AWKT 界面 时钟 高级 系统 需要 东西 最近 intona 只能 特定 曲目 曲目 副作用 十几年 耳机 没耳放 短暂 拥有 推不开 可惜 现在 买不起 AKG 经典 监听 耳机 到家 翻出 已久 240DF 细细 真是 不错 觉得 出彩 音量 开得 保守 t1 三代 这种 精致 声场 风格 T1 一代 横向 声音 相对 较为 纵深 比较 T1 三代 印象 一句 LZ 搭配 组合 本身 偏向 天龙 耳机 T1 三代 友好 马兰士 天龙 耳机 一家亲 T1 三代 现在 看到 失真 瀑布 测量 好奇 建议 购买 一台 mbl 5010c 前级 老牌子 前级 放大器 耳机 耳机 相当 水准 音源 建议 传统 cd lp 农村 弄个 复读机 原配 耳塞 买点 盗版 磁带 听得 舒服 初中 县城 上学 有个 同学 家庭 条件 那种 比较 磁带机 森海 px80 几百 一套 说白了 那句话 没有 没有 伤害 知道 坐井观天 中学 30 50 巨款 上学 那会 hd650 dt880 大耳 觉得 超级 好几千 耳放 一笔 大钱 用家 帮顶 赞同 楼主 听感 GL1000C 真的 吃惊 耳机 封闭 耳机 自然 开阔 声场 古典 编制 音乐 时有 辉煌 堂音 堪称 古典音乐 神器 性价比 真是 挺强 价位 唯一 重量 试一试 重量轻 GL1000 GL1000C 便携 相当 不错 流云 兄好文 支持 玩过 一段时间 a6t 感觉 特色 态度 诚恳 审美 品位 审美 相对 平庸 国货 总体 说得过去 相比 高级 a8 差距 现在 见到 sxt1se 真是 耳罩 保养 习惯 器材 声音 帮顶 同意 凤凰 观点 界面 光纤 理论 高度 实际效果 现在 好像 6.35 4.4 楼主 拿下 最牛 1w5 附近 XLR 4.4 过度 时代 XLR 4.4 全送 A1000 低频 确实 厚度 结像 纤细 现在 推着 800S NIAO 低频 不错 类型 相比之下 生硬 柔和 底气 动态 夸张 有点 用力 过头 感觉 niao 耳放 很强 单个 t1 HD800 问题 追求 极致 niao 万元 m9 不错 买过 咸鱼 嫌弃 声底 清晰 微暖 gax evo 好奇 凯音 idac6 二代 9028 芯片 唯芯论 没见 有人 感觉 耳机 音乐 带入 细节 有时候 不好 he1 细节 没多 爆炸 异常 自然 好比 音频 鸟叫声 惊到 耳机 下世纪 格雷 dsd1024 解码 信息量 爆棚 信息量 解码 更好 音箱 来讲 音箱 想做到 这种 沉浸 听感 最少 需要 单独 听音 隔音 合理布局 起码 一步 几万 下不来 箱子 低频 推好 需要 功夫 几个 钉子 影响 效果 绝对 耳机 场景 或许 更广 只不过 耳机 hd800 水准 提升 较为 困难 macmini 电加 12v 10a 线电 roon hqplayer 播放 hdd 里面 音乐 万元 以内 个数 秒杀 注意 秒杀 万元 不好 roon 确实 方便 手机 控制 界面 非常 赏心悦目 不太多 pontus 挺不错 预算 建议 直接 终结者 提升 很大 耳房 实在 得换 麻烦 推荐 耳房 耳机 预算 二手 超过 1w 能少点 更好 大耳 低音 只会 更好 震撼 身上 每个 细胞 跃动 起来 几百元 入耳 战悚 感觉 说明 耳朵 满足 来看 kk 真的 好听 楼主 运气 不错 用过 1800 001 002 一两个 型号 挺不错 重量 500 舒适 400 受不了 颜色 不错 国货 国外 照样 代工 贴牌 垃圾 看起来 很火 东西 男人 国产 文案 期望值 平板 强于 动圈 习惯 动圈 耳朵 能否 接受 声音 平板 低音 不太好 有量 没质 下潜 低音 比较 混和糊 缺乏 低音 精确 描绘 速度 力量感 柔顺 帖子 一点 器材 为先 器材 搭配 线材 调音 思想 错误 拆东墙补西墙 真的 调音 真的 素质 这种 领悟 始终 觉得 器材 搭配 线材 提升 很大 请问 楼主 甲乙 两条 纯铜 甲线 描述 高频 延伸度 达到 20KHz 空间感 细节 还原 现在 资历 可否 解释一下 甲线 物理 化学 结构 工艺 达到 状态 而乙线 强文 实实在在 烧友 懂线 喷子 义和团 路上 pc 越像 同质化 同质化 没有 竞争力 便携式 产品 简单 好声 价格 不贵 路线 想法 同意 轻便 占地 操作 方便 适应性 声音 拖后腿 觉得 足够 m040 导向 孔是 向下 环境 容忍度 不错 真力 不错 真力 不错 人声 电影 hd650 不错 推荐 平面 GL2K 目前 Z7 上台 机听 交响 古典 2K 三星 S7 EDGE 随身听 起码 觉得 短暂 玩过 金属 的确 不错 极致 HFI PRO Signature 值得 Pro900 成色 一点 有限 耳罩 依旧 屹立 边上 真的 好文 好文先 楼主 辛苦 理解 深刻 文笔 南京 百家 一带 风景 宜人 听音 地方 不好 800 档次 古典 最好 德国 大师 qp400 gmp400 肯定 不错 他家 中端 电源线 耳机 可惜 前端 耳机 真正 实力 没有 发挥 不错 黑标 定位 gs2ke gs3ke 之间 gs2ke 调音 改版 参考 声音 非常 光头 读不出 估计 那台 机器 和弦 cd pro2 市面上 最贵 稳定 转盘 不出 我用 特别 一条 纳米 308 电源线 第一次 感觉 电源 区别 换上去 整个 声音 奶油 如丝 顺滑 顺滑 淘太 难听 用过 不值 一条 木内 8000 一条 电源线 觉得 1000 没有 区别 闲置 半年 设备 发现 不错 一个月 不值 两年 刚入 adx5000 找耳放 阴差阳错 入手 现在 耳放 自我感觉 良好 关注 安心 听歌 ..... 精彩 THR 会有 底噪 问题 确定 是否 每台 那台 问题 声音 方面 2000 价格 染色 好听 确定 是否 高文 风格 高文 毒文 描述 接近 超鼠 铁三角 bha100 搭配 不错 意外 挺不错 别问 为啥 二手 不好 他家 重视 国内 市场 枪手 关注度 不高 东西 那种 玩玩 心态 安心 他家 耳放强 听过 他家 5k 一体机 解码 当纯 耳放用 出台 老何 r8 解码 挺不错 几张 专辑 Qobuz 确实 不错 收藏 ifi 东西 周边 敏感 usb 线换 用个 好点 数播 机线 换掉 搞个 ele 两位 电处 提升 明显 Pro dsd 升级 解码 有意思 有钱 玩意 便宜 感觉 感上 650 稍微 讨好 耳朵 耐听度 r70x 佩戴 素质 高阻 开放式 低频 表现 出色 后续 提升 空间 听说 流行 不错 古典 同意 楼上 实体店 体验 觉得 不错 参考 实体店 搭配 USB hdmi 视频 不当 iis 挺不错 正在 这款 USB 不值 价格 补品 价格 等于 耳放 价位 才能 出好声 搜下 适应性 蛮广 耳放 喜欢 二手 600 虽好 600 貌似 适合 听歌 风格 收原线 做条 参考 价格便宜 声音 原线 明显 好些 evo 平衡 单端 太拉 2A3 胆机 木纹 面板 好看 手上 线材 发现 银彩 高频 分析 背景 自带 密度 宽松 音染 人声 起来 有种 慵懒 感觉 建议 欧亚 510 原装 二手 400 多收 划算 声音 高端 确实 日本 用料 毕竟 纯银 二手 1000 分析家 声音 确实 宽松 素质 高点 解析 高点 我用 cd 机加 an 解码 an 解码 宽松 下盘 素点 搭配 正好 一点点 DAVE P750 搭配 经典 好像 见过 五个 烧友 感觉 大师 解析 没有 达到 所谓 旗舰 水准 adx5000 等级 d8000pro 两个 等级 大师 长处 声场 动态 调音 双三 平衡 设备 支持 这次 成功 2a3 parafeed 明显 感觉 ec super7 清晰度 ec 声音 特征 高频 空气 极为 起来 非常 舒服 屏头 清晰 声场 没有 特别 偏向 有点像 我用 ecp daha1 比较 声场 感觉 声音 一听 感觉 比较 高级 特点 突出 6sn7 并管 真是 设计 转接线 音箱 耳机 阻抗 推个 800 小意思 super7 4k 输出 变压器 stereomour ii 玩意 推低 阻高敏 耳机 噪音 做耳放 ec 解码器 驱动 有没有 安装 刚买 ae9 1000 多运放来 搭配 调音 不错 建议 sbx 游戏 音效 听歌 别有 风味 组合 好像 x7 官方 推荐 我试 还行 黑金 好评 看起来 不错 电位器 质量 电源 变压器 貌似 张扬 唯一 问题 便宜 导致 没有 高级 Phone 3k 塞子 明显 伺候 不好 细节 缺失 控制力 声音 粗糙 1.5 价位 塞子 前端 要求 用来 iPhone 正确 声音 出不来 细节 规模 最后 打过 5k 一万五 日元 比较 推荐 耳塞 某宝 随手 887 数据 好点 价格 手头 有个 atom 液态 v1 说实话 液态 底噪 好听 楼主 sp200 当初 789 感觉 基本一致 估计 喜欢 强势 抽插 不错 楼主 意见 觉得 q701 四不像 东西 知道 k702 歌德 325 不用 比来比去 AKG k701 一条 独苗 香火 暂时 无法 延续 只好 先供 鼠莓 推送 推荐 hqplayer 升频 naa 推送 鼠莓 jriver foobar 推送 国产 耳罩 原装 区别 有没有 比较 国产 替代 推荐 原装 最好 拆卸 国产 开模 粗糙 安装 教程 不错 漏音 低频 滚降 是不是 耳罩 单元 背面 金属网 堵死 有用 改变 风格 所谓 风格 耳朵 好听 不好 用心 支持 手机 音源 算了 采样 问题 音质 到哪去 某宝 声音 FM711 指标 平板 没有 底噪 性价比 音色 喜欢 gax evo hek he6 确实 传声 FM711 后级 推荐 高频 太亮 听感 不好 声音 比较 怪异 底噪 男人家 功放 适配器 HEK 轻微 沙沙声 接受 HE6 没有 可闻 底噪 算是 我用 功放 非常 20 多公斤 累个 半死 强烈推荐 fake711 听过 知道 耳放 功放 全是 普遍 听感 喜好 来看 估计 耳朵 闷糊 类型 耳机 耳塞 不煲 耳朵 再细 耳朵 听感 吃亏 现在 假货 遍地 只能 论坛 中介 确实 国内 商家 好少 帖子 看看 确实 喜欢 声音 行货 未必 傲立 行货 3000 价位 马兰士 CD机 DAC 除开 谣传 质量 问题 声音 好像 质疑 产品 hek 我见 过头 梁都 掉色 状态 大部分 动圈 够用 解码 部分 不错 推力 不错 输出阻抗 碰到 问题 换个 foobar 就行了 乾龙盛 官网 有个 打包 foobar 试试 录线 好长 一套 公斤 tc 版好 东西 二手 确实 见到 海里 民谣 型号 HD630VB 540 430 熟悉 猜测 530 GL2000 bispa 澄会 SOMMER 参考 好些 Signature 系列 性价比 不错 Signature DJ 外观 真心 毒到 等个 好价 还好 从来不 咸鱼 换下来 器材 磨改 耳机 展会 听过 好听 感觉 这套 前端 控制力 比较 人用 650 棉被 搭配 高频 低频 重心 偏上 前端 系统 直接 来接 700 耳朵 齿音 毛刺 低频 阴间 耳机 言论 由此而来 700 系统 650 相反 要压 齿音 毛刺 偏下 系统 推才 好听 需要 前端 提高 亮度 提升 解析 700 本身 解析 风格 700 调音 缺点 1990 高频 偏暗 调音 鲜活 通透 偏素 偏暗 700 问题 残响 太多 声音 比较 混浊 800 清楚 800 声音 干净 700 残响 人会 误认为 泛音 细节 认为 700 解析 700 森海 590 失败 副耳机 关机 每次 热机 好久 HD600 换上 国产 非官方 耳罩 声音 尖锐 时间 感觉 一点 耳罩 越久越 好听 再烂 一组 声必飞 不错 He6se 最好 温暖 功放 声音 太冷 不耐 GL2K 人声 ANANDA GDX2 推过 功放 RS1 不错 3000 二手 收到 女声 弦乐 展会 T5 挺不错 物有所值 t5 三代 t5 确实 流行 调音 古典 太行 平头 760 声音 确实 760 冷声 人声 好听 甜甜的 没有 低音 高频 亮锐 声场 横向 还行 纵向 声音 性格 akg k701 森海 耳塞 ie 系列 成熟度 整体 立体 mx 系列 情怀 耳塞 苹果 12 索尼 精选 app 效果 非常 hm1000 回来 后接 4.4 平衡 usb dac 试试 效果 淘宝网 c4 电池 索尼 我换 第一 先看 发帖 日期 C4 10 年前 听过 印象 不错 喜欢 续航 最近 湖人 销量 有点 重装 FOOBAR Amanero 驱动 装个 DSDTranscoder 电路 用料 素质 平衡 肯定 高于 单端 有人 味道 理解 素质 难求 味道 好调 几条 解决问题 平衡 架构 缺点 成本 端的 一倍 阻容 元件 配对 要求 关键 输出 次级 绕线 方式 输出 仿着 功放 输出 制作 次级 没有 输出 接头 平衡 没太大 意义 定制 输出 次级 有同 输出 接头 胆机 追求 平衡 叶家 胆机 外观 好看 确实 放到 顶级 耳放 胆机 推原 9500 不错 还好 管子 起来 2a3 300b 那种 便宜 胆机 够不够 看用 知道 老叶 机子 真的 关机 每次 热机 好久 HD600 换上 国产 非官方 耳罩 声音 尖锐 时间 感觉 一点 耳罩 越久越 好听 再烂 一组 声必飞 不错 He6se 最好 温暖 功放 声音 太冷 不耐 GL2K 人声 ANANDA GDX2 推过 功放 RS1 不错 3000 二手 收到 女声 弦乐 展会 T5 挺不错 物有所值 t5 三代 t5 确实 流行 调音 古典 太行 平头 760 声音 确实 760 冷声 人声 好听 甜甜的 没有 低音 高频 亮锐 声场 横向 还行 纵向 声音 性格 akg k701 森海 耳塞 ie 系列 成熟度 整体 立体 mx 系列 情怀 耳塞 苹果 12 索尼 精选 app 效果 非常 hm1000 回来 后接 4.4 平衡 usb dac 试试 效果 淘宝网 c4 电池 索尼 我换 第一 先看 发帖 日期 C4 10 年前 听过 印象 不错 喜欢 续航 最近 湖人 销量 有点 重装 FOOBAR Amanero 驱动 装个 DSDTranscoder 电路 用料 素质 平衡 肯定 高于 单端 有人 味道 理解 素质 难求 味道 好调 几条 解决问题 平衡 架构 缺点 成本 端的 一倍 阻容 元件 配对 要求 关键 输出 次级 绕线 方式 输出 仿着 功放 输出 制作 次级 没有 输出 接头 平衡 没太大 意义 定制 输出 次级 有同 输出 接头 胆机 追求 平衡 叶家 胆机 外观 好看 确实 放到 顶级 耳放 胆机 推原 9500 不错 还好 管子 起来 2a3 300b 那种 便宜 胆机 够不够 看用 知道 老叶 机子 真的 T1 推好 人声 刺激 农夫山泉 有点 味道 丁点 金属 声底 塑料 声底 好听 众人皆醉 独醒 开心 特别 帖子 阴阳怪气 换线 影响 声音 实验 说会 影响 声音 换线 声音 改变 程度 耳机线 解码 耳放 之间 数据线 电源线 gl2k 几个 好友 私聊 不到 预期 效果 降点 预期 超平 几个 低端 型号 声音 表现 正常 价位 带内 性价比 特别 真的 建议 宣传 降点 预期 过犹不及 最近 考虑 旷世 cma12 铁三角 dac100 bha100 套装 知道 选择 宣了 铁三角 西装 耳机 不好 cma12 现在 2000ti adx5000 铁三角 套装 d1 我用 

     绘制词云图

    import wordcloud as wc
    import matplotlib.pyplot as plt
    # from scipy.misc import imread
    from imageio import imread
    from PIL import Image
    def Cloud_words(s,words):
        # 引入字体
        font=r"C:/Windows/Fonts/simhei.ttf"
        mask = np.array(Image.open('love.png'))
    #     image_colors = ImageColorGenerator(mask)
        #从文本中生成词云图
        cloud = wc.WordCloud(font_path=font,#设置字体 
                              background_color='black', # 背景色为白色
                              height=600, # 高度设置为400
                              width=900, # 宽度设置为800
                              scale=20, # 长宽拉伸程度程度设置为20
                              prefer_horizontal=0.2, # 调整水平显示倾向程度为0.2
                              mask=mask, # 添加蒙版
                              max_font_size=100, #字体最大值 
                              max_words=2000, # 设置最大显示字数为1000
                              relative_scaling=0.3, # 设置字体大小与词频的关联程度为0.3
    
                             )
        # 绘制词云图
        mywc = cloud.generate(words)
        plt.imshow(mywc)
        mywc.to_file(str(s)+'.png')

     词云参数说明
     |  font_path : string
     |        使用的字体库
     |  width : int (default=400)
     |      图片宽度
     |  height : int (default=200)
     |      图片高度
     |  mask : nd-array or None (default=None)
     |      图片背景参考形状  
     |  scale : float (default=1)
     |      图幅放大、缩小系数  
     |  min_font_size : int (default=4)
     |      最小的字符
     |  min_font_size : int (default=4)
     |      最大的字符
     |  max_words : number (default=200)
     |      最多显示的词数
     |  stopwords : set of strings or None
     |      不需要显示的词
     |  background_color : color value (default="black")
     |      背景颜色

    s=[s1,s2,s3]
    for i in range(len(s)):
        Cloud_words(i,clean_data(s[i]['content']))

     

    #绘制不同类型的词云图
    import stylecloud
    clouds=stylecloud.gen_stylecloud(
            text=clean_data(s1['content']), # 上面分词的结果作为文本传给text参数
            size=512,
            font_path='C:/Windows/Fonts/msyh.ttc', # 字体设置
            palette='cartocolors.qualitative.Pastel_7', # 调色方案选取,从palettable里选择
            gradient='horizontal', # 渐变色方向选了垂直方向
            icon_name='fab fa-weixin',  # 蒙版选取,从Font Awesome里选
            output_name='test_ciyun.png') # 输出词云图
    

     

     三、计算情感值,情感分析

             # 方法一、SnowNLP计算情感得分

    from snownlp import SnowNLP
    # 评论情感分析
    # f = open('earphone_sentiment.csv',encoding='gbk') 
    # line = f.readline()
    with open('stop_word/HGD_StopWords.txt','r',encoding='utf-8') as f:
        stopwords=set([line.replace('\n','')for line in f])
    f.close()
    sum=0
    count=0
    for i in range(len(data['content'])):
        line=jieba.cut(data.loc[i,'content'])           #分词
        words=''
        for seg in line:
            if seg not in stopwords and seg!=" ":        #文本清洗 
                words=words+seg+' '
        if len(words)!=0:
            print(words)        #输出每一段评论的情感得分
            d=SnowNLP(words)
            print('{}'.format(d.sentiments))
            data.loc[i,'sentiment_score']=float(d.sentiments)     #原数据框中增加情感得分列
            sum+=d.sentiments
            count+=1
    score=sum/count
    print('finalscore={}'.format(score))    #输出最终情感得分

    Silent Angel 期待 光临 共赏 美好 声音 
    0.8879971451804157
    HD650 1k 失真 左声道 右声道 倍 超出 官方 规格 参数 范围 0.05% 看来 坏 
    0.006372539086007101
    达音科 17 周年 倒 数据 最 好看 便宜 
    0.8453378800810628
    bose beats apple 消費者 根本 知道 有曲線 
    0.0670299255258523
    不错 数据 
    0.8964725437060389
    觉得 任何人 都 明确 高端 耳机 之间 区别 不用 出声 都 毕竟 佩戴 感不 还 没法 盲听 
    0.6697479525062867
    听 区别 听 高低 层次 要求 高 
    0.4027925465700134
    有没有 人能 10 条 电源线 里 听出 最贵 哪条 
    0.06920180081214933
    二级 银 耳朵 对号入座 
    0.9946302422290783
    一般来说 所谓 发烧友 起步 铜 耳朵 级别 达 不到 就别 HIFI 浪费 钱 入门级 产品 玩玩 
    0.8071593758525382
    觉得 器材 级别 搭配 达到 听 线材 区别 一件 非常容易 事情 
    0.4360686154799386
    不知 老大 级别 
    0.07532085728034166
    自我 定位 算个 铜 耳朵 
    0.8804268632159121
    还要 分辩 水电 火电 核电 分辨 耳朵 
    0.00866325580357663
    看 最 一级 银 耳朵 顶天 mp3 无损 听 
    0.8742810002926688
    银耳 飘过 
    0.8630530555797126
    正在 测试 希望 论坛 帖子 回复 提醒 功能 整合 APP 里面 
    0.06636056239610733
    网页 手机 版 无法 退到 一层 希望 做好 
    0.27630320357743965
    移动 4G 表示 速度 还 同时在线 人数 比较 稍慢 
    0.6774658960259632
    版块 名称 显示 不全 问题 提交 软件 开发商 估计 改 还要 点 时间 
    0.013924803818858855
    请求 版 加速 上线 
    0.12750503183812079
    消息 互通 设定 难以 理解 
    0.1755363866319708
    太棒了 期待 版本 
    0.9658861331577216
    版 啥时候 
    0.5617283950617286
    看 少问 看得 问题 免问 
    0.13623173447886527
    搜索 有效 
    0.8529411764705881
    晕 一半 都 888 问题 
    0.34195355519847515
    入门 贴子 几个 不太 系统 建议 近期 整理 找些 资料 
    0.05301968665320689
    搜索 方便 ......... 
    0.7965951540697935
    看不懂 
    0.42581389983146645
    论坛 搜索 很快 很爽 经常 
    
    #将情感得分结果保存为新的csv文件
    data.to_csv('result.csv',encoding='gbk',header=True)

    # 方法二、使用字典计算情感得分

    #生成stopword表,需要去除一些否定词和程度词汇
    stopwords = set()
    fr = open('stop_word/HGD_StopWords.txt','r',encoding='utf-8')    #你的停用词典
    for word in fr:
        stopwords.add(word.strip())#Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
    #读取否定词文件
    not_word_file = open('stop_word/情感极性词典/否定词.txt','r+',encoding='utf-8')     #你的否定词
    not_word_list = not_word_file.readlines()
    not_word_list = [w.strip() for w in not_word_list]
    #读取程度副词文件
    degree_file = open('stop_word/情感极性词典/程度词.txt','r+',encoding='utf-8')   #你的程度词典
    degree_list = degree_file.readlines()
    degree_list = [item.split(',')[0] for item in degree_list]
    #生成新的停用词表
    with open('stopwords.txt','w',encoding='utf-8') as f:
        for word in stopwords:
            if(word not in not_word_list) and (word not in degree_list):
                f.write(word+'\n')
    #jieba分词后去除停用词
    def seg_word(sentence):
        seg_list = jieba.cut(sentence)
        seg_result = []
        for i in seg_list:
            seg_result.append(i)
        stopwords = set()
        with open('stopwords.txt','r',encoding='utf-8') as fr:
            for i in fr:
                stopwords.add(i.strip())
        return list(filter(lambda x :x not in stopwords,seg_result)) 
    

    #找出文本中的情感词、否定词和程度副词
    def classify_words(word_list):
        #读取情感词典文件,这里用的是Boson的情感词典
        sen_file = open('stop_word/情感极性词典/BosonNLP_sentiment_score/BosonNLP_sentiment_score.txt','r+',encoding='utf-8')
        #获取词典文件内容
        sen_list = sen_file.readlines()
        #创建情感字典
        sen_dict = defaultdict()
        #读取词典每一行的内容,将其转换成字典对象,key为情感词,value为其对应的权重
        for i in sen_list:
            if len(i.split(' '))==2:
                sen_dict[i.split(' ')[0]] = i.split(' ')[1]
     
        #读取否定词文件
        not_word_file = open('stop_word/情感极性词典/否定词.txt','r+',encoding='utf-8')
        not_word_list = not_word_file.readlines()
        #读取程度副词文件
        degree_file = open('stop_word/情感极性词典/程度词.txt','r+',encoding='utf-8')
        degree_list = degree_file.readlines()
        degree_dict = defaultdict()
        for i in degree_list:
            degree_dict[i.split(',')[0]] = i.split(',')[1]
        sen_word = dict()
        not_word = dict()
        degree_word = dict()
        #分类
        for i in range(len(word_list)):
            word = word_list[i]
            if word in sen_dict.keys() and word not in not_word_list and word not in degree_dict.keys():
                # 找出分词结果中在情感字典中的词
                sen_word[i] = sen_dict[word]
            elif word in not_word_list and word not in degree_dict.keys():
                # 分词结果中在否定词列表中的词
                not_word[i] = -1
            elif word in degree_dict.keys():
                # 分词结果中在程度副词中的词
                degree_word[i]  = degree_dict[word]
        #关闭打开的文件
        sen_file.close()
        not_word_file.close()
        degree_file.close()
        #返回分类结果
        return sen_word,not_word,degree_word
    #计算情感词的分数
    def score_sentiment(sen_word,not_word,degree_word,seg_result):
        #权重初始化为1
        W = 1
        score = 0
        #情感词下标初始化
        sentiment_index = -1
        #情感词的位置下标集合
        sentiment_index_list = list(sen_word.keys())
        #遍历分词结果
        for i in range(0,len(seg_result)):
            #如果是情感词
            if i in sen_word.keys():
                #权重*情感词得分
                score += W*float(sen_word[i])
                #情感词下标加一,获取下一个情感词的位置
                sentiment_index += 1
                if sentiment_index < len(sentiment_index_list)-1:
                    #判断当前的情感词与下一个情感词之间是否有程度副词或否定词
                        for j in range(sentiment_index_list[sentiment_index],sentiment_index_list[sentiment_index+1]):
                        #更新权重,如果有否定词,权重取反
                            if j in not_word.keys():
                                W *= -1
                            elif j in degree_word.keys():
                                W *= float(degree_word[j])	
            #定位到下一个情感词
            if sentiment_index < len(sentiment_index_list)-1:
                i = sentiment_index_list[sentiment_index+1]
        return score
    #计算得分
    def sentiment_score(sentence):
        #1.对文档分词
        seg_list = seg_word(sentence)
        #2.将分词结果转换成字典,找出情感词、否定词和程度副词
        sen_word,not_word,degree_word = classify_words(seg_list)
        #3.计算得分
        score = score_sentiment(sen_word,not_word,degree_word,seg_list)
        return score

    输出每一段评论的情感得分

    for j in data['content']:
        print(j)
        print(sentiment_score(j))

    Silent Angel期待您的光临,共赏美好的声音!
    10.552670574221999
    这只HD650在1k的失真左声道是右声道的6倍左右,也超出官方规格参数范围(0.05%),看来是坏了
    2.5933312704463
    达音科 17周年 倒是数据最好看,而且便宜
    5.579975462234999
    bose,beats,apple的消費者根本不知道有曲線的存在
    0.3332954784020001
    不错的数据
    1.6021290141300002
    我觉得任何人都可以明确分别高端耳机之间的区别,不用出声都可以,毕竟佩戴感不一样,这还没法做到盲听
    2.84759656616
    听出区别是一方面,听出高低的层次要求就更高了。
    2.2631050220558
    有没有人能从10条电源线里,听出最贵的是哪条?
    -1.2240818131445999
    二级银耳朵,对号入座下
    -1.041913843079
    一般来说所谓“发烧友”起步应该是铜耳朵这个级别,达不到的话就别在HIFI上浪费钱了,入门级产品玩玩就可以了。
    0.4704432917620007
    我觉得器材到一定级别,搭配好了,达到听出来线材区别是一件非常容易的事情。
    5.869473466501099
    不知老大是哪个级别的
    -0.857517002685
    自我定位一下,算个铜耳朵吧
    0.5074648951990001
    不是还要能分辩水电,火电和核电的吗。 能分辨这个的是什么耳朵
    0.4965496565720001
    看了下最多到一级银耳朵顶天了。但 mp3 和无损不一定能听出来。
    1.5737450363345127
    银耳飘过。。。
    1.51119199829
    正在测试,希望论坛的帖子回复提醒功能能整合到APP里面
    6.637762547716001
    网页的手机版总是无法退到上一层,希望这个能做好
    1.2570213610820002
    移动4G表示速度还可以,可能同时在线人数比较多的时候,会稍慢
    1.6217040066694
    版块名称有些显示不全,这个问题已经提交给软件开发商了。估计改好还要点时间。
    -0.9109759694777482
    请求IOS版加速上线
    -1.125393308889
    消息不互通这个设定难以理解
    0.6696765210099997
    太棒了, 期待ios版本
    2.35706343041235
    我也要ios的
    0
    IOS版啥时候有?
    0
    多看,少问,看得多了有很多问题可以免问
    -3.020064432938
    用搜索是很有效的!
    4.643811887157001
    晕,。。。。几乎一半都是888的问题。。。。
    -5.434210723521
    入门的贴子也有几个,但是不太系统,你的建议很好,近期我去整理一下,再找些资料。
    -0.7798087453989999
    搜索很方便嘛.........
    3.117499188732
    看不懂
    0
    这论坛搜索很快的,很爽,俺经常用!
    2.208888999055
    不会发有钱也没用啊
    -1.8476097164079999
    支持斑竹,标题不明了的话,有的时候根本就懒得进去看,起码我是这样的,别人我就不知道啦,呵呵~~~~~
    -5.078533520766999
    如果没有人进去看的话,问题也就得不到解决啦,不是吗?
    -4.01522532872507
    鉴于近期出现少数人破坏论坛规则、乱发贴的现象,特参照其他网站制定了更为详细的论坛规则、网站声明等,放在首页,请网友们自觉遵守,如对有其他建议和补充欢迎提出!
    16.098798726017563
    沙发
    -0.206398670202
    hao
    0.225733679789
    学习....
    0.651092081523
    新手的好东西啊!
    1.7774934204895
    温故可知新... 好贴!
    -0.780614420592
    不错的DD~
    3.88808662499
    very good ,God helps me!
    5.6495768461533995
    好贴!~~支持!
    1.81462929609
    好,顶一下
    0
    谢谢啦~~~!
    2.9393605944
    醍醐灌顶
    0
    学习一下
    0.651092081523
    thanx a great deal
    3.039639109753
    谢谢...老鸟们.
    2.9393605944
    感谢~~~烧阿~~
    1.311010973193
    好东西啊~~~~
    0.926729066929
    欢迎上海的烧友们来试听!
    2.8961581727
    离得远精神支持

     四、# 数据可视化展示

    #情感值以方法一计算的作为值
    #获取同一列中不重复的值
    a=list(data['subject'].unique())
    sum_scores=dict()
    #求对应主题的情感均值
    for r in range(len(a)):
        de=data.loc[data['subject']==a[r]]
        sum_scores[a[r]]=round(de['sentiment_score'].mean(),2)
    print(sum_scores)
    

    绘制不同主题下情感值的条形图

    import seaborn as sns
    import matplotlib.pyplot as plt
    # 这两行代码解决 plt 中文显示的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    #数据可视化
    sns.barplot(x=list(sum_scores.values()),y=list(sum_scores.keys()))
    plt.xlabel('情感值')
    plt.ylabel('主题')
    plt.title('不同主题下的情感得分柱形图')
    for x,y in enumerate(list(sum_scores.values())): 
        plt.text(y,x,'%s'%y,va='center')
    plt.show()

    绘制不同情感词下的频数条形图

    bar= data['sentiment_word'].value_counts().head(10)
    print(bar)
    labels = bar.index
    sns.barplot(bar.values,labels)
    plt.xlabel('频数')
    plt.ylabel('情感词')
    plt.title('不同情感词下Top10频数柱形图')
    for x,y in enumerate(bar.values): 
        plt.text(y+0.2,x,'%s' %y,va='center')
    plt.show()

    #获绘制不同情感值的柱形图
    bar= data['sentiment_value'].value_counts()
    labels =list(bar.index)
    print(bar)
    zipp=zip(labels,bar.values)
    sentiment_score=dict(zipp)
    print(sentiment_score)
    # x=bar.values
    sns.barplot(x=list(sentiment_score.keys()),y=list(sentiment_score.values()))
    plt.xlabel('情感值')
    plt.ylabel('频数')
    plt.title('不同情感值下的频数柱形图')
    for x,y in zip(sentiment_score.keys(),sentiment_score.values()): 
        plt.text(x+1,y,'%s'%y,ha='center',va='baseline',fontsize=12)
    plt.show()

     

    五、绘制相关系数热力图 

    import seaborn as sns
    from matplotlib import font_manager
    #按不同主题不同情感值进行分组,求不同主题不同情感值对应的情感得分均值
    w=data.groupby(['subject','sentiment_value'],as_index=False)['sentiment_score'].mean()
    print(w)
    data_heatmap = w.pivot(index = 'subject', columns = 'sentiment_value', values = 'sentiment_score')
    ax = sns.heatmap(data_heatmap,vmax = 1,cmap='rainbow', annot=True,linewidths=0.05) 
    ax.set_title('耳机评论热力图', fontsize = 20)

    展开全文
  • 英文文本: from textblob import TextBlob def getText(): txt = open('comment.text','r',encoding='utf-8').read() txt = txt.lower() for ch in '`~!@#$%^&*()_+-={}[];":,/<>?\|': txt = txt....
  • 如何使用python中文情感分析

    千次阅读 2020-11-04 17:37:55
    python文本情感分析——某APP内评论内容作样本 python 京东商品评论情感分析 snownlp库的使用 基于情感词典的python情感分析 【python机器学习】中文情感分析 百度API情感分析 转载自:如何使用python中文...
  • 中文文本情感分析,可使用多种模型 使用bert模型进行训练测试,执行命令如下 python main.py --model bert 基于训练好的bert模型预测新数据,执行命令如下 python predict.py --model bert --predict "your ...
  • python实现了情感分析的完整项目,包含训练样本,训练好的模型,完整代码。python实现了情感分析的完整项目,包含训练样本,训练好的模型,完整代码。python实现了情感分析的完整项目,包含训练样本,训练好的模型,...
  • 声明因原文格式比较乱,所以我按照自己的方式进行了整理。...若本文侵犯了您的权益,请...定义文本情感分析(sentiment analysis)也称为意见挖掘,是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原...
  • Python训练文本情感分析模型

    万次阅读 多人点赞 2019-08-22 14:51:39
    最近闲来无事,看了 王树义老师 的一篇文章 《如何用Python和机器学习训练中文文本情感分类模型》,跟着步骤做了一个demo,此demo是爬取了美团用户的评论,对评论进行情感分析,收获很大,特此做下了笔记。...
  • 中文情感分析 Python

    2022-05-15 13:19:23
    中文情感分析的实质是文本分类问题,本项目分别采用CNN和BI-LSTM两种模型解决文本分类任务,并用于情感分析,达到不错的效果。 两种模型在小数据集上训练,在验证集的准确率、号回率及F1因子均接近90% 项目设计的...
  • NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分) 输出结果 1、测试对象 data1= '今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加...
  • Python:snownlp中文文本情感分析

    千次阅读 2021-06-19 17:34:38
    hello,大家好,我是wangzirui32,今天来教大家如何使用snownlp的中文文本情感分析功能,开始学习吧! 1. pip 安装 命令: pip install snownlp -i https://pypi.douban.com/simple 因为下载速度很慢,所以使用国内...
  • 重复值处理重复数据对文本分析和建模没有帮助。#删除重复记录()文本内容清理文本中的表达符号和特殊字符通常对文本分析影响不大。通过常规匹配删除文本中指定的字符。清洁前#清理文字内容,特殊符号使用正则表达式...
  • 深度学习,中文情感分析python程序,包含中文酒店用户评论语料数据。
  • Python文本分析

    2019-03-29 15:48:18
    本书遵循结构化和综合性的方法,介绍了文本和语言语法、结构和语义的基础概念和高级概念。从自然语言和Python的基础...使用主题建模和文本摘要分析app或游戏评论, 进行热门电影概要的聚类分析和电影评论的情感分析
  • python 中文情感分析 Snownlp库的使用

    千次阅读 2020-11-29 09:19:58
    文章目录一、Snownlp 简介SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和...
  • python--文本分析

    千次阅读 2020-11-21 01:02:44
    导读文本分析主要用来分词分析,情感分析以及主题分析,参考 知乎用户的文章,他从方法代码上讲解了中英文分词(wordcloud,jieba),中英文情感分析(textblob,snownlp),以及主题分析(LDA).应某位同学的要求,要处理...
  • 今天我们用paddlehub中比较简单的情感倾向分析模型 senta_lstm 来对文本做一个简单的积极和消极的分类。 1.准备 为了实现这个实验,Python是必不可少的,如果你还没有安装Python,建议阅读我们的这篇文章哦:超详细...
  • Python文本情感分析之情感极性分析-深度学习文档类资源96c4cc 在 2020-02-04 01:53:00 上传 2.99 MBPython文本情感分析文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别...

空空如也

空空如也

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

python中文文本情感分析