WeChat의 인기로 인해 점점 더 많은 사람들이 WeChat을 사용하기 시작했습니다. WeChat은 단순한 소셜 소프트웨어에서 점차 생활 방식으로 변모했습니다. 사람들은 일상적인 의사소통을 위해 WeChat을 필요로 하고, 업무상 의사소통을 위해서도 WeChat을 필요로 합니다. WeChat의 모든 친구는 사람들이 사회에서 수행하는 다양한 역할을 나타냅니다.
오늘 글에서는 Python을 기반으로 WeChat 친구에 대한 데이터 분석을 수행합니다. 여기서 선택한 차원은 주로 성별, 아바타, 서명 및 위치입니다. 그 중 결과는 주로 차트와 워드 클라우드의 형태로 표시됩니다. , 텍스트 정보의 경우 단어 빈도 분석과 감정 분석의 두 가지 방법을 사용합니다. 속담처럼: 노동자가 자신의 일을 잘하고 싶다면 먼저 도구를 갈고 닦아야 합니다. 이 기사를 공식적으로 시작하기 전에 이 기사에 사용된 타사 모듈을 간략하게 소개하겠습니다.
itchat: WeChat 웹 인터페이스는 이 기사에서 WeChat 친구 정보를 얻기 위해 사용되는 Python 버전을 캡슐화합니다.
jieba: 이 문서에서 텍스트 정보를 분할하는 데 사용되는 말더듬 단어 분할의 Python 버전입니다.
matplotlib: 이 기사에서 세로 막대형 차트와 원형 차트를 그리는 데 사용되는 Python의 차트 그리기 모듈
snownlp: 이 기사에서 텍스트 정보에 대한 감정적 판단을 내리는 데 사용되는 Python의 중국어 단어 분할 모듈.
PIL: 이 문서에서 이미지를 처리하는 데 사용되는 Python의 이미지 처리 모듈입니다.
numpy: 이 기사의 wordcloud 모듈과 함께 사용되는 Python의 수치 계산 모듈입니다.
wordcloud: 이 글에서는 Python의 단어 구름 모듈을 사용하여 단어 구름 그림을 그립니다.
TencentYoutuyun: 이 글에서는 Tencent Youtuyun에서 제공하는 Python 버전 SDK를 사용하여 얼굴을 인식하고 이미지 태그 정보를 추출합니다.
위 모듈은 pip를 통해 설치할 수 있습니다. 각 모듈의 사용에 대한 자세한 지침은 해당 설명서를 참조하세요.
WeChat 친구 데이터를 분석하기 위한 전제 조건은 itchat 모듈을 사용하면 다음 두 줄의 코드를 통해 이를 달성할 수 있다는 것입니다. WeChat과 마찬가지로 휴대폰으로 QR 코드를 스캔하여 로그인할 수 있습니다. 여기에 반환된 친구 개체는 컬렉션이고 첫 번째 요소는 현재 사용자입니다. 따라서 다음 데이터 분석 과정에서는 항상 friends[1:]을 원본 입력 데이터로 사용하며, 컬렉션의 각 요소는 사전 구조로 되어 있음을 예로 들면 Sex, City, Province가 있음을 알 수 있습니다. , HeadImgUrl 및 Signature는 다음 네 가지 필드에서 시작됩니다.
2. 친구의 성별
itchat.auto_login(hotReload = True) friends = itchat.get_friends(update = True)
이 코드에 대한 간략한 설명은 다음과 같습니다. WeChat의 성별 필드에는 Unkonw, Male 및 Female의 세 가지 값이 있으며 해당 값은 다음과 같습니다. 각각 0, 1, 2입니다. 이 세 가지 다른 값은 Collection 모듈의 Counter()를 통해 계산되며 해당 items() 메서드는 튜플 컬렉션을 반환합니다.
이 튜플의 첫 번째 차원 요소는 키, 즉 0, 1, 2를 나타냅니다. 이 튜플의 두 번째 차원 요소는 숫자를 나타내고 이 튜플의 집합은 정렬됩니다. 즉, 키는 다음과 같습니다. 0, 1, 2. 2이므로 이 세 가지 다른 값의 수는 map() 메서드를 통해 얻을 수 있습니다. 이 세 가지 값의 백분율은 다음과 같이 계산됩니다. matplotlib. 다음 그림은 matplotlib에서 그린 친구의 성별 분포입니다.
3. 친구 아바타
여기서 HeadImgUrl 필드를 기반으로 로컬로 아바타를 다운로드한 다음 Tencent Youtu에서 제공하는 얼굴 인식 관련 API 인터페이스를 사용하여 아바타 이미지에 얼굴이 있는지 감지하고 이미지에 태그를 추출해야 합니다. 그 중 전자는 분류와 요약이고, 후자는 텍스트 분석이고, 워드클라우드를 이용해 결과를 제시하는 방식이다. 키 코드는 다음과 같습니다:
def analyseHeadImage(frineds): # Init Path basePath = os.path.abspath('.') baseFolder = basePath + '\HeadImages\' if(os.path.exists(baseFolder) == False): os.makedirs(baseFolder) # Analyse Images faceApi = FaceAPI() use_face = 0 not_use_face = 0 image_tags = '' for index in range(1,len(friends)): friend = friends[index] # Save HeadImages imgFile = baseFolder + '\Image%s.jpg' % str(index) imgData = itchat.get_head_img(userName = friend['UserName']) if(os.path.exists(imgFile) == False): with open(imgFile,'wb') as file: file.write(imgData) # Detect Faces time.sleep(1) result = faceApi.detectFace(imgFile) if result == True: use_face += 1 else: not_use_face += 1 # Extract Tags result = faceApi.extractTags(imgFile) image_tags += ','.join(list(map(lambda x:x['tag_name'],result))) labels = [u'使用人脸头像',u'不使用人脸头像'] counts = [use_face,not_use_face] colors = ['red','yellowgreen','lightskyblue'] plt.figure(figsize=(8,5), dpi=80) plt.axes(aspect=1) plt.pie(counts, #性别统计结果 labels=labels, #性别展示标签 colors=colors, #饼图区域配色 labeldistance = 1.1, #标签距离圆点距离 autopct = '%3.1f%%', #饼图区域文本格式 shadow = False, #饼图是否显示阴影 startangle = 90, #饼图起始角度 pctdistance = 0.6 #饼图区域文本距离圆点距离 ) plt.legend(loc='upper right',) plt.title(u'%s的微信好友使用人脸头像情况' % friends[0]['NickName']) plt.show() image_tags = image_tags.encode('iso8859-1').decode('utf-8') back_coloring = np.array(Image.open('face.jpg')) wordcloud = WordCloud( font_path='simfang.ttf', background_color="white", max_words=1200, mask=back_coloring, max_font_size=75, random_state=45, width=800, height=480, margin=15 ) wordcloud.generate(image_tags) plt.imshow(wordcloud) plt.axis("off") plt.show()
这里我们会在当前目录新建一个HeadImages目录,用于存储所有好友的头像,然后我们这里会用到一个名为FaceApi类,这个类由腾讯优图的SDK封装而来,这里分别调用了人脸检测和图像标签识别两个API接口,前者会统计”使用人脸头像”和”不使用人脸头像”的好友各自的数目,后者会累加每个头像中提取出来的标签。其分析结果如下图所示:
可以注意到,在所有微信好友中,约有接近1/4的微信好友使用了人脸头像, 而有接近3/4的微信好友没有人脸头像,这说明在所有微信好友中对”颜值 “有自信的人,仅仅占到好友总数的25%,或者说75%的微信好友行事风格偏低调为主,不喜欢用人脸头像做微信头像。
其次,考虑到腾讯优图并不能真正的识别”人脸”,我们这里对好友头像中的标签再次进行提取,来帮助我们了解微信好友的头像中有哪些关键词,其分析结果如图所示:
通过词云,我们可以发现:在微信好友中的签名词云中,出现频率相对较高的关键字有:女孩、树木、房屋、文本、截图、卡通、合影、天空、大海。这说明在我的微信好友中,好友选择的微信头像主要有日常、旅游、风景、截图四个来源。
好友选择的微信头像中风格以卡通为主,好友选择的微信头像中常见的要素有天空、大海、房屋、树木。通过观察所有好友头像,我发现在我的微信好友中,使用个人照片作为微信头像的有15人,使用网络图片作为微信头像的有53人,使用动漫图片作为微信头像的有25人,使用合照图片作为微信头像的有3人,使用孩童照片作为微信头像的有5人,使用风景图片作为微信头像的有13人,使用女孩照片作为微信头像的有18人,基本符合图像标签提取的分析结果。
分析好友签名,签名是好友信息中最为丰富的文本信息,按照人类惯用的”贴标签”的方法论,签名可以分析出某一个人在某一段时间里状态,就像人开心了会笑、哀伤了会哭,哭和笑两种标签,分别表明了人开心和哀伤的状态。
这里我们对签名做两种处理,第一种是使用结巴分词进行分词后生成词云,目的是了解好友签名中的关键字有哪些,哪一个关键字出现的频率相对较高;第二种是使用SnowNLP分析好友签名中的感情倾向,即好友签名整体上是表现为正面的、负面的还是中立的,各自的比重是多少。这里提取Signature字段即可,其核心代码如下:
def analyseSignature(friends): signatures = '' emotions = [] pattern = re.compile("1fd.+") for friend in friends: signature = friend['Signature'] if(signature != None): signature = signature.strip().replace('span', '').replace('class', '').replace('emoji', '') signature = re.sub(r'1f(d.+)','',signature) if(len(signature)>0): nlp = SnowNLP(signature) emotions.append(nlp.sentiments) signatures += ' '.join(jieba.analyse.extract_tags(signature,5)) with open('signatures.txt','wt',encoding='utf-8') as file: file.write(signatures) # Sinature WordCloud back_coloring = np.array(Image.open('flower.jpg')) wordcloud = WordCloud( font_path='simfang.ttf', background_color="white", max_words=1200, mask=back_coloring, max_font_size=75, random_state=45, width=960, height=720, margin=15 ) wordcloud.generate(signatures) plt.imshow(wordcloud) plt.axis("off") plt.show() wordcloud.to_file('signatures.jpg') # Signature Emotional Judgment count_good = len(list(filter(lambda x:x>0.66,emotions))) count_normal = len(list(filter(lambda x:x>=0.33 and x<=0.66,emotions))) count_bad = len(list(filter(lambda x:x<0.33,emotions))) labels = [u'负面消极',u'中性',u'正面积极'] values = (count_bad,count_normal,count_good) plt.rcParams['font.sans-serif'] = ['simHei'] plt.rcParams['axes.unicode_minus'] = False plt.xlabel(u'情感判断') plt.ylabel(u'频数') plt.xticks(range(3),labels) plt.legend(loc='upper right',) plt.bar(range(3), values, color = 'rgb') plt.title(u'%s的微信好友签名信息情感分析' % friends[0]['NickName']) plt.show()
通过词云,我们可以发现:在微信好友的签名信息中,出现频率相对较高的关键词有:努力、长大、美好、快乐、生活、幸福、人生、远方、时光、散步。
通过以下柱状图,我们可以发现:在微信好友的签名信息中,正面积极的情感判断约占到55.56%,中立的情感判断约占到32.10%,负面消极的情感判断约占到12.35%。这个结果和我们通过词云展示的结果基本吻合,这说明在微信好友的签名信息中,约有87.66%的签名信息,传达出来都是一种积极向上的态度。
分析好友位置,主要通过提取Province和City这两个字段。Python中的地图可视化主要通过Basemap模块,这个模块需要从国外网站下载地图信息,使用起来非常的不便。
百度的ECharts在前端使用的比较多,虽然社区里提供了pyecharts项目,可我注意到因为政策的改变,目前Echarts不再支持导出地图的功能,所以地图的定制方面目前依然是一个问题,主流的技术方案是配置全国各省市的JSON数据。
这里我使用的是BDP个人版,这是一个零编程的方案,我们通过Python导出一个CSV文件,然后将其上传到BDP中,通过简单拖拽就可以制作可视化地图,简直不能再简单,这里我们仅仅展示生成CSV部分的代码:
def analyseLocation(friends): headers = ['NickName','Province','City'] with open('location.csv','w',encoding='utf-8',newline='',) as csvFile: writer = csv.DictWriter(csvFile, headers) writer.writeheader() for friend in friends[1:]: row = {} row['NickName'] = friend['NickName'] row['Province'] = friend['Province'] row['City'] = friend['City'] writer.writerow(row)
下图是BDP中生成的微信好友地理分布图,可以发现:我的微信好友主要集中在宁夏和陕西两个省份。
这篇文章是我对数据分析的又一次尝试,主要从性别、头像、签名、位置四个维度,对微信好友进行了一次简单的数据分析,主要采用图表和词云两种形式来呈现结果。总而言之一句话,”数据可视化是手段而并非目的”,重要的不是我们在这里做了这些图出来,而是从这些图里反映出来的现象,我们能够得到什么本质上的启示,希望这篇文章能让大家有所启发。
위 내용은 나는 Python을 사용하여 WeChat 친구를 크롤링했는데 그들은 다음과 같습니다...의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!