<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python來(lái)理一理紅樓夢(mèng)里的那些關(guān)系

          共 7321字,需瀏覽 15分鐘

           ·

          2023-08-16 14:17

          教程、案例源碼、學(xué)習(xí)資料、讀者群

          請(qǐng)?jiān)L問(wèn): python666.cn

          大家好,歡迎來(lái)到 Crossin的編程教室 !

          今天,我們一起用 Python 來(lái)理一理紅樓夢(mèng)里的那些關(guān)系。

          不要問(wèn)我為啥是紅樓夢(mèng),而不是水滸三國(guó)或西游,因?yàn)槲乙矆?jiān)定地認(rèn)為,紅樓才是無(wú)可爭(zhēng)議的中國(guó)古典小說(shuō)只巔峰,且不接受反駁!而紅樓夢(mèng)也是我多次反復(fù)品讀的為數(shù)不多的小說(shuō),對(duì)它的感情也是最深的。

          好了,不酸了,開(kāi)干。

          數(shù)據(jù)準(zhǔn)備

          1. 紅樓夢(mèng) TXT 文件一份

          2. 金陵十二釵 + 賈寶玉 人物名稱列表


          人物列表內(nèi)容如下:

          寶玉 nr
          黛玉 nr
          寶釵 nr
          湘云 nr
          鳳姐 nr
          李紈 nr
          元春 nr
          迎春 nr
          探春 nr
          惜春 nr
          妙玉 nr
          巧姐 nr
          秦氏 nr

          這份列表,同時(shí)也是為了做分詞時(shí)使用,后面的 nr 就是人名的意思。

          數(shù)據(jù)處理

          讀取數(shù)據(jù)并加載詞典

              with open("紅樓夢(mèng).txt", encoding='gb18030'as f:
                  honglou = f.readlines()
              jieba.load_userdict("renwu_forcut")
              renwu_data = pd.read_csv("renwu_forcut", header=-1)
              mylist = [k[0].split(" ")[0for k in renwu_data.values.tolist()]

          這樣,我們就把紅樓夢(mèng)讀取到了 honglou 這個(gè)變量當(dāng)中,同時(shí)也通過(guò) load_userdict 將我們自定義的詞典加載到了 jieba 庫(kù)中。

          對(duì)文本進(jìn)行分詞處理并提取

          tmpNames = []
              names = {}
              relationships = {}
              for h in honglou:
                  h.replace("賈妃""元春")
                  h.replace("李宮裁""李紈")
                  poss = pseg.cut(h)
                  tmpNames.append([])
                  for w in poss:
                      if w.flag != 'nr' or len(w.word) != 2 or w.word not in mylist:
                          continue
                      tmpNames[-1].append(w.word)
                      if names.get(w.word) is None:
                          names[w.word] = 0
                      relationships[w.word] = {}
                      names[w.word] += 1
          • 首先,因?yàn)槲闹?賈妃", "元春","李宮裁", "李紈" 混用嚴(yán)重,所以這里直接做替換處理。

          • 然后使用 jieba 庫(kù)提供的 pseg 工具來(lái)做分詞處理,會(huì)返回每個(gè)分詞的詞性。

          • 之后做判斷,只有符合要求且在我們提供的字典列表里的分詞,才會(huì)保留。

          • 一個(gè)人每出現(xiàn)一次,就會(huì)增加一,方便后面畫關(guān)系圖時(shí),人物 node 大小的確定。

          • 對(duì)于存在于我們自定義詞典的人名,保存到一個(gè)臨時(shí)變量當(dāng)中 tmpNames。

          處理人物關(guān)系

              for name in tmpNames:
                  for name1 in name:
                      for name2 in name:
                          if name1 == name2:
                              continue
                          if relationships[name1].get(name2) is None:
                              relationships[name1][name2] = 1
                          else:
                              relationships[name1][name2] += 1

          對(duì)于出現(xiàn)在同一個(gè)段落中的人物,我們認(rèn)為他們是關(guān)系緊密的,每同時(shí)出現(xiàn)一次,關(guān)系增加1.

          保存到文件

              with open("relationship.csv""w", encoding='utf-8'as f:
                  f.write("Source,Target,Weight\n")
                  for name, edges in relationships.items():
                      for v, w in edges.items():
                          f.write(name + "," + v + "," + str(w) + "\n")

              with open("NameNode.csv""w", encoding='utf-8'as f:
                  f.write("ID,Label,Weight\n")
                  for name, times in names.items():
                      f.write(name + "," + name + "," + str(times) + "\n")
          • 文件1:人物關(guān)系表,包含首先出現(xiàn)的人物、之后出現(xiàn)的人物和一同出現(xiàn)次數(shù)

          • 文件2:人物比重表,包含該人物總體出現(xiàn)次數(shù),出現(xiàn)次數(shù)越多,認(rèn)為所占比重越大。

          制作關(guān)系圖表

          使用 pyecharts 作圖

          def deal_graph():
              relationship_data = pd.read_csv('relationship.csv')
              namenode_data = pd.read_csv('NameNode.csv')
              relationship_data_list = relationship_data.values.tolist()
              namenode_data_list = namenode_data.values.tolist()

              nodes = []
              for node in namenode_data_list:
                  if node[0] == "寶玉":
                      node[2] = node[2]/3
                  nodes.append({"name": node[0], "symbolSize": node[2]/30})
              links = []
              for link in relationship_data_list:
                  links.append({"source": link[0], "target": link[1], "value": link[2]})

              g = (
                  Graph()
                  .add("", nodes, links, repulsion=8000)
                  .set_global_opts(title_opts=opts.TitleOpts(title="紅樓人物關(guān)系"))
              )
              return g
          • 首先把兩個(gè)文件讀取成列表形式

          • 對(duì)于“寶玉”,由于其占比過(guò)大,如果統(tǒng)一進(jìn)行縮放,會(huì)導(dǎo)致其他人物的 node 過(guò)小,展示不美觀,所以這里先做了一次縮放

          最后得出的關(guān)系圖

          所有代碼已經(jīng)上傳至 Github:
          https://github.com/zhouwei713/data_analysis/tree/master/honglou
          最后,我還準(zhǔn)備了一份更加全面的紅樓人物字典,可以在代碼倉(cāng)庫(kù)中找到-“renwu_total”,感興趣的小伙伴也可以嘗試下,制作一個(gè)全人物的關(guān)系圖。

          作者:蘿卜大雜燴

          來(lái)源:蘿卜大雜燴


          Crossin的第2本書(shū)碼上行動(dòng):利用Python與ChatGPT高效搞定Excel數(shù)據(jù)分析已經(jīng)上市了

          點(diǎn)此查看上一本《碼上行動(dòng):零基礎(chǔ)學(xué)會(huì)Python編程》介紹

          本書(shū)從 Python 和 Excel 結(jié)合使用的角度講解處理分析數(shù)據(jù)的思路、方法與實(shí)戰(zhàn)應(yīng)用。不論是希望從事數(shù)據(jù)分析崗位的學(xué)習(xí)者,還是其他職業(yè)的辦公人員,都可以通過(guò)本書(shū)的學(xué)習(xí)掌握 Python 分析數(shù)據(jù)的技能。書(shū)中創(chuàng)新性地將 ChatGPT 引入到教學(xué)當(dāng)中,用 ChatGPT 答疑并提供實(shí)訓(xùn)代碼,并介紹了使用 ChatGPT 輔助學(xué)習(xí)的一些實(shí)用技巧,給學(xué)習(xí)者帶來(lái)全新的學(xué)習(xí)方式。


          公眾號(hào)的讀者朋友們購(gòu)買后可在后臺(tái)聯(lián)系我,加入讀者交流群,Crossin會(huì)為你開(kāi)啟陪讀模式,解答你在閱讀本書(shū)時(shí)的一切疑問(wèn)。


          感謝轉(zhuǎn)發(fā)點(diǎn)贊的各位~

          _往期文章推薦_

          一文搞懂Python私有屬性&私有方法




          如需了解付費(fèi)精品課程教學(xué)答疑服務(wù)
          請(qǐng)?jiān)?strong style="max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;">Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 839
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃做爱视频 | 日韩一级视频在线观看 | 免费的A级毛片 | 亚洲专区欧美专区 | 免费观看一级二级网站 |