天天看點

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

前言

最近在朋友圈拜讀了Python愛好者社群公衆号轉載的徐麟兄釋出的《

“水泊梁山“網際網路有限公司一百單八将内部社交網絡

》,内容相當精彩,收益匪淺。本文帶領我第一次接觸倒了“社交網絡以及社群發現”,開拓了知識領域,也深入見識了Gephi社交網絡分析的魅力。

于是準備深入研究并實作其文章中的内容。細看之下,發現此文雖然資料分析思路很新奇,但是代碼實作比較粗糙,既缺乏相關的python包說明,文末也沒有github代碼連結。經過幾番嘗試,模仿學習基本實作本文内容,特此記錄下來分享一下。

STEP1:分析原文代碼

首先說明一下原文代碼的問題,以及原文代碼用到的python包。

我講原文代碼拷貝拼接後,發現第一個問題,包引用的問題。

第一個重量級的包,“haohan = pd.read_excel('水浒人物.xlsx')”通過這句以及平時的經驗可以知道引用了pandas包,通用寫法“import pandas as pd”。

第二個比較蹊跷的包引用是“bar = Bar("水泊梁山年收入TOP10")”。可能是本人經驗有限,沒有用過Bar包(也可能是子產品)。于是求助百度,幾番搜尋嘗試之下,終于找到了pyecharts。核對後面引用的方法,确定是此包無疑。

python包有了,于是安裝兩個包。安裝語句如下:

pip install pandas
pip install pyecharts
           

本以為解決了包的問題,就可以運作徐麟兄的代碼,豈知事情并非如此簡單。

PART1代碼如下:

with open("水浒傳全文.txt", encoding='gb18030') as file:
    shuihu = file.read()
shuihu = shuihu.replace('\n','')
shuihu_set = shuihu.split(' ')
shuihu_set=[k for k in shuihu_set if k!='']
songjiang_set=[k for k in shuihu_set if '宋江' in k]
haohan = pd.read_excel('水浒人物.xlsx')
haohan['出場段落']=0
           

第一二行是讀取文本檔案,弱弱的說一句,缺少了檔案關閉語句。不過由于此文是讀取檔案,不影響程式執行。不過從代碼規範性看,file.colse()是必不可少的。

第三、四、五行代碼是對讀取的内容進行簡單處理并切分成一段一段的list集合。

不知徐麟兄是故意為之還是筆誤,第三行将換行符替換成了空字元,第四行又用空格符進行切分。按照後文提到的按段落劃分,應該是将換行符替換成空格符,然後根據空格符切分才合理。

第七行擷取所有段落中包含“宋江”字元串的段落;

第八行讀取水浒人物表生成DataFrame,暫無該文檔,不知其内容。

第九行更詭異,直接将DataFrame的一個新字段全部設定為0.

正是由于第九行全部設定為0,是以我運作後面的代碼得到的結果如下。

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

很詭異吧,全部是0。但是分析了上面的代碼我才知道了原因。

認真學習了徐麟兄後面的内容,基本明白了其“出場段落”字段的含義。後文寫到“作為能夠長期運作的網際網路公司,在員工收入配置設定方面始終員工KPI(出場段落數量)相挂鈎,我們來看一下年薪TOP10和BOTTOM10”,其實隻是普通的wordcount單詞統計的一個變異,大緻意思就是将原文按照行或者段落劃分,統計水浒108将的名字在所有段落中出現的段落數,即每一個人物(文章稱haohan)如果在一個自然段中出現一次或者多次,則視為該人物KPI+1.

上文第七行以宋江為例的代碼可以看出這一點。

songjiang_set=[k for k in shuihu_set if '宋江' in k]
           

PART2是引用pyecharts包中的Bar子產品實作資料展現,這一部分内容比較簡單易懂,也非我所長,略過後文再叙。

PART3部分的代碼如下:

net_df = pd.DataFrame(columns=['Source','Target','Weight','Source_Ratio','Target_Ratio'])
for i in range(0,107):
    for j in range(i+1,108):
        this_weight = len([k for k in shuihu_set if haohan['使用名'][i] in k and haohan['使用名'][j] in k])
        net_df=net_df.append({'Source':haohan['姓名'][i],'Target':haohan['姓名'][j],
                              'Weight':this_weight,
                              'Source_Ratio':this_weight/haohan['出場段落'][i],
                              'Target_Ratio':this_weight/haohan['出場段落'][j]},
                              ignore_index=True)
        print(str(i)+':'+str(j))
           

這部分代碼再次讓我感受到了迷茫。繼續嘗試解讀一下吧。

第一行,定義了一個五個字段的DataFrame;

第二、三行建立了一個兩層的循環,讓水浒108好漢兩兩成對進行比對成對;

第四行計算兩兩成對的好漢出現在同一個自然段或者說原文同一行的次數;

第五至九行給DataFrame拼接資料;

第十行隻是輸出了兩兩成對的姓名。

That's all?這樣就完了?

其後隻是簡單的一句“我們在去除一些社交網絡節點資料(聊天總數較少或聊天數量占一方數量比例過少)的情況後,用Gephi軟體繪制出了整體的社交網絡圖如下:”就把我們帶入了分析結果的頁面。作為讀者,個人是覺得徐麟兄這篇文章是不太負責任的,寫得太粗糙了。

STEP2:亮出我的代碼

為了能實作後面的内容,我隻好自行補充完善了這部分代碼。

首先,準備兩個素材,《水浒傳.txt》和《水浒人物.xlsx》,我自行去網上下載下傳了這本小說文字版,并找到了所有人物姓名。經檢查,小說文章是按行劃分段落,滿足要求。《水浒人物.xlsx》僅有一列,字段名為“姓名”。

然後改寫代碼如下:

with open(u'水浒傳.txt','r') as f:
    shuihu_set = f.readlines()
    f.close()
haohan = pd.read_excel(u'水浒人物.xlsx')    
haohan['出場段落'] = haohan.apply(lambda x:len([k for k in shuihu_set if x[u'姓名'] in k]), axis = 1)
           

第一二三行是讀取文本檔案,本次采用自帶的os子產品之間讀取檔案每一行生成一個list。

第三行讀取excel文檔中水浒人物的姓名。

第四行通過水浒人物的姓名計算出對于人物在水浒傳中的“KPI”,即(出場段落數量)

至此,資料準備完畢。

STEP3:沿用原來的分析代碼生成分析結果。

原文代碼如下:

haohan.sort_values('出場段落',ascending=False,inplace=True)
attr = haohan['姓名'][0:10]
v1 = haohan['出場段落'][0:10]
bar = Bar("水泊梁山年收入TOP10")
bar.add("年收入(萬)", attr, v1, is_stack=True,is_label_show=True)
bar.render('水泊梁山年收入TOP10.html')

haohan.sort_values('出場段落',ascending=True,inplace=True)
attr = haohan['姓名'][0:10]
v1 = haohan['出場段落'][0:10]
bar = Bar("水泊梁山年收入BOTTOM10")
bar.add("年收入(萬)", attr, v1, is_stack=True,is_label_show=True)
bar.render('水泊梁山年收入BOTTOM10.html')
           

本次生成的結果截圖如下:

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》
解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

兩圖資料和徐麟兄的結果略有差異,可能是我們用的文本檔案不一緻造成的。這個并不影響我們進一步分析。

STEP4:生成資料及社交網絡分析

到了社交網絡這一部分了,我并不知道“我們在去除一些社交網絡節點資料(聊天總數較少或聊天數量占一方數量比例過少)的情況後”去除了一些什麼資料,隻能嘗試這用一下Gephi軟體。

根據百度上的了解和對徐麟原文的分析,生成社交網絡總共需要

'Source','Target','Weight','Source_Ratio','Target_Ratio'           

五個字段的資料,經分析,我改寫的程式完全可以接上第三部分的程式,是以不做任何修改,僅将結果導出到csv檔案。

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

加上代碼“

`

js

net_df.to_csv('sjwl.csv',index=False,sep=',')

`

生成資料如上圖。

接下來下載下傳Gephi軟體并安裝。下載下傳到的安裝包中竟然還有一份使用教程,簡直神助攻!

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

安裝好以後,打開軟體,進入主界面。

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

好吧,最開始導入資料後結果如下圖。

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

我的想法和大家一樣,這是什麼鬼!

幾番琢磨和調整,得到的資料圖如下,隻能說差強人意了。最後用到的資料隻有前面三列,後面兩列程式也沒有跑出資料。

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

這裡把導入分析的資料截個圖。

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》

文章就寫到這裡,Gephi軟體還需要花時間再研究研究。

完整代碼如下:

解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》
解讀實作資料森麟《“水泊梁山“網際網路有限公司一百單八将内部社交網絡》
import pandas as pd
from pyecharts import Bar
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

with open(u'水浒傳.txt','r') as f:
shuihu_set = f.readlines()
f.close() 
haohan = pd.read_excel(u'水浒人物.xlsx')
haohan['出場段落'] = haohan.apply(lambda x:len([k for k in shuihu_set if x[u'姓名'] in k]), axis = 1)

haohan.to_csv('haohan.csv',index=False,sep=',')

haohan.sort_values('出場段落',ascending=False,inplace=True)
attr = haohan['姓名'][0:10]
v1 = haohan['出場段落'][0:10]
bar = Bar("水泊梁山年收入TOP10")
bar.add("年收入(萬)", attr, v1, is_stack=True,is_label_show=True)
bar.render(u'水泊梁山年收入TOP10.html')

haohan.sort_values('出場段落',ascending=True,inplace=True)
attr = haohan['姓名'][0:10]
v1 = haohan['出場段落'][0:10]
bar = Bar("水泊梁山年收入BOTTOM10")
bar.add("年收入(萬)", attr, v1, is_stack=True,is_label_show=True)
bar.render(u'水泊梁山年收入BOTTOM10.html')

net_df = pd.DataFrame(columns=['Source','Target','Weight','Source_Ratio','Target_Ratio'])
for i in range(0,107):
for j in range(i+1,108):
this_weight = len([k for k in shuihu_set if haohan['姓名'][i] in k and haohan['姓名'][j] in k])
net_df=net_df.append({'Source':haohan['姓名'][i],'Target':haohan['姓名'][j],
'Weight':this_weight,
'Source_Ratio':this_weight/haohan['出場段落'][i],
'Target_Ratio':this_weight/haohan['出場段落'][j]},
ignore_index=True)
print(str(i)+':'+str(j))

net_df.to_csv('sjwl.csv',index=False,sep=',')
           

很少寫技術類的博文,有些啰嗦了。

原文釋出時間為:2018-07-24

本文作者: 螞蟻

本文來自雲栖社群合作夥伴“

Python愛好者社群

”,了解相關資訊可以關注“