zoukankan      html  css  js  c++  java
  • 社交平台舆情分析项目的总结和感想(SELENIUM,NLTK,贝叶斯分类器)(一)

    前一段时间做了一个社交平台(比如新浪微博,腾讯微博)上面话题的评论采集和分析的项目,具体技术用到了selenium和python的nltk库。

    首先是数据采集,这里没有使用这些平台的开放API,而是用到了selenium技术,原因是因为开放API往往有采集频率的限制而且部分平台的API不够完善,而用selenium采集可以解决 网页上的核心数据通过ajax异步加载的问题。

    然后是数据的预处理,以新浪微博为例,可以通下段代码除去表情和回复中引用的其他回复。

    def contentFilter(content):
        face=re.compile('[[^]]+]') #表情
        at=re.compile('//@.*') #其他回复
        huifu=re.compile('回复.*:') #回复头
        content=face.sub('',content)
        content=at.sub('',content)
        content=huifu.sub('',content)
        if len(content)<7: #保留7个字以上的回复
            return None
        return content

    然后可以用一个贝叶斯网络对这些剩下来的评论做筛选,找出最具观点价值的评论(提示:语义连词)。这个贝叶斯分类器还能用来过滤垃圾评论和广告(一般广告都带“扣扣号”,“本店”等词语)。贝叶斯分类器会给每条评论一个概率估计,从大到小排序,取其中分类为有价值评论的前若干条进行人工标注(正方:支持微博or反方:反对微博)。

    在我实践过程中发现标点符号也是一个非常重要的参考,一般带问号的评论往往是持反方观点的。

    比如这条微博:作家王安忆:每每看到美国政府为了一个战死在异国的士兵遗骸斤斤计较寸步不让时,一种莫名的感动自心底涌起。每每看到我们自己的生命如草芥和数字时,一种无以言状的悲凉直达心底。在我们几千年历史里,你检测不出丝毫的关于人的概念,人的权利,人的尊严。没人在意我们的生死,包括我们自己。

    我用NLTK 的 FreqDist 函数统计,评论中共发现12个问号,而这些带问号的评论无一例外是反对微博观点的,比如:

    美国是不是对别的国家人民也这样!它们的士兵为什么死在异国?不要乱感动,浪费情感,不值!
    但是为何总把他们往异国的战场送呢?要是没有此国的四处虐夺,何来这么多的死亡
    我们派兵去外面杀过谁?美国几乎天天都在外面滥杀无辜,不该给大兵家属一个交代吗?
    哈哈哈!这是卖国贼或者愚昧者的理解。美国大兵是去侵略别人而战死在他乡的,本来就已经说不过去了,如果死者的家属连尸体都见不着,美国政府如何向死者家属交代?不要扯什么人权。美国杀了多少无辜的人,人权在哪里?
    美国是不是对别的国家人民也这样!它们的士兵为什么死在异国?不要乱感动,浪费情感,不值!
    但是为何总把他们往异国的战场送呢?要是没有此国的四处虐夺,何来这么多的死亡
    我们派兵去外面杀过谁?美国几乎天天都在外面滥杀无辜,不该给大兵家属一个交代吗?

    可见在网络上喷人最常用的手段就是反问句。。。

    鉴于问号是如此重要,预处理中应该增加一步标点符号的归一化,把中英文不同的标点统一到一个格式。此外,我将问号独立于文本之外,凡是带问号的则认为其带有观点价值的概率乘以一个奖励系数,其计算方式:log(评论总数÷带问号的评论数)。凡是带问号的认为其观点为反方观点的概率也乘以一个系数,计算方式:log(评论总数÷带问号的评论数)×人工标注数据中带问号的反方观点占所有人工标注的反方观点的百分比。为了防止过度拟合,这两个奖励系数均不能大于3。

    这里在补充一下 NLTK 这个库中一些有用的函数吧。

    英文词干提取:nltk.PorterDtemmer

    去除html标记:nltk.clean_url 和 clean_html ,这两个函数内部调用了beautifulsoup

    贝叶斯分类器:nltk.NaiveBayesClassifier

    #nltk的贝叶斯分类器函数使用总结
    #先定义一个特征提取函数,该函数返回一个dict,其中key为维度名称,value为维度值
    def getFeature(sample):
        return {'d1':5,'d2':False}
    
    #对每一个样本生成特征,然后将特征和样本的类别组成元组
    #样本元组 组成list类型的样本特征集
    train_set=[(getFeature(sample),class) for sample in samples]
    
    #使用train函数生成分类器:
    classifier=nltk.NaiveBayesClassifier.train(train_set)
    
    #使用测试集和nltk.classify.accuracy函数判断分类器的准确度
    print nltk.classify.accuracy(classifier,test_set)
    
    #使用分类器的classify函数判断某个实例的分类:
    classifier.classify(getFeature(Instance))
    
    #使用分类器的show_most_informative_features函数显示最有影响力的维度:
    classifier.show_most_informative_features(5)#显示头5个

    到此为止我们有了50条已标注的评论,作为样本集。

    下一篇我将详细讲一讲特征提取和小规模标注处理大规模数据的一些办法。




  • 相关阅读:
    GYM
    GYM
    GYM
    【HIHOCODER 1320】压缩字符串(区间DP)
    【HIHOCODER 1133】 二分·二分查找之k小数
    【HDU 2028】Lowest Common Multiple Plus
    【HIHOCODER 1601】 最大得分(01背包)
    概率论基础【概率论的基本概念笔记】
    【HIHOCODER 1575】 两个机器人(BFS)
    【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)
  • 原文地址:https://www.cnblogs.com/rav009/p/5131098.html
Copyright © 2011-2022 走看看