全部数据及源码:自然语言处理+情感分析+主题分析+词云图-自然语言处理文档类资源-CSDN下载
1.评论数据
首先基于python抓取了评论数据,并存储与csv文件中,打开文件,去除重复的评论
2.机械压缩去词
(1)机械压缩去词的思想
例如“非常好非常好非常好非常好非常好非常好非常好非常好”
以及“好呀好呀好呀好呀好呀好呀好呀好呀”
这一类是存在连续重复的语料,也是最常见的较长的无意义语料。是需要删除的。
(2)机械压缩去词处理的语料结构
机械压缩去词实际上要处理的语料就是语料中有连续累赘重复的部分,从一般的评论偏好角度来讲,一般人制造无意义的连续重复只会在开头或者结尾进行。
(3)机械压缩去词处理过程的连续累赘重复的判断及压缩规则的阐述
连续累赘重复的判断可通过建立两个存放国际字符的列表来完成,先放一个列表,再放第二个列表,一个个读取国际字符,并按照不同情况,将其放入第一或第二个列表或触发压缩判断,若得出重复则压缩去除。
规则1:如果读入的字符与第一个列表的第一个字符相同,而第二个列表没有任何放入的国际字符,则将这个字符放入第二个列表中。
规则2:如果读入的字符与第一个列表的第一个字符相同,而第二个列表也有国际字符,则触发压缩判断,若得出重复,则进行压缩去除,清空第二个列表。
规则3:如果读入的字符与第一个列表的第一个字符相同,而第二个列表也有国际字符,则触发压缩判断,若得出不重复,则清空两个列表,把读入的这个字符放入第一个列表第一个位置。
规则4:如果读入的字符与第一个列表的第一个字符不相同,触发压缩判断,如果得出重复且列表所含国际字符数且大于等于2,则进行压缩去除,清空两个列表,把读入的这个放入第一个列表第一个位置。
规则5:如果读入的字符与第一个列表的第一个字符不相同,触发压缩判断。若得出不重复且第二个列表没有放入国际字符,则继续在第一个列表放入国际字符。
规则 6:如果读入的字符与第一个列表的第一个字符不相同,触发压缩判断,若得出不重复且第二个列表已放入国际字符,则继续在第二个列表放入国际字符。
规则7:读完所有国际字符后,触发压缩判断,对第一个列表以及第二个列表有意义部分进行比较,若得出重复,则进行压缩去除。
(4)机械压缩去词处理操作流程
根据上述规则,可以完成对开头连续重复的处理。也可以对处理过的文本再进行一次结尾连续重复的机械压缩去词,算法思想是相近的,只是从尾部开始读词。
2.3 短句删除
(1)短句删除的原因及思想
完成机械压缩去词处理后,则进行最后的预处理步骤:短句删除。要删除掉过短的评论文本数据,以去除掉没有意义的评论,例如,
1)原本就过短的评论文本。
2)经机械压缩去词处理后过短的评论文本。
(2)保留的评论的字数下限的确定
可以结合特定语料来确定,一般4~8个国际字符都是较为合理的下限。
def forward(strs,reverse=False):
a = strs # 令 a = string[::,-1] 即可进行句尾去词
if reverse:
a=strs[::-1]
l1 = [a[0]]
l2 = []
n = 1
while n < len(a):
if a[n] == l1[0]:
if len(l2) == 0:
l2.append(a[n])
n += 1
else:
if l1 == l2:
l2 = []
else:
l1 = [a[n]]
l2 = []
n += 1
else:
if l1 == l2:
if len(l1) >= 2:
l1.append(a[n])
l2 = []
n += 1
else:
l1.append(l2[0])
l1.append(a[n])
l2 = []
n += 1
else:
if len(l2) == 0:
l1.append(a[n])
n += 1
else:
if len(l2) < len(l1):
l2.append(a[n])
n += 1
else:
if l1 == l2 :
l1.append(a[n])
l2 = []
n += 1
else:
l1.extend(l2[1:])
l2 = []
if l1 != l2:
temp1 = l1+l2
else:
temp1 = l1
if reverse:
return ''.join(temp1[::-1])
else:
return ''.join(temp1)
2.snownlp情感分析
nowNLP情感分析是基于情感词典实现的,其简单的将文本分为两类,积极和消极,返回值为情绪的概率,也就是情感评分在[0,1]之间,越接近1,情感表现越积极,越接近0,情感表现越消极。
正面情感评论如下:
负面情感:
3.分词处理
对正负面评论分别进行分词处理
去除不需要的词语,如得、的等无意义的词语
5.LDA主题分析
LDA是一种基于贝叶斯思想的无监督的聚类算法,广泛用于文本聚类,文本分析,文本关键词等场景。具体的,算法 的输入是一个文档的集合D={d1, d2, d3, ... , dn},同时还需要主题Topic的类别数量m;然后会算法会将每一篇文档 di 在 所有Topic上的一个概率值p;这样每篇文档都会得到一个概率的集合di=(dp1,dp2,..., dpm), 表示文档di在m个topic上的概率值;同样的文档中的所有词也会求出 它对应每个Topic的概率,wi = (wp1,wp2,wp3,...,wpm);这样就得到了两个矩阵,一个文档到Topic,一个词到Topic。
其核心公示为:
p(w|d) = p(w|t)*p(t|d)
直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。
实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。
LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。
这样LDA算法,就将文档和词,投射到了一组Topic上,试图通过Topic找出文档与词间,文档与文档间,词于词之间潜在的关系;由于LDA属于无监督算法,每个Topic并不会要求指定条件,但聚类后,通过统计出各个Topic上词的概率分布,那些在该Topic上概率高的词,能非常好的描述该Topic的意义。
结果如下:
负面评论关键词:
正面评论关键词: