加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

社交媒体挖掘也可以很炫酷

发布时间:2020-12-14 05:05:49 所属栏目:大数据 来源:网络整理
导读:? ? ? ?点击标题下「异步图书」可快速关注 ?? 社交媒体都会存在一个基础性的图结构,而大多数基于图结构的问题都可以被表述成某种信息流问题,并找出该图结构中最繁忙的节点。像热门话题、影响力检测以及情绪分析这些问题都是很好的例子。下面就通过这些具体
? ? ? ?点击标题下「异步图书」可快速关注??


社交媒体都会存在一个基础性的图结构,而大多数基于图结构的问题都可以被表述成某种信息流问题,并找出该图结构中最繁忙的节点。像热门话题、影响力检测以及情绪分析这些问题都是很好的例子。下面就通过这些具体的用例,围绕社交网络来构建一些酷炫的应用程序吧。


数据收集


本文主要以Twitter和Facebook为实验对象,为你详细、充分地介绍与这两个社交媒体有关的API信息,以及如何有效地利用它们来获取相关数据。此外,还将讲解与废弃数据相关的数据字典,以及如何利用来构建一些酷炫的应用程序。


Twitter


先从目前最流行、最开放的且完全公开的社交媒体开始入手。这实际上就意味着可能要去收集整个Twitter流中的信息,但这是要付费的,但可以免费捕获其中百分之一的信息。在商业背景下,对于那些想要了解公众情绪、新兴话题这类信息的人来说,Twitter是一个非常丰富的信息资源。

下面,就来解决如何从tweet中获取与用例相关信息这一主要问题吧。


提示: 

下面链接中列出了许多Twitter程序库的代码仓库。当然,这些程序库都没有经过Twitter官方的验证,但它们都可以基于Twitter API来运行:

https://dev.twitter.com/overview/api/twitterlibraries。


具有这方面功能的Python库绝对超过 10 个,所以可以选择任意一个自己自己喜欢的。由于我自己通常会选择Tweepy,所以这里将会使用它来完成示例。这些程序库大部分都是一些Twitter API的封装器,因此它们的参数和签名也大致相同。

安装Tweepy最简单的方法是使用pip:


$ pip install tweepy


提示: 

源代码安装是比较难的一种安装方式,Tweepy在github上的链接如下:

https://github.com/tweepy/tweepy。


当然,如果想要让Tweepy能够正常工作,必须在Twitter上创建一个开发者帐户,为将要创建的应用获取访问令牌。在完成这些动作之后,就会得到属于自己的的资格验证以及这些验证信息下面的密钥。也可以在https://apps.twitter.com/app/new中注册并获取令牌。下图显示的就是一个访问令牌的快照:


先来看一个非常简单的例子:通过Twitter信息流的API来收集数据。使用Tweepy来捕获Twitter流,收集其中所有与给定关键字相关的tweet:

tweetdump.py
>>> from tweepystreaming import StreamListener
tweepy OAuthHandler
Stream
sys
consumer_key = 'ABCD012XXXXXXXXx'
consumer_secret 'xyz123xxxxxxxxxxxxx'
access_token '000000-ABCDXXXXXXXXXXX'
access_token_secret ='XXXXXXXXXgaw2KYz0VcqCO0F3U4'
classStdOutListener(StreamListener):
>>>   def on_data(self, data>>>     with open(sysargv[1],'a')as tf:
>>>       tfwritedata)
return
on_error statusprintstatusif __name__ =='__main__'>>>   l ()
auth OAuthHandlerconsumer_key consumer_secretauthset_access_tokenaccess_token access_token_secretstream Stream lstreamfiltertrack=['Apple watch'])

上述代码使用了与Tweepy示例相同的代码,并作了稍许修改。这个例子示范了如何使用Twitter信息流的API,跟踪的关键词是Apple Watch。Twitter信息流的API在这里实际提供的就是在Twitter信息流中执行搜索的功能,可以用该API查看其信息流中最多百分之一的信息。

对于上述代码,主要需要理解的部分是头 4 行和最后 4 行。在初始化的那几行代码中,指定的是上一节中生成的访问令牌和其他相关密钥。而在最后 4 行中,创建了一个针对信息流的监听器。特别在最后一行,使用了stream.filter来过滤twitter,以便设置要跟踪的关键字。这里可以一次设置多个关键字。在这个例子中,运行结果中包含所有与Apple Watch这个词相关的tweet。

接下来的这个示例,要将上面收集的tweet载入,带你来看看tweet的结构,并探讨如何从中提取出有意义的信息。通常情况下,tweet JSON在结构上应该是这样的:


{
"created_at":"Wed May 13 04:51:24 +0000 2015""id":598349803924369408"id_str""598349803924369408""text""Google launches its first Apple Watch app with News & Weather
http://t.co/o1XMBmhnH2""source""u003ca href="http://ifttt.com" rel="nofollow"
u003eIFTTTu003c/au003e""truncated":false"in_reply_to_status_id"null"user":{
1461337266"1461337266""name""vestihitech u0430u0432u0442u043eu043cu0430u0442""screen_name""vestihitecha""location""""followers_count"20"friends_count""listed_count"4""statuses_count":7442,
"created_at":"MonMay 270551 +00002013",0);">utc_offset":14400,21);">},21);">,0);">geo":{ "latitude" : 51.4514285,"longitude"=-0.99
}
placeReading UKcontributors":null,0);">retweet_count":0,0);">favorite_countentities":{
hashtags":[
"
apple watchgoogle"
],0);">trends":[
"
urls{
url":"http://tco/o1XMBmhnH2expanded_url//ifttt/1HfqhCedisplay_urliftindices66,21);">88
]
user_mentionssymbolsfavorited":false,0);">retweetedpossibly_sensitivefilter_levellowlangentimestamp_ms":"1431492684714]


数据提取

在数据提取的过程中,有一些最常用到的字段。


  • text:即用户所提供的tweet内容。


  • user:即用户的一些主要属性,如用户名、所在地和照片等。


  • Place:即发布tweet的地方,也是地理坐标。


  • Entities:即用户在其tweet中所附加的有效主题标签和主题。


在实践中,上述每个属性都可以成为执行社交媒体挖掘的实验用例。下面,来看看应该如何获取这些属性,并将其转换成某种可读性更好的形式,或者对其进行其他相关的处理:


Source tweetinfopy
json
tweet jsonloadsopen]).read())

tweet_texts [ tweet['text']           
                
for tweet in>>>tweet_source tweet 'source']
tweet_geo tweet'geo' tweet_locations 'place' hashtags hashtag hashtag 'entities']['hashtags'print tweet_texts
tweet_locations
tweet_geo
hashtags

正如所期待的那样,上述代码会输出 4 个列表,其中,tweet_texts中包含的是所有的tweet内容,此外还有该tweet所在的位置和主题标签。


这段代码只是用json.loads()加载了一段以JSON格式生成的输出。建议大家使用像Json Parser(http:// json.parser. online.fr/)这样的线上工具来帮助你理解这段JSON输出的含义,以及它的属性(键和值)内容。


如果仔细观察的话,会发现这段JSON被分成了不同的层次,其中有些属性,如text就只有一个直接值,而有些属性有更多的嵌套信息。这就是为什么如果想要查看hashtag属性,就必须迭代上几个层次,而对于test属性,就只需直接获取值即可。由于文件实际是一个tweet列表,所以必须要通过迭代该列表才能获取到所有的tweet,而这里每个tweet对象的结构和上面那个tweet示例是基本相同的。


热门话题


如果想要在上面这种设置条件下查找出当前热门的话题。最简单的一种方法就是查看所有tweet中单词的频率分布情况。因为目前已经有了一个包含所有tweet的tweet_text列表:

nltk
nltk word_tokenizesent_tokenize
FreqDist
tweet_tokens []

>>>
tweet_texttweet_tokensappendword_tokenize))
Topic_distribution nltk.FreqDistFreq_dist_nltkplot(50 cumulative=False)


除此之外,还有一个更复杂一些的方法,就是利用词性标注器。其原理是:主题在大多数情况下都是一些名词或实体项,所以,可以对其执行相同的处理。上面的代码已经读取了每个tweet并对其进行了标识化,下面以POS为过滤器,只选取其中的名词来充当主题:


Topics[]tagged pos_tag>>>   Topics_tokenword  wordpos  tagged  pos 'NN''NNP'Topics_token


如果想让这个例子再酷炫一点,还可以跨时段地收集一些tweet,然后为其生成绘制图。这样就会得到一份含义非常清楚的热门报告。例如,之前正在寻找的是与“Apple Watch”相关的数据。这个词应该会在苹果推出Apple Watch的那一天,以及该产品开始销售的那一天达到高峰。但更感兴趣的是那几天除了这些主题,还出现了什么样的主题,这些主题随着时间呈现出了何种讨论趋势。

地理可视化

地理位置的可视化也是社交媒体的常见应用之一。在tweet结构中,会看到geo、longitude和latitude这三个与之相关的属性。通过访问这些属性,就能利用像D3这样的可视化程序库做出图 1 所示的内容。

在这个例子中看到的只是其中一种可视化实现,它呈现的是全美tweet的可视化分布。从中可以清楚地看出纽约这些东部地区的使用强度正在增长。现在,公司可以通过对客户进行类似的分析来厘清其客户群喜欢待在哪些地方。除此之外,还能根据情绪来对tweet进行文本挖掘,以此来推断哪几个州的客户对公司不太满意等情况。


图1

影响力检测

在社交图语境中,对具有重要影响力的社交图中的重要节点进行检测也是一个很重要的问题。因此,如果我们手里有数百万条关于我们公司的tweet,那么其中一个重要用例就是要收集该社交媒体中最有影响力的那些客户,然后针对他们进行品牌推广、营销或改善他们的参与度。

如果具体到Twitter的情况,就得回到图论和PageRank的概念上来,其中对于一个给定的节点,如果其出度(outdegree)比例比入度(indegree)高,该节点就是具有影响力的。原因非常直观,拥有较多关注者的人显然通常要比他们所关注的人有影响力。有一家名为KLOUT(https://klout.com/)的公司一直很专注于这类问题。所以下面就来写一个最基本而且直观的算法来为这些公司评个分:


 klout_scores 'user''followers_count]/tweet['user']
['friends_count'],tweet['']) for tweet in tweet ]

当然在这些以Twitter为基础的例子中,我们所修改的字段内容始终是完全相同的。其实也可以用Facebook帖子来示范如何构建热门话题。同样地,也可以示范如何对Facebook用户、所发帖的地理位置及其影响力进行可视化处理。事实上,下面就要来看看这些应用在Facebook中会有哪些变化。

Facebook

Facebook的私人化程度要更高一些,有些接近于私人式的社交网络。Facebook出于隐私和安全方面的考虑,通常不会允许我们收集用户的订阅内容/帖子。因此,Facebook的图结构API只能以有限的方式来反馈给定页面,关于这方面的内容,推荐大家去阅读一下https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3中的说明,以加深理解。


接下来要解决的一个问题是如何用Python来访问这些图结构API并加以应用。业界围绕着Facebook API编写了很多封装器,这里使用的是最常见的Facebook SDK:

$ pip install facebook-sdk


小技巧:

也可以到以下链接中获取相应的安装包:

https://github.com/Pythonforfacebook/facebook-sdk。


然后,下一步就是要获取应用程序的访问令牌了。Facebook会将每个API调用都视为一个应用程序。因此即使是数据收集这一步骤,也需要将其伪装成一个应用程序。


如果想要获得属于自己的访问令牌,请访问:

https://developers.facebook.com/tools/explorer。


现在所有设置都完成了!下面先来试试一个使用度最高的Facebook的图结构API。在该API中,Facebook提供的是一个针对页面、用户、事件、地点等信息的基于图结构的搜索功能。这种情况下,获得相关帖子的过程变成了两个阶段,必须先找到与自己感兴趣的主题相关的pageid / userid,然后才能访问到该页面的订阅内容。下面就要来实现一个简单的用例,就是在某公司的官方页面上寻找客户投诉。其具体做法如下:


 facebook
fo ("fdump.txt"'w' ACCESS_TOKEN 'XXXXXXXXXXX' # https://developers.facebook.com/tools/explorer fb facebookGraphAPIACCESS_TOKEN company_page "326249424068240"
content fbget_objectcompany_page fojsondumpscontent))

这段代码要将访问令牌附加到Facebook的图结构API中,这样才能通过该API对Facebook做一个REST调用。但前提是必须要先获得给定页面的ID。下面来看看要附加的访问令牌,其代码如下:


"website""www.dimennachildrenshistorymuseum.org""can_post"true"category_list":[
"244600818962350""History Museum"
},21);">"187751327923426""Educational Organization"
}
"likes"1793"326249424068240""category""Museum/art gallery""has_added_app""talking_about_count"8"city""New York""zip""10024""country""United States""longitude":-73.974413"state""NY""street""170 Central Park W""latitude"40.779236
"is_community_page""username""nyhistorykids""description""The first-ever museum bringing American history to life through the eyes of children,where kids plus history equals serious fun! Kids of all ages can practice their History Detective skills at the DiMenna Children's History Museum and:nnu2022 discover the past through six historic figure pavilionsnnu2022!""hours":{thu_1_close1800phone":"212873-3400linkhttps://www.facebook.com/nyhistorykids",21);">"price_range""$ (0-10)""checkins"1011"about""The DiMenna Children' History Museum is the first-ever museum bringing American history to life through the eyes of children. Visit it inside the New-York Historical Society!""New-York Historical Society DiMenna Children's History Museum""cover""https://scontent.xx.fbcdn.net/hphotos-xpf1/t31.0-8/s720x720/1049166_672951706064675_339973295_o.jpg""cover_id""672951706064675""offset_x"0"offset_y"54"672951706064675"
"were_here_count""is_published"true
如你所见,这里所展现的Facebook数据模式与Twitter非常类似。接下来,可以来看看这个用例究竟请求到了怎样的信息。在大多数情况下,用户的post、category、name、about和likes都是它的重要字段。当然,这个例子所演示的是一个博物馆的页面,而在更商业化的用例中,公司页面上应该会有一个长长的帖子列表和其他有用的信息,它们都可以提供很好的观察点。

假设组织xyz.org在Facebook上有一个专属页面,而现在想要了解有哪些用户在页面上投诉了我们。这对于投诉分类这样的应用来说也是一个很好的用例。目前实现这一应用的方式非常简单。需要先在fdump.txt中查找一组关键字,然后其操作的复杂程度就与使用文本分类算法来进行评分的方法差不多了。

现在来看另一个用例:查找感兴趣的主题,并在其结果页面中查看开放性帖子及其评论。这个功能与直接用Facebook主页上的图形搜索栏来搜索非常类似。但用编程的方式来做这件事的好处是可以自行主导这些搜索,并可以对每个页面上的用户评论进行递归搜索。下面来看看搜索用户数据的代码:


User search

request"search"{'q''nitin''type'})Place based on the nearest location.
'starbucks'Look open pages'Stanford university' pageevent matching to the key word'beach party''event'})

下面选择用同一个用例来查找帖子,不过这回主要找到的是该Facebook页面上的投诉信息。

假设现在得到了以下格式的数据:


XXXX003

Userid

FB Post

XXXX0001

The product was pathetic and I tried reaching out to your customer care,but nobody responded

XXXX002

Great work guys

Where can I call to get my account activated ??? Really bad service

在这里可以利用这些帖子中的数据来创建训练数据,在这里需要这些手动标注器标注出那些带投诉内容的评论,其他则一概忽略。一旦得到了这些重要的训练数据,就可以构建出相同的文本分类器了:

fb_classification sklearnfeature_extractiontext TfidfVectorizer
vectorizer TfidfVectorizermin_df=2 ngram_range=(),0);"> stop_ words'english'strip_accents'unicode'norm'l2' X_train vectorizerfit_transformx_train X_test transformx_test)

linear_model SGDClassifier
clf SGDClassifieralpha=.0001 n_iter).fitX_train y_train y_pred clfpredictX_test)

接下来,假设这里只有三种样本。将其中的第一种和第三种标注为投诉类信息,第二种则是非投诉类信息。尽管是以相同的方式构建了一个单元或二元模型的向量化器,但事实上这里是可以用相同的处理过程来构建一个分类器的,因为忽略了这里的一些预处理步骤。当然在某些情况下,想要得到像上面这样的训练数据是非常困难或者代价高昂的。所以对于其中的一些情况,也可以采用像文本聚类或主题建模这样的无监督型算法。除此之外,另一种做法是采用一些开放使用的不同数据集,然后用它来构建模型并应用。例如在同一个用例中,也可以直接以Web的方式来抓取一些可用的客户投诉,并将其用作模型中的训练数据。这也是一种很好的获取相关标签数据的替代做法。

有影响力的朋友

找出你社交关系图中最有影响力的人也是社交媒体中一个常见的用例。对于我们来说这个问题就是要找出一个在图结构中拥有大量入向链接和外向链接的节点,它就被认为是有影响力的节点。

在商业背景下,相同的问题可能就是要找出最有影响力的客户,并以他们为目标来推销产品。

下面就来看一下寻找有影响力的朋友的代码:

friends get_connections"me""friends")["data" friends
frd friendsfrd一旦手里有了一个包含自身所有朋友以及这些朋友的共同朋友的列表,就可以创建一个这样的数据结构:


源节点

朋友1

朋友3

朋友4

目标节点

存在链接数

朋友2

1

0

1


这是一种可用来生成某种网络关系的数据结构,它非常有利于对社交关系图进行可视化。这里使用的D3库,但Python社区中还有一个名为NetworkX(https://networkx. github.io/)的库,也可以用来生成可视化的图结构,如图 2 所示。要想生成可视化的图结构,首先要基于之前的信息弄清楚谁是谁的朋友,以此来创建一个邻接矩阵。


图2

小结

本文带你接触到了一些当下最流行的社交网络,并学习了如何使用Python来获取它们的数据。在这个过程中,我们带你了解了它们的数据结构和各类属性数据,并探索了其API所提供的不同选项。

另外,也探讨了一些在社交媒体挖掘领域中最常见的用例。这些用例包括热门话题提取、影响者检测,信息流分析等。还对其中的一些用例进行了可视化处理。除此之外,还运用了NLTK来完成一些主题获取和实体提取的任务,并用scikit-learn对一些投诉信息进行了分类。

最后,建议大家可以再寻找一些其他的社交网络环境来执行相同的用例,并自行探索它们。这些社交网络大部分都会提供一组数据API,而且其中绝大多数是开放的,足以做一些有趣的分析。如果你想实现今天所学习到的这些应用,就需要了解如何用这些API来获取数据。期待大家在学习这一切的过程中能想出更多的用例,和一些有趣的社交媒体分析。


(本文节选自印度】Nitin HardeniyaNLTK基础教程——用NLTK和Python库构建机器学习应用》)

(点击图片,立即阅读)

作者:【印度】 Nitin Hardeniya

学习NLTK和Python库构建机器学习应用。


深度探索NLP领域的基本概念,为这一领域各种开源的Python工具和库提供具有实践意义的见解。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读