色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

能不能用文本處理的方法,得到《三國演義》中的人物社交網絡再進行分析呢?

電子工程師 ? 來源:lq ? 2019-01-06 10:13 ? 次閱讀

前言

一直以來對自然語言處理和社交網絡分析都很感興趣,前者能幫助我們從文本中獲得很多發(fā)現,而后者能夠讓我們對人們和各個事物之間普遍存在的網絡般的聯系有更多認識。當二者結合,又會有怎樣的魔力呢?

作為一個三國迷,我就有了這樣的想法:能不能用文本處理的方法,得到《三國演義》中的人物社交網絡,再進行分析呢?python中有很多好工具能夠幫助我實踐我好奇的想法,現在就開始動手吧。

準備工作

獲得《三國演義》的文本。

chapters = get_sanguo() # 文本列表,每個元素為一章的文本print(chapters[0][:106])

第一回 宴桃園豪杰三結義斬黃巾英雄首立功滾滾長江東逝水,浪花淘盡英雄。是非成敗轉頭空。青山依舊在,幾度夕陽紅。白發(fā)漁樵江渚上,慣看秋月春風。一壺濁酒喜相逢。古今多少事,都付笑談中

《三國演義》并不是很容易處理的文本,它接近古文,我們會面對古人的字號等一系列別名。比如電腦怎么知道“玄德”指的就是“劉備”呢?那就要我們給它一些知識。我們人通過學習知道“玄德”是劉備的字,電腦也可以用類似的方法完成這個概念的連接。我們需要告訴電腦,“劉備”是實體(類似于一個對象的標準名),而“玄德”則是“劉備”的一個指稱,告訴的方式,就是提供電腦一個知識庫。

entity_mention_dict, entity_type_dict = get_sanguo_entity_dict()print("劉備的指稱有:",entity_mention_dict["劉備"])

劉備的指稱有: ['劉備','劉玄德','玄德','使君']

除了人的實體和指稱以外,我們也能夠包括三國勢力等別的類型的指稱,比如“蜀”又可以叫“蜀漢”,所以知識庫里還可以包括實體的類型信息來加以區(qū)分。

print("劉備的類型為",entity_type_dict["劉備"])print("蜀的類型為",entity_type_dict["蜀"])print("蜀的指稱有",entity_mention_dict["蜀"])劉備的類型為 人名蜀的類型為 勢力蜀的指稱有 ['蜀','蜀漢']

有了這些知識,理論上我們就可以編程聯系起實體的各個綽號啦。不過若是要從頭做起的話,其中還會有不少的工作量。而HarvestText[1]是一個封裝了這些步驟的文本處理庫,可以幫助我們輕松完成這個任務。

ht = HarvestText()ht.add_entities(entity_mention_dict, entity_type_dict) # 加載模型print(ht.seg("誓畢,拜玄德為兄,關羽次之,張飛為弟。",standard_name=True))['誓畢',',','拜','劉備','為兄',',','關羽','次之',',','張飛','為弟','。']

社交網絡建立

成功地把指稱統一到標準的實體名以后,我們就可以著手挖掘三國的社交網絡了。具體的建立方式是利用鄰近共現關系。每當一對實體在兩句話內同時出現,就給它們加一條邊。那么建立網絡的整個流程就如同下圖所示:

我們可以使用HarvestText提供的函數直接完成這個流程,讓我們先在第一章的小文本上實踐一下:

# 準備工作doc = chapters[0].replace("操","曹操") # 由于有時使用縮寫,這里做一個微調ch1_sentences = ht.cut_sentences(doc) # 分句doc_ch01 = [ch1_sentences[i]+ch1_sentences[i+1]foriinrange(len(ch1_sentences)-1)] #獲得所有的二連句ht.set_linking_strategy("freq")# 建立網絡G = ht.build_entity_graph(doc_ch01, used_types=["人名"]) # 對所有人物建立網絡,即社交網絡# 挑選主要人物畫圖important_nodes = [nodefornodeinG.nodesifG.degree[node]>=5]G_sub = G.subgraph(important_nodes).copy()draw_graph(G_sub,alpha=0.5,node_scale=30,figsize=(6,4))

他們之間具體有什么關系呢?我們可以利用文本摘要得到本章的具體內容:

stopwords = get_baidu_stopwords() #過濾停用詞以提高質量fori,docinenumerate(ht.get_summary(doc_ch01, topK=3, stopwords=stopwords)):print(i,doc)玄德見皇甫嵩、朱儁,具道盧植之意。嵩曰:“張梁、張寶勢窮力乏,必投廣宗去依張角。時張角賊眾十五萬,植兵五萬,相拒于廣宗,未見勝負。植謂玄德曰:“我今圍賊在此,賊弟張梁、張寶在潁川,與皇甫嵩、朱儁對壘。次日,于桃園中,備下烏牛白馬祭禮等項,三人焚香再拜而說誓曰:“念劉備、關羽、張飛,雖然異姓,既結為兄弟,則同心協力,

本章的主要內容,看來就是劉關張?zhí)覉@三結義,并且共抗黃巾賊的故事。

三國全網絡繪制

有了小范圍實踐的基礎,我們就可以用同樣的方法,整合每個章節(jié)的內容,畫出一張橫跨三國各代的大圖。

G_chapters = []forchapter in chapters: sentences = ht.cut_sentences(chapter) # 分句 docs = [sentences[i]+sentences[i+1]fori inrange(len(sentences)-1)] G_chapters.append(ht.build_entity_graph(docs, used_types=["人名"]))# 合并各張子圖G_global = nx.Graph()forG0 in G_chapters: for(u,v) in G0.edges: ifG_global.has_edge(u,v): G_global[u][v]["weight"] += G0[u][v]["weight"] else: G_global.add_edge(u,v,weight=G0[u][v]["weight"])# 忽略游離的小分支只取最大連通分量largest_comp =max(nx.connected_components(G_global), key=len)G_global = G_global.subgraph(largest_comp).copy()print(nx.info(G_global))Name:Type: GraphNumber of nodes:1290Number of edges:10096Average degree: 15.6527

整個社交網絡有1290個人那么多,還有上萬條邊!那么我們要把它畫出來幾乎是不可能的,那么我們就挑選其中的關鍵人物來畫出一個子集吧。

important_nodes= [node for node in G_global.nodes if G_global.degree[node]>=30]G_main= G_global.subgraph(important_nodes).copy()

用pyecharts進行可視化

frompyechartsimportGraphnodes = [{"name":"結點1","value":0,"symbolSize":10}foriinrange(G_main.number_of_nodes())]fori,name0inenumerate(G_main.nodes): nodes[i]["name"] = name0 nodes[i]["value"] = G_main.degree[name0] nodes[i]["symbolSize"] = G_main.degree[name0] /10.0links = [{"source":"","target":""}foriinrange(G_main.number_of_edges())]fori,(u,v)inenumerate(G_main.edges): links[i]["source"] = u links[i]["target"] = v links[i]["value"] = G_main[u][v]["weight"]graph = Graph("三國人物關系力導引圖")graph.add("", nodes, links)graph.render("./images/三國人物關系力導引圖.html")graph

博客上不能顯示交互式圖表,這里就給出截圖:顯示了劉備的鄰接結點

整個網絡錯綜復雜,背后是三國故事中無數的南征北伐、爾虞我詐。不過有了計算機的強大算力,我們依然可以從中梳理出某些關鍵線索,比如:

人物排名-重要性

對這個問題,我們可以用網絡中的排序算法解決。PageRank就是這樣的一個典型方法,它本來是搜索引擎利用網站之間的聯系對搜索結果進行排序的方法,不過對人物之間的聯系也是同理。讓我們獲得最重要的20大人物:

page_ranks= pd.Series(nx.algorithms.pagerank(G_global)).sort_values()page_ranks.tail(20).plot(kind="barh")plt.show()

《三國演義》當仁不讓的主角就是他們了,哪怕你對三國不熟悉,也一定會對這些人物耳熟能詳。

人物排名-權力值

這個問題看上去跟上面一個問題很像,但其實還是有區(qū)別的。就像人緣最好的人未必是領導一樣,能在團隊中心起到凝聚作用,使各個成員相互聯系合作的人才是最有權力的人。中心度就是這樣的一個指標,看看三國中最有權力的人是哪些吧?

between= pd.Series(nx.betweenness_centrality(G_global)).sort_values()between.tail(20).plot(kind="barh")plt.show()

結果的確和上面的排序有所不同,我們看到劉備、曹操、孫權、袁紹等主公都名列前茅。而另一個有趣的發(fā)現是,司馬懿、司馬昭、司馬師父子三人同樣榜上有名,而曹氏的其他后裔則不見其名,可見司馬氏之權傾朝野。司馬氏之心,似乎就這樣被大數據揭示了出來!

社群發(fā)現

人物關系有親疏遠近,因此往往會形成一些集團。社交網絡分析里的社區(qū)發(fā)現算法就能夠讓我們發(fā)現這些集團,讓我使用community庫[2]中的提供的算法來揭示這些關系吧。

importcommunity # python-louvainpartition = community.best_partition(G_main) # Louvain算法劃分社區(qū)comm_dict = defaultdict(list)forpersoninpartition: comm_dict[partition[person]].append(person)

在下面3個社區(qū)里,我們看到的主要是魏蜀吳三國重臣們。(只有一些小“問題”,有趣的是,電腦并不知道他們的所屬勢力,只是使用算法。)

draw_community(2)

community2: 張遼 曹仁 夏侯惇 徐晃 曹洪 夏侯淵 張郃 許褚 樂進 李典 于禁荀彧 劉曄 郭嘉 滿寵 程昱 荀攸 呂虔 典韋 文聘 董昭 毛玠

draw_community(4)

community4: 曹操 諸葛亮 劉備 關羽 趙云 張飛 馬超 黃忠 許昌 孟達[魏]孫乾曹安民 劉璋 關平 龐德 法正 伊籍 張魯 劉封 龐統 孟獲 嚴顏 馬良 簡雍 蔡瑁陶謙 孔融 劉琮[劉表子]劉望之 夏侯楙 周倉 陳登

draw_community(3)

community 3: 孫權 孫策 周瑜 陸遜 呂蒙 丁奉 周泰 程普 韓當 徐盛 張昭[吳] 馬相 黃蓋[吳] 潘璋 甘寧 魯肅 凌統 太史慈 諸葛瑾 韓吳郡 蔣欽 黃祖 闞澤 朱桓 陳武 呂范

draw_community(0)

community0: 袁紹 呂布 劉表 袁術 董卓 李傕 賈詡 審配 孫堅 郭汜 陳宮 馬騰袁尚 韓遂 公孫瓚 高順 許攸[袁紹]臧霸 沮授 郭圖 顏良 楊奉 張繡 袁譚 董承文丑 何進 張邈[魏]袁熙

還有一些其他社區(qū)。比如在這里,我們看到三國前期,孫堅、袁紹、董卓等主公們群雄逐鹿,好不熱鬧。

draw_community(1)

community1: 司馬懿 魏延 姜維 張翼 馬岱 廖化 吳懿 司馬昭 關興 吳班 王平鄧芝 鄧艾 張苞[蜀]馬忠[吳]費祎 譙周 馬謖 曹真 曹丕 李恢 黃權 鐘會 蔣琬司馬師 劉巴[蜀]張嶷 楊洪 許靖 費詩 李嚴 郭淮 曹休 樊建 秦宓 夏侯霸 楊儀高翔 張南[魏]華歆 曹爽 郤正 許允[魏]王朗[司徒]董厥 杜瓊 霍峻 胡濟 賈充 彭羕 吳蘭 諸葛誕 雷銅 孫綝 卓膺 費觀 杜義 閻晏 盛勃 劉敏 劉琰 杜祺 上官雝 丁咸 爨習 樊岐 曹芳 周群

這個社區(qū)是三國后期的主要人物了。這個網絡背后的故事,是司馬氏兩代三人打敗姜維率領的蜀漢群雄,又掃除了曹魏內部的曹家勢力,終于登上權力的頂峰。

動態(tài)網絡

研究社交網絡隨時間的變化,是個很有意思的任務。而《三國演義》大致按照時間線敘述,且有著極長的時間跨度,順著故事線往下走,社交網絡會發(fā)生什么樣的變化呢?

這里,我取10章的文本作為跨度,每5章記錄一次當前跨度中的社交網絡,就相當于留下一張快照,把這些快照連接起來,我們就能夠看到一個社交網絡變化的動畫。快照還是用networkx得到,而制作動畫,我們可以用moviepy。

江山代有才人出,讓我們看看在故事發(fā)展的各個階段,都是哪一群人活躍在舞臺中央呢?

importmoviepy.editorasmpyfrommoviepy.video.io.bindingsimportmplfig_to_npimagewidth, step =10,5range0 = range(0,len(G_chapters)-width+1,step)numFrame, fps = len(range0),1duration = numFrame/fpspos_global = nx.spring_layout(G_main)defmake_frame_mpl(t): i = step*int(t*fps) G_part = nx.Graph() forG0inG_chapters[i:i+width]: for(u,v)inG0.edges: ifG_part.has_edge(u,v): G_part[u][v]["weight"] += G0[u][v]["weight"] else: G_part.add_edge(u,v,weight=G0[u][v]["weight"]) largest_comp = max(nx.connected_components(G_part), key=len) used_nodes = set(largest_comp) & set(G_main.nodes) G = G_part.subgraph(used_nodes) fig = plt.figure(figsize=(12,8),dpi=100) nx.draw_networkx_nodes(G,pos_global,node_size=[G.degree[x]*10forxinG.nodes])# nx.draw_networkx_edges(G,pos_global) nx.draw_networkx_labels(G,pos_global) plt.xlim([-1,1]) plt.ylim([-1,1]) plt.axis("off") plt.title(f"第{i+1}到第{i+width+1}章的社交網絡") returnmplfig_to_npimage(fig)animation = mpy.VideoClip(make_frame_mpl, duration=duration)animation.write_gif("./images/三國社交網絡變化.gif", fps=fps)

美觀起見,動畫中省略了網絡中的邊。

隨著時間的變化,曾經站在歷史舞臺中央的人們也漸漸地會漸漸離開,讓人不禁唏噓感嘆。正如《三國演義》開篇所言:

古今多少事,都付笑談中。

今日,小輩利用python做的一番笑談也就到此結束吧……

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4792

    瀏覽量

    84630
  • 自然語言處理

    關注

    1

    文章

    618

    瀏覽量

    13553

原文標題:用Python走入史學經典《三國演義》中的社交網絡

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    詳解Linux Shell文本處理工具

      今天給大家分享日常工作中常用到的shell文本處理工具,可以說是史上最全了,大家掌握住這些工具,可以在日常運維工作起到事半功倍的作用!
    發(fā)表于 10-27 09:19 ?537次閱讀

    使用 Linux/Unix 進行文本處理

    (表示 unique)可以在排序結果中去除重復行: 能不能按照月份排序?選項 -M (表示 month-sort)可以幫助我們: 按照第二列的數字進行排序也是很簡單的: 上面的例子
    發(fā)表于 11-24 15:39

    shell文本處理方法是什么

    shell文本處理劍客—grep
    發(fā)表于 05-27 12:32

    能不能用Micropython驅動OLED屏幕看視頻

    前幾天突然突發(fā)奇想:能不能用Micropython驅動OLED屏幕看視頻?剛好,看到網上有人實現了差不多的效果,我就借這個機會進行了深入研究,終于讓我找出了最方便的,顯示動畫和圖像的方法
    發(fā)表于 01-07 07:02

    中國數字電視接口標準上演“三國演義

    中國數字電視接口標準上演“三國演義” “這件事情還是比較著急的,因為早就立項了。”中國電子視像行業(yè)協會副會長郝亞斌的一句話,透露出來的卻是中國數字高
    發(fā)表于 11-20 09:27 ?410次閱讀

    電池能不能修復?

    電池能不能修復? 電池修復作為一個新生事物,許多人對它不了解,也有許多人對它一知半解。那么電池到底能不能修復
    發(fā)表于 11-23 10:40 ?1094次閱讀

    易語言-文本處理

    易語言是一門以中文作為程序代碼編程語言學習例程:易語言-文本處理
    發(fā)表于 06-06 17:43 ?1次下載

    鋰電池技術哪家強_中日韓三國爭霸誰主沉浮

    由于不同類型的鋰電池在各方面性能差異很大,市場上鋰電池的龍頭企業(yè)主要來源中日韓三國,各家對鋰電池類型的選擇也不盡相同,且競爭愈發(fā)激烈。隨著動力鋰電池進入寡頭時代,我們本期文章就來看看“中日韓的三國演義”是如何演的。
    發(fā)表于 02-26 19:03 ?1854次閱讀

    Python網頁爬蟲,文本處理,科學計算,機器學習和數據挖掘工具集

    本文檔的主要內容詳細介紹的是Python工具包合集包括了:網頁爬蟲工具集,文本處理工具集,Python科學計算工具包,Python機器學習和數據挖掘 工具包
    發(fā)表于 09-07 17:14 ?37次下載
    Python網頁爬蟲,<b class='flag-5'>文本處理</b>,科學計算,機器學習和數據挖掘工具集

    指針能不能作為循環(huán)變量?

    指針能不能作為循環(huán)變量?
    的頭像 發(fā)表于 02-16 18:11 ?1033次閱讀

    文本處理技巧之正則表達式

    在LabVIEW開發(fā)過程,有很多地方都需要處理文本數據,比如數據通訊、報表生成、協議解析、文件I/O、界面交互等,那有沒有一個工具可以幫助我們快速處理
    的頭像 發(fā)表于 03-07 10:24 ?3929次閱讀

    物聯網流量卡到底能不能用

    物聯網流量卡到底能不能用
    的頭像 發(fā)表于 08-28 09:40 ?6308次閱讀
    物聯網流量卡到底<b class='flag-5'>能不能用</b>?

    幾個LED并聯,能不能用恒壓電源?

    幾個LED并聯,能不能用恒壓電源? LED(Light Emitting Diode)是一種非常常見的光電元件,它具有低功耗、高亮度、長壽命等優(yōu)點,因此廣泛應用于照明、顯示和指示等領域。而在實際
    的頭像 發(fā)表于 11-30 11:43 ?1157次閱讀

    單日獲客成本超20萬,國產大模型開卷200萬字以上的長文本處理

    更精準的推理和高并發(fā)流量以外,似乎已經沒有太多值得廠商大肆宣傳的特性了,直到最近超長文本處理的爆火。 ? 國產大模型的新卷法,長文本處理 ? 當下將大模型長文本處理炒熱的,無疑是來自月之暗面的Kimi。作為去年發(fā)布的大模型,Ki
    的頭像 發(fā)表于 03-27 00:53 ?3362次閱讀
    單日獲客成本超20萬,國產大模型開卷200萬字以上的長<b class='flag-5'>文本處理</b>

    一體成型電感外殼破損還能不能用

    電子發(fā)燒友網站提供《一體成型電感外殼破損還能不能用.docx》資料免費下載
    發(fā)表于 10-31 10:57 ?0次下載
    主站蜘蛛池模板: 亚洲地址一地址二地址三| 国产美女影院| 六月婷婷国产精品综合| 羞羞漫画免费漫画页面在线看漫画秋蝉| www免费看.男人的天堂| 老色哥网站| 玉林天天论坛| 激情床戏视频片段有叫声| 欧美成人亚洲高清在线观看| 日本一本道高清码v| 亚洲成人黄色片| 国产精品久久久久久久久爆乳| 好男人好资源在线观看| 欧美夜夜噜2017最新| 亚洲a视频在线| brazzers情欲狂欢| 激情床戏揉胸吃胸视频| 无码AV精品久久一区二区免费| 中文字幕日本一区| 国产一区二区三区影院| 亲爱的妈妈6韩国电影免费观看| 中文字幕在线观看网址| 久久亚洲AV成人无码动态图| 亚洲色欲色欲www474ee| 精品淑女少妇AV久久免费| 亚洲人成77777| 久久成人午夜电影mp4| 用快播看黄的网站| 久久伊人免费| 67194con免费福和视频| 曼谷av女郎| chinesetoilet美女沟| 日本成熟bbxxxxxxxx| 大胸美女洗澡扒奶衣挤奶| 色一欲一性一乱一区二区三区| 刮伦人妇A极一片| 我就去色色| 国产自拍视频在线一区| 亚洲性无码av在线| 久章草一区二区| 99久久国产露脸精品国产麻豆 |