python自然語(yǔ)言處理技術(shù)分析辰東的《完美世界》

本篇文章的靈感主要來(lái)源于網(wǎng)上各種各樣的關(guān)于自然語(yǔ)言分析的教程。曾記得我N年前讀過(guò)《完美世界》细疚。突然有種想分析其人物關(guān)系的沖動(dòng)躁垛。當(dāng)然現(xiàn)在我已經(jīng)對(duì)里面主人公忘得一干二凈,正好排除外界因素來(lái)檢測(cè)文本處理人物關(guān)系是否正確洲鸠。

??首先介紹一下本篇文章的主要內(nèi)容堂淡。第一步先統(tǒng)計(jì)小說(shuō)里面出現(xiàn)的TOP20高頻詞馋缅。第二步就繪制一個(gè)關(guān)于小說(shuō)的高頻詞詞云。第三步則繪制人物關(guān)系圖(CP圖)

第一步

??首先先說(shuō)明一點(diǎn)由于本次處理的是中文的小說(shuō)绢淀。所以要先做一些預(yù)處理不然很容易出現(xiàn)亂碼萤悴、中文不顯示等錯(cuò)誤。這個(gè)方法可以通用到中文處理的操作上皆的。

import pandas as pd
import numpy as np
import jieba
import wordcloud
from PIL import Image
import matplotlib.pyplot as plt
import seaborn as sns
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']

??最后兩行代碼可以通用哦覆履。這是對(duì)中文正常在圖中顯示的慣用方法。同時(shí)也通過(guò)上述代碼把我們需要用到的python庫(kù)導(dǎo)入费薄。
??同時(shí)處理中文還有一個(gè)比較麻煩的地方就是需要進(jìn)行分詞硝全。眾所周知中文段落處理是要進(jìn)行分詞的。因?yàn)榇蟛糠忠粋€(gè)字是沒(méi)有含義的楞抡。譬如“我不喜歡麻煩”伟众。我們需要利用分詞技術(shù)把這句話切分為“我 不 喜歡 麻煩”。等價(jià)于英文的“i dont like trouble”召廷。理解了這層含義之后我們就可以愉快地進(jìn)行分詞了凳厢。此處我采用的是jieba工具。具體代碼如下所示:

# 導(dǎo)入停用詞
stop_words=pd.read_csv('C:/Users/john/Downloads/stopwords.txt',engine='python',error_bad_lines=False,encoding='utf-8',names=['StopWords'])['StopWords'].tolist()
f=open('C:/Users/john/Desktop/完美世界.txt',encoding='utf-8').read()
# 導(dǎo)入詞庫(kù)字典
jieba.load_userdict('C:/Users/john/Downloads/完美世界.txt')
# 分詞
def cut_document(f):
    return[w for w in jieba.cut(f) if w not in stop_words and len(w)>1]
cut_doc=cut_document(f)

??上述代碼原理很簡(jiǎn)單竞慢,如果各位爺看不懂的話強(qiáng)烈建議認(rèn)真讀一下jieba的文檔(反正有中文版本先紫,而且在中文處理很常用。讀不了吃虧讀不了上當(dāng))
??接下來(lái)就是統(tǒng)計(jì)詞頻了梗顺。此處我采用的是collections庫(kù)中的Counter函數(shù)泡孩。

# 統(tǒng)計(jì)詞頻
font2 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 30,
}
from collections import Counter
def get_count(txt):
    c=Counter()
    for x in cut_doc:
        c[x]+=1
    print('小說(shuō)詞頻統(tǒng)計(jì):')
    doc_name=[]
    doc_counter=[]
    for (k,v) in c.most_common(20):
        doc_name.append(k)
        doc_counter.append(v)
    return doc_name,doc_counter
doc_name,doc_counter=get_count(cut_doc)
figure=plt.figure(figsize=(32,32))

plt.tick_params(labelsize=23)
sns.barplot(doc_name,doc_counter,palette="husl")
plt.title('TOP 20',font2)
plt.ylabel('count',font2)
sns.despine(bottom=True)
plt.show()

??可得下圖所示:


詞頻統(tǒng)計(jì).jpg

??石昊的出現(xiàn)次數(shù)超過(guò)35000。這絕逼是男主寺谤。其他之所以出現(xiàn)很多無(wú)意義的詞主要是因?yàn)槲彝S迷~沒(méi)有特別針對(duì)該部小說(shuō)仑鸥。所以才出現(xiàn)很多無(wú)意義的詞進(jìn)入TOP20了(譬如‘出手’,‘一道’变屁,‘真的’)眼俊。
??接下來(lái)就是高頻詞云了:

# 詞匯云
from scipy.misc import imread
import scipy
print(scipy.__version__)
fig=plt.figure(figsize=(16,16))
cloud=wordcloud.WordCloud(font_path='C:/Windows/Fonts/FZSTK.TTF',mask=imread('C:/Users/john/Downloads/1111.png'),mode='RGBA',background_color=None).generate(' '.join(cut_doc))
plt.imshow(cloud)
plt.axis('off')
plt.show()

??通過(guò)上述代碼可繪制出如下詞云:

高頻詞云.jpg

??漢字越大說(shuō)明該漢字在小說(shuō)中出現(xiàn)的次數(shù)越多。通過(guò)該詞云可知“石昊”和“小不點(diǎn)”出現(xiàn)次數(shù)都很多粟关。好像“石昊”外號(hào)是“小不點(diǎn)”吧疮胖。。闷板。我不太確定澎灸。
??做到這一步之后就是激動(dòng)地CP圖環(huán)節(jié)了。由于我單純的特特特想要知道男主人公有幾個(gè)媳婦遮晚。性昭。。县遣。糜颠。所以我就做了這張CP圖汹族。。該圖主要采用工具gephi繪制其兴。以及人物名TXT文檔完美世界詞條(需要自己處理)顶瞒。當(dāng)然前期需要做一些數(shù)據(jù)處理。
此處用到的工具是

cp=pd.read_csv('C:/Users/john/Downloads/人物2.txt',encoding='utf8',engine='python',names=['cp'])['cp'].tolist()
# CP圖設(shè)計(jì)
import codecs
import jieba.posseg as pseg
names={}
relationships={}
linenames=[]
jieba.load_userdict('C:/Users/john/Downloads/人物.txt')
with codecs.open('C:/Users/john/Desktop/完美世界.txt','r','utf-8') as f:
    n=0
    for line in f.readlines():
        n+=1
#         print('正在讀取第{}行'.format(n))
        poss=pseg.cut(line)
        linenames.append([])
        for w in poss:
            if w.flag!='nr' or w.word not in cp or len(w.word)<2 or len(w.word)>3:
                continue
            linenames[-1].append(w.word)
            if names.get(w.word) is None:
                names[w.word]=0
                relationships[w.word]={}
            names[w.word]+=1
for line in linenames:
    for name1 in line:
        for name2 in line:
            if name1==name2:
                continue
            if relationships[name1].get(name2) is None:
                relationships[name1][name2]=1
            else:
                relationships[name1][name2]=relationships[name1][name2]+1
node = pd.DataFrame(columns=['Id','Label','Weight'])
edge = pd.DataFrame(columns=['Source','Target','Weight'])
for name,times in names.items():
    node.loc[len(node)]=[name,name,times]
for name,edges in relationships.items():
    for v,w in edges.items():
        if w>3:
            edge.loc[len(edge)]=[name,v,w]
edge.to_csv('C:/Users/john/Downloads/edge(原).csv',index=0)
node.to_csv('C:/Users/john/Downloads/node(原).csv',index=0)

??這樣我們就成功繪制出來(lái)CP圖了元旬。效果如下:


完美世界截圖.jpg

??從CP圖里可以知道男主人公石昊和清漪以及月嬋是有一腿的榴徐。同時(shí)清漪和月嬋關(guān)系應(yīng)該比較好。(因?yàn)閮扇擞羞B線)所以這倆人應(yīng)該是主人公的正牌媳婦法绵。但是有一個(gè)叫做云曦的應(yīng)該也是和石昊有什么曖昧關(guān)系的箕速。。朋譬。。但是應(yīng)該和前兩位女子不熟或者沒(méi)有多少往來(lái)兴垦。
??求讀過(guò)該小說(shuō)的老司機(jī)可以評(píng)價(jià)一下我分析的是否正確徙赢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市探越,隨后出現(xiàn)的幾起案子狡赐,更是在濱河造成了極大的恐慌,老刑警劉巖钦幔,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枕屉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鲤氢,警方通過(guò)查閱死者的電腦和手機(jī)搀擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卷玉,“玉大人哨颂,你說(shuō)我怎么就攤上這事∠嘀郑” “怎么了威恼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寝并。 經(jīng)常有香客問(wèn)我箫措,道長(zhǎng),這世上最難降的妖魔是什么衬潦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任斤蔓,我火速辦了婚禮,結(jié)果婚禮上别渔,老公的妹妹穿的比我還像新娘附迷。我一直安慰自己惧互,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布喇伯。 她就那樣靜靜地躺著喊儡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稻据。 梳的紋絲不亂的頭發(fā)上艾猜,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音捻悯,去河邊找鬼匆赃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛今缚,可吹牛的內(nèi)容都是我干的算柳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼姓言,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞬项!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起何荚,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囱淋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后餐塘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體妥衣,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年戒傻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了税手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稠鼻,死狀恐怖冈止,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情候齿,我是刑警寧澤熙暴,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站慌盯,受9級(jí)特大地震影響周霉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亚皂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一俱箱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灭必,春花似錦狞谱、人聲如沸乃摹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)孵睬。三九已至,卻和暖如春伶跷,著一層夾襖步出監(jiān)牢的瞬間掰读,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工叭莫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹈集,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓雇初,卻偏偏與公主長(zhǎng)得像拢肆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抵皱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 原創(chuàng)作者善榛、微信公眾號(hào):滄跡懸崖 上一章: 來(lái)生再見(jiàn)吧 第九章 靈小魚(yú) - 簡(jiǎn)書(shū) “呵,還知...
    滄跡懸崖閱讀 397評(píng)論 4 3
  • String類(lèi)的特點(diǎn): 字符串對(duì)象一旦被初始化就不會(huì)被改變呻畸。"abc"存儲(chǔ)在字符串常量池中。池中沒(méi)有就建立悼院,池中有...
    吃瓜群眾liu閱讀 214評(píng)論 0 0
  • 一個(gè)眉毛蓬亂伤为,牙齒烏黑的女妖怪。據(jù)傳說(shuō)据途,她住在荒涼的古宅里绞愚,她為了預(yù)防有人來(lái)訪,會(huì)不停的化妝颖医。她還因?yàn)閯诶圻^(guò)度位衩,兩...
    畫(huà)師昊淵閱讀 1,433評(píng)論 2 7
  • 馬上要過(guò)年了佛致,有木有想過(guò)帶娃出去看看贮缕?那燜燒杯這個(gè)“移動(dòng)電飯鍋”你可千萬(wàn)不要錯(cuò)過(guò)喔! 說(shuō)起燜燒杯俺榆,用燜燒杯煮...
    5iSuSan閱讀 11,448評(píng)論 2 4
  • 我看感昼,人生就是“科目三”,為何罐脊?請(qǐng)聽(tīng)我娓娓道來(lái)定嗓。 上車(chē)準(zhǔn)備: 考試的時(shí)候你要做好各項(xiàng)準(zhǔn)備蜕琴,那你迎接生活中的各項(xiàng)挑戰(zhàn)...
    悲傷繞指渘閱讀 655評(píng)論 0 1