昨天新加坡是一个充满活力的早晨。
这里只是一些标题:
- 李伟玲,李显信发表声明,表示他们对李显龙失去信心
- 李贤贤想离开新加坡,与妹妹公开公开信批评李鹏
- 李显龙亲爱的李伟玲和李显贤的声明,令李显龙感到悲伤
但是人们怎么看呢?
我们试图根据Facebook的评论来衡量公众对这些陈述的回应。为此,我们使用:
- Python 3
- 在Facebook的图形API下载来自Facebook的评论
- 在谷歌云自然语言API进行情感分析
首先,我们使用Facebook Graph API从Facebook发布了下载评论。对于这个项目,我们使用 这个帖子对李显龙的(LHL)Facebook页面回应了他的兄弟姐妹的发言。
我们使用的方法可以轻松地适应公开Facebook页面上的任何帖子,例如李建森的原始帖子。
然后,我们使用Google Cloud Natural Language API将这些帖子的评论分为正面,中立或负面,并将这些评论的比例计算在每个帖子中。
重要的提示
Facebook绝对不是客观观点的来源。我们在这些职位上发现的意见极有可能在某种程度上有偏见。
也有适度的可能性,进一步降低了我们发现的客观性。本文应该完全是使用Facebook Graph API和Google Cloud Natural Language API的一个练习,而不是对新加坡的政治情况作出任何结论。
入门
设置Python 3
我不会在这里讨论如何下载和安装Python 3.您可以在这里查阅Python文档。但是,只是检查你的Python版本,打开你的Python提示并检查其输出。你应该看到类似的东西:
Python 3.6.0(v3.6.0:41df79263a11,Dec 23 2016,08:06:12)[MSC v.1900 64位(AMD64)]在win32 输入“帮助”,“版权”,“信用”或“许可证”了解更多信息。 >>>
如果你看到Python 3.x.x
,你很好去 如果你看到Python 2.x.x
你正在运行Linux / MacOS的,你可以尝试使用python3
替代python
。否则,您将需要安装Python 3或将代码转换为Python 2。
我们还将使用requests
和google-cloud-language
库进行HTTP请求并进行情绪分析。要安装这些,请运行:
#如果你使用python3命令,你可能需要在这里使用pip3 pip install --upgrade请求google-cloud-language
获取Facebook Graph API访问令牌
您将需要一个Facebook帐户才能访问Graph API。我们可以使用Facebook Graph API Explorer获取此信息。
单击右上角的“获取令牌”,然后单击“获取用户访问令牌”。您将看到一个较大的对话框来选择权限。不需要检查任何东西,因为LHL的Facebook页面是公开的。点击右下角的“获取访问令牌”,您的访问令牌将被填入访问令牌字段。现在留在这里。
创建Google Cloud Platform项目
与AWS不同,Google Cloud Platform上的资源按项目分组。转到此页面 ,并按照步骤1到6来设置项目。您可能还需要安装Google Cloud SDK才能使用gcloud
。
下载Facebook评论
我们的目标是在他的Facebook页面上回复他的兄弟姐妹,下载所有关于LHL的帖子的评论。
我们将通过遍历Facebook Graph API来执行此操作。
Facebook Graph API如何工作
Graph API将Facebook数据作为图形显示,由连接的实体组成。这些实体可以是Facebook上的任何一个Facebook用户,页面或评论。可以在Graph API Reference页面找到完整的实体列表。
实体通过顶点链接,顶点是实体的属性。例如,一个帖子实体链接到许多注释实体,表示该帖子的每个注释。
我们需要找到与LHL的帖子相对应的帖子实体,并查看连接到它的所有注释实体。为了简化事情,邮政实体由包含发布者的用户或页面的ID以及可以在帖子URL中找到的帖子本身的ID所组成的ID引用。
要通过Graph API Explorer获取LHL的页面ID,我们只需要在查询框中输入他的页面用户名:
我们收到他的页面ID后,我们可以找到他的帖子:
只要追加/comments
到帖子ID,我们就可以得到所有的评论:
但是,我们不想使用Graph API Explorer手动保存所有注释,因此我们将使用Python脚本:
导入请求
graph_api_version ='v2.9' access_token ='YOUR_FACEBOOK_ACCESS_TOKEN'
#LHL的Facebook用户ID user_id ='125845680811480'
#LHL的回复帖子的身份信息https://www.facebook.com/leehsienloong/posts/1505690826160285 post_id ='1505690826160285'
#LHL的帖子注释的图API端点 url ='https://graph.facebook.com/{}/{}_{}/comments'.format(graph_api_version,user_id,post_id)
评论= []
r = requests.get(url,params = {'access_token':access_token})
而真: data = r.json()
#catch由Graph API返回的错误
如果 “错误” 在数据: 加注的异常(数据[“错误”] [“消息”])
#将每个注释的文本附加到注释列表中
在数据['data'] 中发表评论: #删除每条评论中的换行符 text = comment ['message']。replace('\ n','') comments.append(文本)
print('got {} comments'.format(len(data ['data'])))
#检查是否有更多的评论
如果 “寻呼” 在数据和 “下一个” 在数据[“寻呼”]: r = requests.get(data ['paging'] ['next'])
其他: 休息 #注释保存到文件中 与打开(“comments.txt”,“W”,编码=“UTF-8”)作为 F: 用于评论在评论: f.write(comment +'\ n')
这个脚本可以工作,因为我们可以通过直接访问Graph API URL从Graph API Explorer获取相同的输出。这个脚本有几件事情:
- 发出HTTP请求以获取LHL的帖子的评论
- 将发布上的评论文本保存到Python列表中
- 检查是否有更多的注释(使用请求中返回的寻呼光标, 有关分页的更多信息,请参阅此页面)
- 将我们获得的评论保存到文件中
分析评论情绪
现在我们有一个我们要分析的评论列表,我们可以使用Google Cloud Natural Language来获得每个评论的意见。云自然语言API做了很多事情,但在本文中,我们将只使用情绪分析功能。这将检查一段文本,并确定当前情绪是否为正,负或中性。
comments.txt
我们在上一节中生成的文件包含每条线上LHL的Facebook post-one上的每条评论的文本(这就是为什么我们从每个评论中删除换行符)。现在我们将通过这个清单,并确定每个评论的意见是否是积极的,负面的或中立的,并且计算每个情绪的总体比例:
来自 google.cloud 导入语言,异常
#创建Google Cloud Natural Languague API Python客户端 client = language.Client()
#一个函数,它采取一个文本块,并返回其情绪和幅度
def detect_sentiment(text): “”“检测文本中的情绪”。“” #实例化一个纯文本文档。 document = client.document_from_text(text)
情绪= document.analyze_sentiment()。情绪
回报情绪。情绪,情绪
跟踪每个意见的总意见和评论的数量 count = 0 positive_count = 0 neutral_count = 0 negative_count = 0
#阅读我们的comments.txt文件
与开放( 'comments.txt',编码= 'UTF-8')作为 F: 用于线在 F: #使用try-except块,因为我们偶尔会得到语言不支持的错误
尝试: 分数,mag = detect_sentiment(行)
except exceptions.BadRequest: #如果我们收到错误,请跳过评论
继续 #增加总数 count + = 1
#取决于情绪是否为负,负或中性,增加相应的计数
如果得分> 0: positive_count + = 1
elif分数<0: negative_count + = 1
否则: neutral_count + = 1
#计算每个意见的评论比例 positive_proportion = positive_count / count neutral_proportion = neutral_count / count negative_proportion = negative_count / count
打印( 'Count:{},Positive:{:.3f},Neutral:{:.3f},Negative:{:.3f}'。format count,positive_proportion,neutral_proportion,negative_proportion))
运行这个脚本,我们将得到如下输出:
... 计数:379,正值:0.657,中性:0.190,负数:0.153 计数:380,正值:0.655,中性:0.192,负数:0.153 计数:381,正:0.656,中性:0.192,负数:0.152 计数:382,正值:0.657,中性:0.191,负数:0.152 计数:383,正值:0.658,中性:0.191,负数:0.151 计数:384,正值:0.659,中性:0.190,负数:0.151 ...
最后:
总评分:781 积极:530(67.86%) 负数:109(13.96%) 中性:142(18.18%)
结论
根据对LHL的Facebook职位的情感分析,我们看到近70%的评论是积极的。虽然这可以解释为强大的公众对我们总理的支持,但我们也需要考虑到Facebook页面的访问者可能偏向该页面以及评论评论的可能性。
潜在的改进
在测试我的脚本时,我不得不运行情绪分析脚本几次,每次都会发出不必要的同样评论的请求。鉴于Facebook帖子的动态性质,可以修改代码以通过ID缓存注释,仅分析新评论的情绪。这一点尤为重要,因为Google Cloud Natural Language API每月只能有免费的5,000个API调用配额。
以上示例的源代码可以在这里找到。
了解有关400电话更多信息