精华内容
下载资源
问答
  • python情感分析代码

    2019-03-27 10:53:14
    python情感分析代码 源码数据源都有 功能比较全 可以下载参考
  • CNN算法分类 1、 特征提取流程: 详细见代码cnews_loader.py。 其中定义了以下函数,即为其整体流程。主要目的就是把文本转为词向量,建立id对应,因为只有数字才能计算。
  • 代码包括数据处理,模型训练,对新数据做出预测,并将预测结果(正向情感)保存到result.txt中 软件:anaconda3 一.数据集介绍 数据集链接: https://pan.baidu.com/s/1oIXkaL_SL9GSN3S56ZwvWQ 提取码: qgtg 训练集...
  • python机器学习——文本情感分析(英文文本情感分析代码下载,代码完整可以运行。希望可以帮助到正在学习的伙伴们。
  • 情感分析文本分析的一种,它能够从一段文本描述中理解文本的感情色彩,是褒义、贬义还是中性。常见的情感分析的使用场景就是客户对商品或服务的评价、反馈,传统模式下的人工审核,不仅消耗大量人力,而且效率...
  • Python文本情感分析实战【源码】

    千次阅读 2020-10-03 17:52:43
    Python文本情感分析 引言: 情感分析:又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等...

    Python文本情感分析

    引言: 情感分析:又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等。
    情感极性分析的目的是对文本进行褒义、贬义、中性的判断。在大多应用场景下,只分为两类。例如对于“喜爱”和“厌恶”这两个词,就属于不同的情感倾向。
    比如我们标注数据集,标签为1表示积极情感,0位中立情感,-1为消极情感。
    一、实验前的准备:
    其中数据集如下所示:
    在这里插入图片描述

    二、数据分析
    首先读取csv文件数据,存储入变量。统一存入TXT文件,以方便和清晰的看到训练和测试数据。见代码data.py。
    ‘’‘生成TXT文件’’’
    for i in range(len(x_train)):
    f=open(“cnews/train.txt”,“a+”,encoding=‘utf-8’)
    f.write(str(y_train.values[i])+"\t"+str(x_train [i])+"\n")
    f.close()
    print(“train数据集生成完成!”)
    for i in range(len(x_test)):
    f=open(“cnews/test.txt”,“a+”,encoding=‘utf-8’)
    f.write(str(float(y_test.values[i]))+"\t"+str(x_test [i])+"\n")
    f.close()
    print(“test数据集生成完成!”)
    for i in range(len(x_train1)):
    f=open(“cnews/val.txt”,“a+”,encoding=‘utf-8’)
    f.write(str(y_train1.values[i])+"\t"+str(x_train1 [i])+"\n")
    f.close()
    print(“val数据集生成完成!”)
    最终生成了以下几个文档:
    在这里插入图片描述

    三、CNN算法分类
    1、 特征提取流程:
    详细见代码cnews_loader.py。
    其中定义了以下函数,即为其整体流程。主要目的就是把文本转为词向量,建立id对应,因为只有数字才能计算。
    read_file(): 读取文件数据;
    build_vocab(): 构建词汇表,使用字符级的表示,这一函数会将词汇表存储下来,避免每一次重复处理;
    read_vocab(): 读取上一步存储的词汇表,转换为{词:id}表示;
    read_category(): 将分类目录固定,转换为{类别: id}表示;
    to_words(): 将一条由id表示的数据重新转换为文字;
    process_file(): 将数据集从文字转换为固定长度的id序列表示;
    2、 模型算法:
    主要见代码cnn_model.py。
    这里我们使用深度学习模型CNN卷积神经网络提取特征。
    其中需要设定的参数:
    embedding_dim = 64 # 词向量维度
    seq_length = 600 # 序列长度
    num_classes = 4 # 类别数
    num_filters = 128 # 卷积核数目
    kernel_size = 5 # 卷积核尺寸
    vocab_size = 5000 # 词汇表达小
    hidden_dim = 128 # 全连接层神经元
    dropout_keep_prob = 0.5 # dropout保留比例
    learning_rate = 1e-3 # 学习率
    batch_size = 64 # 每批训练大小
    num_epochs = 10 # 总迭代轮次
    print_per_batch = 100 # 每多少轮输出一次结果
    save_per_batch = 10 # 每多少轮存入tensorboard
    然后是模型的初始化:
    def init(self, config):
    self.config = config
    # 三个待输入的数据
    self.input_x = tf.placeholder(tf.int32, [None, self.config.seq_length], name=‘input_x’)
    self.input_y = tf.placeholder(tf.float32, [None, self.config.num_classes], name=‘input_y’)
    self.keep_prob = tf.placeholder(tf.float32, name=‘keep_prob’)
    self.cnn()
    神经网络整体定义,包括训练器的选择、卷积层、全连接等定义。
    def cnn(self):
    “”“CNN模型”""
    # 词向量映射
    with tf.device(’/cpu:0’):
    embedding = tf.get_variable(‘embedding’, [self.config.vocab_size, self.config.embedding_dim])
    embedding_inputs = tf.nn.embedding_lookup(embedding, self.input_x)
    with tf.name_scope(“cnn”):
    # CNN layer
    conv = tf.layers.conv1d(embedding_inputs, self.config.num_filters, self.config.kernel_size, name=‘conv’)
    # global max pooling layer
    gmp = tf.reduce_max(conv, reduction_indices=[1], name=‘gmp’)
    with tf.name_scope(“score”):
    # 全连接层,后面接dropout以及relu激活
    fc = tf.layers.dense(gmp, self.config.hidden_dim, name=‘fc1’)
    fc = tf.contrib.layers.dropout(fc, self.keep_prob)
    fc = tf.nn.relu(fc)
    # 分类器
    self.logits = tf.layers.dense(fc, self.config.num_classes, name=‘fc2’)
    self.y_pred_cls = tf.argmax(tf.nn.softmax(self.logits), 1) # 预测类别
    with tf.name_scope(“optimize”):
    # 损失函数,交叉熵
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=self.input_y)
    self.loss = tf.reduce_mean(cross_entropy)
    # 优化器
    self.optim = tf.train.AdamOptimizer(learning_rate=self.config.learning_rate).minimize(self.loss)
    with tf.name_scope(“accuracy”):
    # 准确率
    correct_pred = tf.equal(tf.argmax(self.input_y, 1), self.y_pred_cls)
    self.acc = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    3、 模型训练:
    模型的训练和测试都在代码test.py。218行注释掉test()函数,216行启用train()函数就是训练。
    这里整体流程就是按照上面说的进行执行调用而言:
    def train():
    print(“Configuring TensorBoard and Saver…”)
    # 配置 Tensorboard,重新训练时,请将tensorboard文件夹删除,不然图会覆盖
    tensorboard_dir = ‘tensorboard/textcnn’
    if not os.path.exists(tensorboard_dir):
    os.makedirs(tensorboard_dir)
    tf.summary.scalar(“loss”, model.loss)
    tf.summary.scalar(“accuracy”, model.acc)
    merged_summary = tf.summary.merge_all()
    writer = tf.summary.FileWriter(tensorboard_dir)
    # 配置 Saver
    saver = tf.train.Saver()
    if not os.path.exists(save_dir):
    os.makedirs(save_dir)
    print(“Loading training and validation data…”)
    # 载入训练集与验证集
    start_time = time.time()
    x_train, y_train = process_file(train_dir, word_to_id, cat_to_id, config.seq_length)
    x_val, y_val = process_file(val_dir, word_to_id, cat_to_id, config.seq_length)
    time_dif = get_time_dif(start_time)
    print(“Time usage:”, time_dif)
    # 创建session
    session = tf.Session()
    session.run(tf.global_variables_initializer())
    writer.add_graph(session.graph)
    print(‘Training and evaluating…’)
    start_time = time.time()
    total_batch = 0 # 总批次
    best_acc_val = 0.0 # 最佳验证集准确率
    last_improved = 0 # 记录上一次提升批次
    require_improvement = 1000 # 如果超过1000轮未提升,提前结束训练
    flag = False
    for epoch in range(config.num_epochs):
    print(‘Epoch:’, epoch + 1)
    batch_train = batch_iter(x_train, y_train, config.batch_size)
    for x_batch, y_batch in batch_train:
    feed_dict = feed_data(x_batch, y_batch, config.dropout_keep_prob)
    if total_batch % config.save_per_batch == 0:
    # 每多少轮次将训练结果写入tensorboard scalar
    s = session.run(merged_summary, feed_dict=feed_dict)
    writer.add_summary(s, total_batch)
    if total_batch % config.print_per_batch == 0:
    # 每多少轮次输出在训练集和验证集上的性能
    feed_dict[model.keep_prob] = 1.0
    loss_train, acc_train = session.run([model.loss, model.acc], feed_dict=feed_dict)
    loss_val, acc_val = evaluate(session, x_val, y_val) # todo
    if acc_val > best_acc_val:
    # 保存最好结果
    best_acc_val = acc_val
    last_improved = total_batch
    saver.save(sess=session, save_path=save_path)
    improved_str = ‘*’
    else:
    improved_str = ‘’
    time_dif = get_time_dif(start_time)
    msg = ‘Iter: {0:>6}, Train Loss: {1:>6.2}, Train Acc: {2:>7.2%},’
    + ’ Val Loss: {3:>6.2}, Val Acc: {4:>7.2%}, Time: {5} {6}’
    print(msg.format(total_batch, loss_train, acc_train, loss_val, acc_val, time_dif, improved_str))
    session.run(model.optim, feed_dict=feed_dict) # 运行优化
    total_batch += 1
    if total_batch - last_improved > require_improvement:
    # 验证集正确率长期不提升,提前结束训练
    print(“No optimization for a long time, auto-stopping…”)
    flag = True
    break # 跳出循环
    if flag: # 同上
    break
    训练过程如下:
    在这里插入图片描述

    4、 模型测试:
    读取test.txt评估模型准确率。216行注释掉train()函数,218行启用test()函数
    def test():
    print(“Loading test data…”)
    start_time = time.time()
    x_test, y_test = process_file(test_dir, word_to_id, cat_to_id, config.seq_length)
    session = tf.Session()
    session.run(tf.global_variables_initializer())
    saver = tf.train.Saver()
    saver.restore(sess=session, save_path=save_path) # 读取保存的模型
    print(‘Testing…’)
    loss_test, acc_test = evaluate(session, x_test, y_test)
    msg = ‘Test Loss: {0:>6.2}, Test Acc: {1:>7.2%}’
    print(msg.format(loss_test, acc_test))
    batch_size = 128
    data_len = len(x_test)
    num_batch = int((data_len - 1) / batch_size) + 1
    y_test_cls = np.argmax(y_test, 1)
    y_pred_cls = np.zeros(shape=len(x_test), dtype=np.int32) # 保存预测结果
    for i in range(num_batch): # 逐批次处理
    start_id = i * batch_size
    end_id = min((i + 1) * batch_size, data_len)
    feed_dict = {
    model.input_x: x_test[start_id:end_id],
    model.keep_prob: 1.0
    }
    y_pred_cls[start_id:end_id] = session.run(model.y_pred_cls, feed_dict=feed_dict)
    # 评估
    print(“Precision, Recall and F1-Score…”)
    categories = [native_content(x) for x in [‘0.0’, ‘1.0’, ‘-1.0’]]
    print(metrics.classification_report(y_test_cls, y_pred_cls, target_names=categories))
    # 混淆矩阵
    print(“Confusion Matrix…”)
    cm = metrics.confusion_matrix(y_test_cls, y_pred_cls)
    print(cm)

    time_dif = get_time_dif(start_time)
    print("Time usage:", time_dif)
    

    测试结果如下:最终模型准确度92%
    在这里插入图片描述

    源码地址:
    链接:https://pan.baidu.com/s/1vDwaXtsormyX9JchNscpFQ
    提取码:l0g7
    欢迎大家关注公众号

    在这里插入图片描述

    展开全文
  • 今天给大家带来我刚刚实现了的简单多文本情感分析代码,代码环境python3.5原理比如这么一句话:“这手机的画面极好,操作也比较流畅。不过拍照真的太烂了!系统也不好。”① 情感词要分析一句话是积极的还是消极的,...

    很久没在公众号发布新内容,在这段时间内没想到有这么多python爱好者关注了我,港真的,心里很兴奋激动。

    今天给大家带来我刚刚实现了的简单多文本情感分析代码,代码环境python3.5

    原理

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

    ① 情感词

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

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

    ② 程度词

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

    ③ 感叹号

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

    ④ 否定词

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

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

    ⑤ 积极和消极分开来

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

    ⑥ 以分句的情感为基础

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

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

    算法设计

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

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

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

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

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

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

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

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

    实战这里是我参考已有代码,结合自己需要,对代码进行了简单的修改。本脚本运行环境是python3.5 ,使用2.x的盆友们见谅。先做个问卷,代码及词典链接在问卷后面

    运行代码及词典下载链接:https://pan.baidu.com/s/1jIRoOxK密码: 6wq4下载完代码,一定要注意代码中的path,修改成泥电脑中的文件路径,否则没法用。

    知乎ID:邓旭东HIT

    展开全文
  • python 进行文本情感分析

    千次阅读 多人点赞 2020-06-09 22:37:05
    wordcloud强调python版本,snownlp和jieba不强调版本,我装的都是python3.6下的。 数据:和鲸社区数据-京东2k条评论 import pandas as pd data = pd.read_csv('C:/Users/admin/Desktop/新建文件夹/京东评论数据.csv'...

    wordcloud安装参考:下载安装wordcloud
    snownlp安装参考:下载安装snownlp
    jieba安装参考:使用码云下载Github文件
    wordcloud强调python版本,snownlp和jieba不强调版本,我装的都是python3.6下的。
    数据:和鲸社区数据-京东2k条评论

    import pandas as pd
    data = pd.read_csv('C:/Users/admin/Desktop/新建文件夹/京东评论数据.csv')
    data.head(2)
    
    sku_id_iditem_namecomment_idcontentcreation_timereply_countscoreuseful_vote_countuseless_vote_count...user_provincenicknameuser_level_nameuser_clientuser_client_showis_mobiledaysreference_timeafter_daysafter_user_comment
    0753411303b51aa9-2b5e-41c3-a40b-343164a1d23acomment11801751173还可以刷脸解锁,帮朋友买的,她很满意2018-08-13 12:24:590500...NaNk***0PLUS会员2来自京东iPhone客户端1.04.02018-08-09 13:38:150.0NO_MESSAGE
    1753411303b51aa9-2b5e-41c3-a40b-343164a1d23acomment11525358140第一次买vivo,真心不错,1498的机子,没想到照相很清晰,性价比很高,买值了,还送了小音...2018-05-27 17:49:1775190...NaN呢***呐PLUS会员4来自京东Android客户端1.05.02018-05-22 09:32:370.0NO_MESSAGE

    2 rows × 21 columns

    data1 = data[['sku_id','content']]
    data1.head(10)
    
    sku_idcontent
    07534113还可以刷脸解锁,帮朋友买的,她很满意
    17534113第一次买vivo,真心不错,1498的机子,没想到照相很清晰,性价比很高,买值了,还送了小音...
    27534113手机好用快递送的快。
    38240587手机收到。外观设计很好!美观大方。我喜欢!一直使用华为手机。从荣耀七,荣耀八,荣耀九。反正一...
    45942439收到了,挺好的,声音大,电池大,好用发货速度快,非常满意,好好好。
    55089275本来觉得双十一还会便宜的,想不到和11月初的价格差不多,想想还是感觉入手了,早买早享受。我的...
    67081550没有真正意义上的窄边框,不过已经不错了,手机流畅,另外还有51G空间可用,同时试了下近距拍摄...
    75663902幻夜黑颜色很漂亮,2.5D屏幕,圆润。2K屏很清晰,惊艳
    87283905特地用了一段时间才来评价,这手机值得这个价钱,打游戏还行,就是电池很不耐用,摄像头也很突出,...
    95001213机器没得说,价格也合理,虽说仍有不足,但还是比较满意的,首发就抢到了,暂时发现的不足就是扬声...

    情感分析

    from snownlp import SnowNLP
    data1['emotion'] = data1['content'].apply(lambda x:SnowNLP(x).sentiments)
    data1.head(10)
    
    E:\Anconda\programfiles\lib\site-packages\ipykernel\__main__.py:2: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    
    See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      from ipykernel import kernelapp as app
    
    sku_idcontentemotion
    07534113还可以刷脸解锁,帮朋友买的,她很满意0.470635
    17534113第一次买vivo,真心不错,1498的机子,没想到照相很清晰,性价比很高,买值了,还送了小音...0.999999
    27534113手机好用快递送的快。0.561609
    38240587手机收到。外观设计很好!美观大方。我喜欢!一直使用华为手机。从荣耀七,荣耀八,荣耀九。反正一...0.868183
    45942439收到了,挺好的,声音大,电池大,好用发货速度快,非常满意,好好好。0.983088
    55089275本来觉得双十一还会便宜的,想不到和11月初的价格差不多,想想还是感觉入手了,早买早享受。我的...0.984574
    67081550没有真正意义上的窄边框,不过已经不错了,手机流畅,另外还有51G空间可用,同时试了下近距拍摄...0.956682
    75663902幻夜黑颜色很漂亮,2.5D屏幕,圆润。2K屏很清晰,惊艳0.999839
    87283905特地用了一段时间才来评价,这手机值得这个价钱,打游戏还行,就是电池很不耐用,摄像头也很突出,...0.996540
    95001213机器没得说,价格也合理,虽说仍有不足,但还是比较满意的,首发就抢到了,暂时发现的不足就是扬声...0.992436
    data1.describe()
    
    sku_idemotion
    count3.637000e+033637.000000
    mean7.936312e+090.746161
    std1.165137e+100.354481
    min1.592994e+060.000000
    25%5.920651e+060.562240
    50%7.651903e+060.962449
    75%2.034912e+100.999123
    max3.032369e+101.000000

    emotion平均值为0.74,中位数为0.96,25%分位数为0.56,可见不到25%的数据造成了整体均值的较大下移。

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    bins=np.arange(0,1.1,0.1)
    plt.hist(data1['emotion'],bins,color='#4F94CD',alpha=0.9)
    plt.xlim(0,1)
    plt.xlabel('情感分')
    plt.ylabel('数量')
    plt.title('情感分直方图')
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sptxJnq5-1591712744516)(output_6_0.png)]

    由直方图可见,评论内容两级分化较为严重。
    3637条评论中有约2200条评论情感分在[0.9,1]区间内;同时,有约500条评论情感分在[0,0.1]区间内。

    from wordcloud import WordCloud
    import jieba
    w = WordCloud(font_path="msyh.ttc")   #font_path="msyh.ttc",设置字体,否则显示不出来
    text = ''
    for s in data['content']:
        text += s
    data_cut = ' '.join(jieba.lcut(text))
    w.generate(data_cut)
    image = w.to_file('词云图.png')
    

    在这里插入图片描述
    WordCloud各参数:https://blog.csdn.net/yaochuyi/article/details/80094659

    #关键词top10
    from jieba import analyse 
    key_words = jieba.analyse.extract_tags(sentence=text, topK=10, withWeight=True, allowPOS=())
    key_words
    
    [('手机', 0.20904023041744998),
     ('不错', 0.10491967558213072),
     ('京东', 0.09431019624843097),
     ('屏幕', 0.054966423247022445),
     ('华为', 0.05061411737589104),
     ('小米', 0.04731076382922812),
     ('拍照', 0.04647606302614274),
     ('非常', 0.044200923839597485),
     ('手感', 0.04270424332006433),
     ('感觉', 0.040063432512755605)]
    

    参数说明 :
    sentence 需要提取的字符串,必须是str类型,不能是list
    topK 提取前多少个关键字
    withWeight 是否返回每个关键词的权重
    allowPOS是允许的提取的词性,默认为allowPOS=‘ns’, ‘n’, ‘vn’, ‘v’,提取地名、名词、动名词、动词

    积极评论与消极评论

    #计算积极评论与消极评论各自的数目
    pos = 0
    neg = 0
    for i in data1['emotion']:
        if i >= 0.5:
            pos += 1
        else:
            neg += 1
    print('积极评论,消极评论数目分别为:')
    pos,neg
    
    积极评论,消极评论数目分别为:
    

    (2791, 846)

    # 积极评论占比
    import matplotlib.pyplot as plt 
    
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    pie_labels='postive','negative'
    plt.pie([pos,neg],labels=pie_labels,autopct='%1.1f%%',shadow=True)
    
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZRPTzVB-1591712744520)(output_14_0.png)]

    #获取消极评论数据
    data2=data1[data1['emotion']<0.5]
    data2.head(10)
    
    sku_idcontentemotion
    07534113还可以刷脸解锁,帮朋友买的,她很满意0.470635
    135942439收到货,声音很大,功能也多,适合老人用,就是重量有点重,0.461794
    17728390527号下的单,今天收到1星期内,坐标河南商丘,手机是武汉仓过来的。充电头是5V2A的 不支持...0.001627
    185001213今天刚收到!\n看到京东的快递包装盒,我内心是一群奔腾而过的!几千块钱的物品包装,没有防压提...0.495955
    225942439用着目前还可以,就是不知道可以用多久。希望久一些吧。0.239150
    325001213第一批抢到,两天后才收到,机器没一代惊艳,边框略粗,全面屏?解决了通话,回归正常手机行列!!...0.444317
    358240587总体来说,颜值非常高,很好看,虽然说是后置指纹,但是后背看起来还是挺不错的。用起来整体体验还...0.000012
    443901175手机还可以,就刚开始把卡放进去的时候不显示卡,过了第二天才显示出来,耳机也没有,还有就是怎么...0.005839
    487534113像素不行,反正买都买了用都用了总体来说还行吧不讨厌也不喜欢一般般,暂时没有什么问题0.499447
    515089275总之还是挺好的,挺不错、虽然没有什么优惠吧,抢了个神券还不能用!!!也是用的上了第三个苹果、...0.457264
    #消极评论词云图
    text2 = ''
    for s in data2['content']:
        text2 += s
    data_cut2 = ' '.join(jieba.lcut(text2))
    w.generate(data_cut2)
    image = w.to_file('消极评论词云.png')
    

    在这里插入图片描述

    #消极评论关键词top10
    key_words = jieba.analyse.extract_tags(sentence=text2, topK=10, withWeight=True, allowPOS=())
    key_words
    
    [('手机', 0.19237764869875004),
     ('京东', 0.08930157104159077),
     ('未填写', 0.08087213276666493),
     ('评价', 0.06602737843353074),
     ('屏幕', 0.05285184715212572),
     ('快递', 0.050103021155518554),
     ('用户', 0.05005720904465942),
     ('充电', 0.04605195695403029),
     ('收到', 0.038929704221495554),
     ('没有', 0.03758001077768642)]
    

    消极评论关键词显示,“屏幕”“快递”“充电”是造成用户体验不佳的几个重要因素,屏幕和充电问题有可能是手机不良品率过高或快递压迫。
    因此平台应注重提高手机品控,降低不良品率,另外应设法提升发货,派送,派件的效率和质量。
    本文使用jieba,snownlp,wordcloud,matplotlib等模块对文本数据进行了简要的情感分析及可视化,旨在了解用户使用体验,以此改进对平台运营提出优化建议。

    展开全文
  • 主要介绍了Python实现购物评论文本情感分析操作,结合实例形式分析了Python使用中文文本挖掘库snownlp操作中文文本进行感情分析的相关实现技巧与注意事项,需要的朋友可以参考下
  • Python文本情感分析之情感极性分析

    万次阅读 多人点赞 2018-04-15 21:22:53
    导语「NLP」最为目前及其火热...按照处理文本的类别不同,可分为基于新闻评论的情感分析和基于产品评论的情感分析。其中,前者多用于舆情监控和信息预测,后者可帮助用户了解某一产品在大众心目中的口碑。目前常见的...

    导语

    「NLP」最为目前及其火热的一个领域,已经逐渐渗透进越来越多产业的各项业务中,不知死活的胖子决定对常用的应用功能挨个进行尝试,死活不论……

    0. 介绍

    「情感极性分析」是对带有感情色彩的主观性文本进行分析、处理、归纳和推理的过程。按照处理文本的类别不同,可分为基于新闻评论的情感分析和基于产品评论的情感分析。其中,前者多用于舆情监控和信息预测,后者可帮助用户了解某一产品在大众心目中的口碑。
    目前常见的情感极性分析方法主要是两种:基于情感词典的方法和基于机器学习的方法。

    1. 基于情感词典的文本情感极性分析

    笔者是通过情感打分的方式进行文本情感极性判断,score > 0判断为正向,score < 0判断为负向。

    1.1 数据准备

    1.1.1 情感词典及对应分数

    词典来源于BosonNLP数据下载情感词典,来源于社交媒体文本,所以词典适用于处理社交媒体的情感分析。

    词典把所有常用词都打上了唯一分数有许多不足之处。

    • 之一,不带情感色彩的停用词会影响文本情感打分。在
    • 之二,由于中文的博大精深,词性的多变成为了影响模型准确度的重要原因。
      一种情况是同一个词在不同的语境下可以是代表完全相反的情感意义,用笔者模型预测偏差最大的句子为例(来源于朋友圈文本):
      有车一族都用了这个宝贝,后果很严重哦[偷笑][偷笑][偷笑]1,交警工资估计会打5折,没有超速罚款了[呲牙][呲牙][呲牙]2,移动联通公司大幅度裁员,电话费少了[呲牙][呲牙][呲牙]3,中石化中石油裁员2成,路痴不再迷路,省油[悠闲][悠闲][悠闲]5,保险公司裁员2成,保费折上折2成,全国通用[憨笑][憨笑][憨笑]买不买你自己看着办吧[调皮][调皮][调皮]
      里面严重等词都是表达的相反意思,甚至整句话一起表示相反意思,不知死活的笔者还没能深入研究如何用词典的方法解决这类问题,但也许可以用机器学习的方法让神经网络进行学习能够初步解决这一问题。
      另外,同一个词可作多种词性,那么情感分数也不应相同,例如:
      这部电影真垃圾
      垃圾
      分类
      很明显在第一句中垃圾表现强烈的贬义,而在第二句中表示中性,单一评分对于这类问题的分类难免有失偏颇。
    1.1.2 否定词词典

    否定词的出现将直接将句子情感转向相反的方向,而且通常效用是叠加的。常见的否定词:不、没、无、非、莫、弗、勿、毋、未、否、别、無、休、难道等。

    1.1.3 程度副词词典

    既是通过打分的方式判断文本的情感正负,那么分数绝对值的大小则通常表示情感强弱。既涉及到程度强弱的问题,那么程度副词的引入就是势在必行的。词典可从《知网》情感分析用词语集(beta版)下载。词典内数据格式可参考如下格式,即共两列,第一列为程度副词,第二列是程度数值,> 1表示强化情感,< 1表示弱化情感。

    程度副词词典

    1.1.4 停用词词典

    科院计算所中文自然语言处理开放平台发布了有1208个停用词的中文停用词表,也有其他不需要积分的下载途径

    1.2 数据预处理

    1.2.1 分词

    即将句子拆分为词语集合,结果如下:
    e.g. 这样/的/酒店/配/这样/的/价格/还算/不错

    Python常用的分词工具:

    • 结巴分词 Jieba
    • Pymmseg-cpp
    • Loso
    • smallseg
    from collections import defaultdict
    import os
    import re
    import jieba
    import codecs
    
    """
    1. 文本切割
    """
    
    def sent2word(sentence):
        """
        Segment a sentence to words
        Delete stopwords
        """
        segList = jieba.cut(sentence)
        segResult = []
        for w in segList:
            segResult.append(w)
    
        stopwords = readLines('stop_words.txt')
        newSent = []
        for word in segResult:
            if word in stopwords:
                # print "stopword: %s" % word
                continue
            else:
                newSent.append(word)
    
        return newSent
    

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

    1.2.2 去除停用词

    遍历所有语料中的所有词语,删除其中的停用词
    e.g. 这样/的/酒店/配/这样/的/价格/还算/不错
    --> 酒店/配/价格/还算/不错

    1.3 构建模型

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

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

    """
    2. 情感定位
    """
    def classifyWords(wordDict):
        # (1) 情感词
        senList = readLines('BosonNLP_sentiment_score.txt')
        senDict = defaultdict()
        for s in senList:
            senDict[s.split(' ')[0]] = s.split(' ')[1]
        # (2) 否定词
        notList = readLines('notDict.txt')
        # (3) 程度副词
        degreeList = readLines('degreeDict.txt')
        degreeDict = defaultdict()
        for d in degreeList:
            degreeDict[d.split(',')[0]] = d.split(',')[1]
        
        senWord = defaultdict()
        notWord = defaultdict()
        degreeWord = defaultdict()
        
        for word in wordDict.keys():
            if word in senDict.keys() and word not in notList and word not in degreeDict.keys():
                senWord[wordDict[word]] = senDict[word]
            elif word in notList and word not in degreeDict.keys():
                notWord[wordDict[word]] = -1
            elif word in degreeDict.keys():
                degreeWord[wordDict[word]] = degreeDict[word]
        return senWord, notWord, degreeWord
    
    1.3.2 计算句子得分

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

    定义一个情感词语组:两情感词之间的所有否定词和程度副词与这两情感词中的后一情感词构成一个情感词组,即notWords + degreeWords + sentiWords,例如不是很交好,其中不是为否定词,为程度副词,交好为情感词,那么这个情感词语组的分数为:
    finalSentiScore = (-1) ^ 1 * 1.25 * 0.747127733968
    其中1指的是一个否定词,1.25是程度副词的数值,0.747127733968交好的情感分数。

    伪代码如下:
    finalSentiScore = (-1) ^ (num of notWords) * degreeNum * sentiScore
    finalScore = sum(finalSentiScore)

    """
    3. 情感聚合
    """
    def scoreSent(senWord, notWord, degreeWord, segResult):
        W = 1
        score = 0
        # 存所有情感词的位置的列表
        senLoc = senWord.keys()
        notLoc = notWord.keys()
        degreeLoc = degreeWord.keys()
        senloc = -1
        # notloc = -1
        # degreeloc = -1
        
        # 遍历句中所有单词segResult,i为单词绝对位置
        for i in range(0, len(segResult)):
            # 如果该词为情感词
            if i in senLoc:
                # loc为情感词位置列表的序号
                senloc += 1
                # 直接添加该情感词分数
                score += W * float(senWord[i])
                # print "score = %f" % score
                if senloc < len(senLoc) - 1:
                    # 判断该情感词与下一情感词之间是否有否定词或程度副词
                    # j为绝对位置
                    for j in range(senLoc[senloc], senLoc[senloc + 1]):
                        # 如果有否定词
                        if j in notLoc:
                            W *= -1
                        # 如果有程度副词
                        elif j in degreeLoc:
                            W *= float(degreeWord[j])
            # i定位至下一个情感词
            if senloc < len(senLoc) - 1:
                i = senLoc[senloc + 1]
        return score
    

    1.4 模型评价

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

    Score Distribution

    其中大多数文本被判为正向文本符合实际情况,且绝大多数文本的情感得分的绝对值在10以内,这是因为笔者在计算一个文本的情感得分时,以句号作为一句话结束的标志,在一句话内,情感词语组的分数累加,如若一个文本中含有多句话时,则取其所有句子情感得分的平均值

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

    • 首先,段落的得分是其所有句子得分的平均值,这一方法并不符合实际情况。正如文章中先后段落有重要性大小之分,一个段落中前后句子也同样有重要性的差异。
    • 其次,有一类文本使用贬义词来表示正向意义,这类情况常出现与宣传文本中,还是那个例子:
      有车一族都用了这个宝贝,后果很严重哦[偷笑][偷笑][偷笑]1,交警工资估计会打5折,没有超速罚款了[呲牙][呲牙][呲牙]2,移动联通公司大幅度裁员,电话费少了[呲牙][呲牙][呲牙]3,中石化中石油裁员2成,路痴不再迷路,省油[悠闲][悠闲][悠闲]5,保险公司裁员2成,保费折上折2成,全国通用[憨笑][憨笑][憨笑]买不买你自己看着办吧[调皮][调皮][调皮]2980元轩辕魔镜带回家,推广还有返利[得意]
      Score Distribution中得分小于-10的几个文本都是与这类情况相似,这也许需要深度学习的方法才能有效解决这类问题,普通机器学习方法也是很难的。
    • 对于正负向文本的判断,该算法忽略了很多其他的否定词、程度副词和情感词搭配的情况;用于判断情感强弱也过于简单。

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

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

    2.1 还是数据准备

    2.1.1 停用词

    (同1.1.4)

    2.1.2 正负向语料库

    来源于有关中文情感挖掘的酒店评论语料,其中正向7000条,负向3000条(笔者是不是可以认为这个世界还是充满着满满的善意呢…),当然也可以参考情感分析资源(转)使用其他语料作为训练集。

    2.1.3 验证集

    Amazon上对iPhone 6s的评论,来源已不可考……

    2.2 数据预处理

    2.2.1 还是要分词

    (同1.2.1)

    import numpy as np
    import sys
    import re
    import codecs
    import os
    import jieba
    from gensim.models import word2vec
    from sklearn.cross_validation import train_test_split
    from sklearn.externals import joblib
    from sklearn.preprocessing import scale
    from sklearn.svm import SVC
    from sklearn.decomposition import PCA
    from scipy import stats
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Activation
    from keras.optimizers import SGD
    from sklearn.metrics import f1_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)
        output = ''.join(list(seg_list)) # use space to join them
        return output
    
    2.2.2 也要去除停用词

    (同1.2.2)

    2.2.3 训练词向量

    (重点来了!)模型的输入需是数据元组,那么就需要将每条数据的词语组合转化为一个数值向量

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

    • Bag of Words
    • TF-IDF
    • Word2Vec

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

    def getWordVecs(wordList):
        vecs = []
        for word in wordList:
            word = word.replace('\n', '')
            try:
                vecs.append(model[word])
            except KeyError:
                continue
        # vecs = np.concatenate(vecs)
        return np.array(vecs, dtype = 'float')
    
    
    def buildVecs(filename):
        posInput = []
        with open(filename, "rb") as txtfile:
            # print txtfile
            for lines in txtfile:
                lines = lines.split('\n ')
                for line in lines:            
                    line = jieba.cut(line)
                    resultList = getWordVecs(line)
                    # for each sentence, the mean vector of all its vectors is used to represent this sentence
                    if len(resultList) != 0:
                        resultArray = sum(np.array(resultList))/len(resultList)
                        posInput.append(resultArray)
    
        return posInput
    
    # load word2vec model
    model = word2vec.Word2Vec.load_word2vec_format("corpus.model.bin", binary = True)
    # txtfile = [u'标准间太差房间还不如3星的而且设施非常陈旧.建议酒店把老的标准间从新改善.', u'在这个西部小城市能住上这样的酒店让我很欣喜,提供的免费接机服务方便了我的出行,地处市中心,购物很方便。早餐比较丰富,服务人员很热情。推荐大家也来试试,我想下次来这里我仍然会住这里']
    posInput = buildVecs('pos.txt')
    negInput = buildVecs('pos.txt')
    
    # use 1 for positive sentiment, 0 for negative
    y = np.concatenate((np.ones(len(posInput)), np.zeros(len(negInput))))
    
    X = posInput[:]
    for neg in negInput:
        X.append(neg)
    X = np.array(X)
    
    2.2.4 标准化

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

    # standardization
    X = scale(X)

    2.2.5 降维

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


    # PCA
    # Plot the PCA spectrum
    pca.fit(X)
    plt.figure(1, figsize=(4, 3))
    plt.clf()
    plt.axes([.2, .2, .7, .7])
    plt.plot(pca.explained_variance_, linewidth=2)
    plt.axis('tight')
    plt.xlabel('n_components')
    plt.ylabel('explained_variance_')
    
    X_reduced = PCA(n_components = 100).fit_transform(X)
    

    2.3 构建模型

    2.3.1 SVM (RBF) + PCA

    SVM (RBF)分类表现更为宽松,且使用PCA降维后的模型表现有明显提升,misclassified多为负向文本被分类为正向文本,其中AUC = 0.92KSValue = 0.7
    关于SVM的调参可以参考笔者的另一篇文章Python利用Gausian Process对Hyper-parameter进行调参

    """
    2.1 SVM (RBF)
        using training data with 100 dimensions
    """
    
    clf = SVC(C = 2, probability = True)
    clf.fit(X_reduced_train, y_reduced_train)
    
    print 'Test Accuracy: %.2f'% clf.score(X_reduced_test, y_reduced_test)
    
    pred_probas = clf.predict_proba(X_reduced_test)[:,1]
    print "KS value: %f" % KSmetric(y_reduced_test, pred_probas)[0]
    
    # plot ROC curve
    # AUC = 0.92
    # KS = 0.7
    fpr,tpr,_ = roc_curve(y_reduced_test, pred_probas)
    roc_auc = auc(fpr,tpr)
    plt.plot(fpr, tpr, label = 'area = %.2f' % roc_auc)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.legend(loc = 'lower right')
    plt.show()
    
    joblib.dump(clf, "SVC.pkl")
    
    2.3.2 MLP

    MLP相比于SVM (RBF),分类更为严格,PCA降维后对模型准确率影响不大,misclassified多为正向文本被分类为负向,其实是更容易overfitting,原因是语料过少,其实用神经网络未免有些小题大做,AUC = 0.91

    """
    2.2 MLP
        using original training data with 400 dimensions
    """
    model = Sequential()
    model.add(Dense(512, input_dim = 400, init = 'uniform', activation = 'tanh'))
    model.add(Dropout(0.5))
    model.add(Dense(256, activation = 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(128, activation = 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(64, activation = 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(32, activation = 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation = 'sigmoid'))
    
    model.compile(loss = 'binary_crossentropy',
                  optimizer = 'adam',
                  metrics = ['accuracy'])
    
    model.fit(X_train, y_train, nb_epoch = 20, batch_size = 16)
    score = model.evaluate(X_test, y_test, batch_size = 16)
    print ('Test accuracy: ', score[1])
    
    pred_probas = model.predict(X_test)
    # print "KS value: %f" % KSmetric(y_reduced_test, pred_probas)[0]
    
    # plot ROC curve
    # AUC = 0.91
    fpr,tpr,_ = roc_curve(y_test, pred_probas)
    roc_auc = auc(fpr,tpr)
    plt.plot(fpr, tpr, label = 'area = %.2f' % roc_auc)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.legend(loc = 'lower right')
    plt.show()
    

    2.4 模型评价

    • 实际上,第一种方法中的第二点缺点依然存在,但相比于基于词典的情感分析方法,基于机器学习的方法更为客观
    • 另外由于训练集和测试集分别来自不同领域,所以有理由认为训练集不够充分,未来可以考虑扩充训练集以提升准确率。


    作者:一个不知死活的胖子
    链接:https://www.jianshu.com/p/4cfcf1610a73
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。程度副词词典


    展开全文
  • NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分) 输出结果 1、测试对象 data1= '今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加幸福!...
  • 消极negative、中性neutral、积极positive、复合情绪compound 注:以上代码保存为.py文件即可执行,vaderSentiment只支持英文的文本进行情感分析,不支持中文!不支持中文!不支持中文! 详细的测试代码: # -*- ...
  • python做snowNLP文本情感分类代码示例

    千次阅读 2019-08-12 15:48:04
    一、snowNLP简介和作用 snownlp为python版的文本分析工具。是受到了TextBlob的启发而写的,可以方便的处理中文文本内容。 支持的中文自然语言操作包括...下面是snownlp分词、词性标注、情感分析代码如下: from s...
  • Python文本情感分析

    千次阅读 2019-05-25 17:53:20
    基于LSTM三分类的文本情感分析 snownlp 没有预测的: 利用Python实现酒店评论的中文情感分析 机器学习-基于LSTM的情感分析 上面我都运行过,如果运行不了的可以联系一下我,我会试着帮你解决一下. ...
  • 基于python情感分析,含有案例分析完整python脚本源码及所用数据。
  • 深度学习,中文情感分析python程序,包含中文酒店用户评论语料数据。
  • 文本情感分析作为NLP的常见任务,具有很高的实际应用价值。本文将采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种情感的分类器。
  • python实现基于情感词典的情感分析 大数据分析
  • 利用python实现简单情感分析

    千次阅读 2020-12-03 17:05:19
    文本情感分析是指用自然语言处理(NLP)、文本挖掘以及计算机语言学等方法对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。 情感分析是文本分类的一个分支,通过对带有情感色彩(褒义贬义/正向负向)的...
  • 完整可运行的python代码。 数据过滤,清洗,分割,特征选择,训练词向量模型,测试等等, 每行都有注释,真实的数据集超过20w条,是个不错的nlp入门例子。
  • python写的微博情感分析,自然语言处理,情感分类,请放心下载
  • python实现基于词典的文本情感分析,包含测试数据和实现代码
  • 注:本文转载自知乎专栏情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪。原理比如这么一句话:“这手机的画面极好,操作也比较流畅。不过拍照真的太烂了!系统也不好...
  • 情感分析主要涉及两个数据集,一个是人工标注好的数据集,即包含了情感标签和文本的数据集A,另一个是用于情感分析的原始数据集,即只包含文本的数据集B。数据集A用于训练和测试,数据集B用于得到想要的情感分析结果...
  • Python文本情感分析之情感极性分析-深度学习文档类资源96c4cc 在 2020-02-04 01:53:00 上传 2.99 MBPython文本情感分析文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别...
  • #英文情感分析 textblob from textblob import TextBlob import nltk text = 'I am so happy. I am so sad.' blob = TextBlob(text) print(blob) print(blob.sentences) print(blob.sentences[0].sentiment) print...
  • 文本情感分析是自然语言处理的一个重要部分,与语音情感分析类似,通过处理提取给定文本中的信息来衡量说话者/作者的态度和情绪,主要用于电影、商品以及社交媒体的用户评论分析等。VADER是一个基于词典和规则的情感...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,086
精华内容 2,834
关键字:

python文本情感分析代码

python 订阅