• Python:电商产品评论数据情感分析,jieba分词,LDA模型


    本节涉及自然语言处理(NLP),具体涉及文本数据采集、预处理、分词、去停用词、词频分析、LDA主题模型

    代码部分

     1 # -*- coding: utf-8 -*-
     2 """
     3 Created on Mon Oct  1 12:13:11 2018
     4 
     5 @author: Luove
     6 """
     7 
     8 import os
     9 import pandas as pd
    10 import jieba
    11 from gensim import corpora, models
    12 
    13 os.chdir('D:AnalyzePython MatlabPythonBookCodesPython数据分析与挖掘实战图书配套数据、代码chapter15democode')
    14 filepath='../data/huizong.csv'
    15 data=pd.read_csv(filepath)
    16 data.head()
    17 data_target=data[['评论']][data['品牌']=='美的']
    18 #set(data['品牌'])
    19 count_1=len(data_target)  # 55774
    20 data_target=pd.DataFrame(data_target['评论'].unique())  # 去重后返回时array,需要DataFrame化
    21 count_2=len(data_target)  # 53049
    22 same_comment_count=count_1-count_2  # 2725,5%
    23 
    24 inputfile1 = '../data/meidi_jd_process_end_负面情感结果.txt'  # 来之ROSTCM6软件,情感倾向性分析,负面、中性、正面,这里只研究负面、正面
    25 inputfile2 = '../data/meidi_jd_process_end_正面情感结果.txt'
    26 
    27 with open(inputfile1,'r',encoding='UTF-8') as data1: # 针对含中文名的文件的读取方式,重编码成utf-8
    28     data1 = pd.read_csv(data1,header = None) #读入数据
    29 with open(inputfile2,'r',encoding='UTF-8') as data2:
    30     data2 = pd.read_csv(data2,header = None) #读入数据    
    31 data1 = pd.DataFrame(data1[0].str.replace('.*?d+?\t ', '')) #用正则表达式修改数据,非贪婪模式:*?,0个或多个非
    字符  +?,1个或多个数字
    32 data2 = pd.DataFrame(data2[0].str.replace('.*?d+?\t ', ''))
    33 # jieba分词
    34 mycut = lambda s: ' '.join(jieba.cut(s)) #自定义简单分词函数,分词结果通过空格链接
    35 data1 = data1[0].apply(mycut) #通过“广播”形式分词,加快速度。
    36 data2 = data2[0].apply(mycut)
    37 # 去停用词
    38 stopfilepath='../data/stoplist.txt'
    39 stop = pd.read_csv(stopfilepath, encoding = 'utf-8', header = None, sep = 'tipdm')  # 这里sep分割符 非停用词符均可,这里选的是竞赛站名
    40 #sep设置分割词,由于csv默认以半角逗号为分割词,而该词恰好在停用词表中,因此会导致读取出错
    41 #所以解决办法是手动设置一个不存在的分割词,如tipdm。
    42 stop = [' ', ''] + list(stop[0]) #Pandas自动过滤了空格符,这里手动添加
    43 neg=pd.DataFrame(data1.copy())
    44 pos=pd.DataFrame(data2.copy())
    45 neg[1] = neg[0].apply(lambda s: s.split(' ')) #定义一个分割函数,然后用apply广播,每行按空格分隔,每行由str转变为list
    46 neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐词判断是否停用词,思路同上
    47 pos[1] = pos[0].apply(lambda s: s.split(' '))
    48 pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])
    49 
    50 
    51 # =============================================================================
    52 # ldamodel = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=3, id2word = dictionary, passes=20) 
    53 # corpus: 必须。语料库
    54 # num_topics: 必须。LDA 模型要求用户决定应该生成多少个主题。由于我们的文档集很小,所以我们只生成三个主题;
    55 # id2word:必须。LdaModel 类要求我们之前的 dictionary 把 id 都映射成为字符串;
    56 # passes:可选。模型遍历语料库的次数。遍历的次数越多,模型越精确。但是对于非常大的语料库,遍历太多次会花费很长的时间。
    57 # 调整模型的主题数和遍历次数对于得到一个好的结果是很重要的
    58 # =============================================================================
    59 #负面主题分析
    60 neg_dict = corpora.Dictionary(neg[2]) #建立词典
    61 neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立语料库
    62 neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型训练,一种主题模型,它基于一组文档中的词频生成主题
    63 for i in range(3):  # num_topics = 3
    64   print(neg_lda.print_topic(i)) #输出每个主题
    65 
    66 #正面主题分析
    67 pos_dict = corpora.Dictionary(pos[2])
    68 pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
    69 pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
    70 for i in range(3):
    71   print(pos_lda.print_topic(i)) #输出每个主题
    72 print(pos_lda.print_topic(num_topics = 3, num_words = 3))

    主题分析结果

    #负面评价潜在主题
    #  聚成3个主题,每个主题下生成10个最可能出现的词及其概率
    0.033*"安装" + 0.017*"加热" + 0.014*"" + 0.012*"美的" + 0.011*"" + 0.011*"不错" + 0.010*"热水器" + 0.009*"售后" + 0.008*"一个" + 0.007*"速度"
    0.037*"安装" + 0.029*"不错" + 0.027*"" + 0.018*"热水器" + 0.017*"" + 0.016*"知道" + 0.013*"师傅" + 0.011*"美的" + 0.011*"京东" + 0.010*"送货"
    0.049*"安装" + 0.024*"热水器" + 0.011*"师傅" + 0.011*"" + 0.010*"知道" + 0.008*"有点" + 0.008*"安装费" + 0.007*"n" + 0.006*"使用" + 0.006*""
    #正面评价潜在主题
    0.043*"" + 0.032*"不错" + 0.024*"" + 0.022*"美的" + 0.012*"京东" + 0.012*"一个" + 0.012*"加热" + 0.011*"热水器" + 0.010*"热水" + 0.009*"保温"
    0.099*"不错" + 0.093*"" + 0.025*"东西" + 0.020*"" + 0.018*"速度" + 0.016*"热水器" + 0.016*"很快" + 0.016*"价格" + 0.015*"加热" + 0.015*"质量"
    0.094*"安装" + 0.029*"师傅" + 0.023*"" + 0.016*"送货" + 0.014*"热水器" + 0.013*"不错" + 0.012*"安装费" + 0.011*"美的" + 0.010*"售后" + 0.008*"很快"
    # 从上可以分析主题及其中高频词的特征

    Ref:

    用 Python 实现 LDA

    《数据分析与挖掘实战》:源代码及数据需要可自取:https://github.com/Luove/Data

  • 相关阅读:
    [enum]enum的用法
    gridview汇出EXCEL (ExportGridViewToExcel(dt, HttpContext.Current.Response);)
    c#用正则表达式判断字符串是否全是数字、小数点、正负号组成 Regex reg = new Regex(@"^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$");
    GridView里的文本框改变事件
    转发 win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files 解决方案
    验证上转文件类型的正则表达式
    EXCEL设置选中单元格样式
    转发!HTML 复选框 checkbox 的 JavaScript 的全选和全反选
    dataGrid转换dataTable
    wince mobile环境下播放WAV声音
  • 原文地址:https://www.cnblogs.com/amoor/p/9736245.html
Copyright © 2020-2023  润新知