這周老師布置了一項作業,讓我們回去將自己喜歡的小說里面的主角出場次數統計出來,我對這個充滿了興趣,但我遇到了三個問題:
(1)一開始選了一部超長的小說(最愛之一),但是運行時老是不行,老是顯示下圖錯誤:
(2)我一開始是像書本那樣直接把txt文件名打上去,類似於open(‘two.txt’,'r').read(),但總是出現一下一行字:
(3)三個字的人名總是會有幾個人只打了兩個字
一、撇開這些問題,開始寫代碼:
我剛開始以為是小說太長了,運行不了,就找了一部短一些的小說,我最愛的小說——《我和你差之微毫的世界》
結果成功了
代碼如下:
import jieba txt=open("d:\\《我和你差之微毫的世界》北傾.txt","r").read() others={'有些','自己','已經','知道','時候','剛剛','一下','看着','沒有','像是','一個','一眼','好像','什么','聲音','這樣','起來','這么','回來','就是','微微','一聲', '這個','這才','目光','看見','覺得','過來','不是','怎么','現在','突然','一會','還是','幾分','一起','頓時','回去','眼神','安然','只是','原本','出去','似乎', '眼睛','下來','整個','手指','兩個','因為','一直','電話','語氣','問道','出來','心里','開始','門口','這里','那么','房間','那個','格外','燈光','時間','回答','一般','轉身', '幾乎','事情','坐在','說話','表情'} words= jieba.lcut(txt) #jieba將txt分成多個分詞 counts={} #建立一個空字典 for word in words: #這里的word是指遍歷從txt的第一個分詞到最后一個分詞 if len(word)==1: continue elif word=="小叔" or word=='溫少遠'or word=='溫少': rword="小叔" else: rword=word counts[rword]=counts.get(rword,0)+1 for word in others: del(counts[word]) items=list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) for i in range(5): word,count=items[i] print("{0:<10}{1:>5}".format(word,count))
結果:
實在是太開心啦啦啦啦,雖然others那里耗費了很長時間,做出來還是很開心的。
二、解決問題(1)
我還是對第一篇小說百思不得其解,上網百度了后才知道,原來是我第一篇小說另存為是選擇編碼方式不是utf-8,只要改成utf-8就可以了
我改了一下代碼,換成了第一部超長小說的統計,代碼就不貼了,類似的,但不知道為什么厲爵風只出現了厲爵(有待考證???):
三、解決問題(2)
上百度搜一下,找到了一個解決方法:把命令改為txt=open(‘d:\\two.txt’,'r').read()就可以了
原因:在python中‘\’為轉義字符,要想輸出‘\’,要么多加一個"\",寫成\\,要么在字符串前加r,txt=open(r'd:\\two.txt','r').read()
四、解決問題(3)
只要在程序里添加一個jieba.add_word()就可以自定義一個新的分詞了,但該新的分詞只對該程序有效,並不是永久添加
import jieba jieba.add_word('厲爵風') txt=open("d://two.txt","r",encoding='utf-8').read() others={'有些','自己','已經','知道','時候','剛剛','一下','看着','沒有','像是','一個','一眼','好像','什么','聲音','這樣','起來','這么','回來','就是','微微','一聲','說道', '這個','這才','目光','看見','覺得','過來','不是','怎么','現在','突然','一會','還是','幾分','一起','頓時','回去','眼神','安然','只是','原本','出去','似乎', '眼睛','下來','整個','手指','兩個','因為','一直','電話','語氣','問道','出來','心里','開始','門口','這里','那么','房間','那個','格外','燈光','時間','回答','一般','轉身', '幾乎','事情','坐在','說話','表情'} words= jieba.lcut(txt) #jieba將txt分成多個分詞 counts={} #建立一個空字典 for word in words: #這里的word是指遍歷從txt的第一個分詞到最后一個分詞 if len(word)==1: continue elif word=="厲子霆" or word=='Len'or word=='LG': rword="LG" else: rword=word counts[rword]=counts.get(rword,0)+1 for word in others: del(counts[word]) items=list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) for i in range(5): word,count=items[i] print("{0:<10}{1:>5}".format(word,count))
結果如圖:
小結:問題都解決啦,超級開心的