电商产品评论数据情感分析代码详解本章代码建议在linux下⾯运⾏,windows下安装gensim会⽐较⿇烦。
我是在python3.5.2的pycharm下运⾏的
下⾯代码的意思是从评论数据中抽取品牌是美的的数据(15-1)
[python]
皱纹纸粘贴画1. #-*- coding: utf-8 -*-
2. import pandas as pd
3.形容天气的成语
4. inputfile = '../data/huizong.csv' #评论汇总⽂件
5. outputfile = '../data/' #评论提取后保存路径
6. data = pd.read_csv(inputfile, encoding = 'utf-8')
7. data = data[[u'评论']][data[u'品牌'] == u'美的']
8. _csv(outputfile, index = Fal, header = Fal, encoding = 'utf-8')
这⾥⼀句话概括接下来的去重概念,⽂本去重和机械压缩去重
⽂本去重指的是数据条之间的去重。
机械压缩去重指的是数据条内部,词语与词语之间的去重。齐铁嘴
下⾯代码是⽤来⽂本去重的(15-2)。
[python]
1. #-*- coding: utf-8 -*-
2. import pandas as pd
3.
4. inputfile = '../data/' #评论⽂件
5. outputfile = '../data/meidi_jd_' #评论处理后保存路径
6. data = pd.read_csv(inputfile, encoding = 'utf-8', header = None)
7. l1 = len(data)
8. data = pd.DataFrame(data[0].unique())
9. l2 = len(data)
10. _csv(outputfile, index = Fal, header = Fal, encoding = 'utf-8')
11. print(u'删除了%s条评论。' %(l1 - l2))
下⾯代码的作⽤是把评论前⾯的评分删除(15-3):
3.
4. #参数初始化
5. inputfile1 = '../data/meidi_jd_process_end_负⾯情感结果.txt'
6. inputfile2 = '../data/meidi_jd_process_end_正⾯情感结果.txt'
7. outputfile1 = '../data/meidi_'
8. outputfile2 = '../data/meidi_'
9.
10. data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) #读⼊数据
11. data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)
12. print("data1=",data1[0])
13.
14. data1 = pd.DataFrame(data1[0].place('.*?\d+?\\t ', '')) #⽤正则表达式修改数据
15. data2 = pd.DataFrame(data2[0].place('.*?\d+?\\t ', ''))#这⾥的意思其实是⽤‘’(也就是代表什么都没有)来代替前⾯的
符合特征的字符串,等效于实现了删除的功能
16. print(">>>>>>#")17. print("data1=",data1[0])
18. #以上正则表达式的效果,可以通过把正则筛选前后的data[0]分别输出来进⾏⽐较
19. _csv(outputfile1, index = Fal, header = Fal, encoding = 'utf-8') #保存结果
20. _csv(outputfile2, index = Fal, header = Fal, encoding = 'utf-8')
接下来是进⾏分词(详细解释请见代码中注释)(15-4)
3. import jieba #导⼊结巴分词,需要⾃⾏下载安装
4.
5. #参数初始化
6. inputfile1 = '../data/meidi_'
7. inputfile2 = '../data/meidi_'
8. outputfile1 = '../data/meidi_jd_'
9. outputfile2 = '../data/meidi_jd_'
10.
11. data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) #读⼊数据
12. data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)
13.
14. mycut = lambda s: ' '.join(jieba.cut(s)) #⾃定义简单分词函数,先识别句⼦中的中⽂单词,然后把中⽂单词通过空格连接起来
15. #上⾯⼀句代码中,s是⼊⼝参数,.join前⾯的空格表⽰把jieba库处理过后的s中的词语jieba.cut(s),⽤空格来连接。
16. data1 = data1[0].apply(mycut) #通过“⼴播”形式分词,加快速度。
17. data2 = data2[0].apply(mycut)
18.
19. _csv(outputfile1, index = Fal, header = Fal, encoding = 'utf-8') #保存结果
20. _csv(outputfile2, index = Fal, header = Fal, encoding = 'utf-8')
最后是LDA代码(15-5)
[python]喝葡萄酒
1. #-*- coding: utf-8 -*-
2. import pandas as pd
3.
4. #参数初始化
5. negfile = '../data/meidi_jd_'关于国庆的诗歌
6. posfile = '../data/meidi_jd_'
7. stoplist = '../'
8.
9. neg = pd.read_csv(negfile, encoding = 'utf-8', header = None) #读⼊数据
10. pos = pd.read_csv(posfile, encoding = 'utf-8', header = None)
11. stop = pd.read_csv(stoplist, encoding = 'utf-8', header = None, p = 'tipdm',engine='python')
12. #p设置分割词,由于csv默认以半⾓逗号为分割词,⽽该词恰好在停⽤词表中,因此会导致读取出错(这⾥的出错的意思就是代码
运⾏报错,编译器直接不让编译通过)
13. #所以解决办法是⼿动设置⼀个不存在的分割词,如tipdm。
14. #这⾥先解释下什么是“停⽤词”,停⽤词指的是本⽂中出现频率很⾼、但是实际意义不⼤的词语,⽐如
15. #“今天好嗨森啊啊啊啊啊啊啊啊”,那么这句话中的“啊啊啊啊啊啊啊啊”就是停⽤词
16. #讲通俗点的话,停⽤词就是“废话”。 。
16. #讲通俗点的话,停⽤词就是“废话”。 。
17.
18. stop = [' ', ''] + list(stop[0]) #Pandas⾃动过滤了空格符,这⾥⼿动添加(在每条数据的开头加个空格)
行动的英语19.
20. #下⾯这段代码可以分为两⼩段,这两⼩段代码⼏乎⼀致,前⾯⼀个是针对负⾯评论,后⼀个是针对正⾯评论,所以只详解其中⼀个
21. neg[1] = neg[0].apply(lambda s: s.split(' ')) #定义⼀个分割函数,然后⽤apply⼴播
22. neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐词判断是否停⽤词,思路同上
23. #上⾯这句代码的语法是:列表推导式⼦。意思是说,如果i不在停⽤词列表(stop)中,就保留该词语(也就是最前⾯的⼀个i),否则
就进⾏删除
24. #上⾯的这句代码中,把for i in x看做整体,把if i not in stop看做判断语句,把最前⾯的i看做满⾜if语句之后的执⾏语句即可。
25. pos[1] = pos[0].apply(lambda s: s.split(' '))
26. pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])
27.
28. #上⾯的lamda s和lamda x中的s和x都是表⽰⼊⼝参数,apply的意思是,把apply前⾯的字符串当做⼊⼝参数,输⼊到appy后⾯所
定义的函数中
29.
宫崎骏动画图片
30. from gensim import corpora, models
31.
32. #负⾯主题分析
33. #这段代码和下⾯的“正⾯主题分析”⼏乎是完全⼀样的,作⽤讲得通俗点其实就是聚类。
34. neg_dict = corpora.Dictionary(neg[2]) #建⽴词典
35. neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建⽴语料库
36. neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型训练
37. for i in range(3):
38. neg_lda.print_topic(i) #输出每个主题(这个其实就是聚类结果的输出)美女图片大
39.
40. #正⾯主题分析
41. pos_dict = corpora.Dictionary(pos[2])
42. pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
43. pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
44. for i in range(3):
45. neg_lda.print_topic(i) #输出每个主题
通俗解释下LDA算法⼲嘛的,我们知道:
K-means是聚类的,他主要是处理数据的,对数据进⾏聚类。
LDA其实也是聚类的,主要是处理字符串的,对字符串进⾏聚类。