學習Python的第三天

實現詞云的繪制

步驟:

1.繪制詞云的形狀

from wordcloud import WordCloud
import jieba
import imageio

mask = imageio.imread('./china.jpg')    #要繪制詞云的形狀

2.讀取小說內容

with open('./novel/threekingdom.txt', 'r', encoding='utf-8') as f:
    words = f.read()

    counts = {}  # {‘曹操’:234,‘回寨’:56}
    excludes = {"將軍", "卻說", "丞相", "二人", "不可", "荊州", "不能", "如此", "商議",
                "如何", "主公", "軍士", "軍馬", "左右", "次日", "引兵", "大喜", "天下",
                "東吳", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人馬", "不知",
                "孔明曰","玄德曰","劉備","云長"}

3.分詞

    words_list = jieba.lcut(words)
    # print(words_list)
    for word in words_list:
        if len(word) <= 1:
            continue
        else:
            # 更新字典中的值
            # counts[word] = 取出字典中原來鍵對應的值 + 1
            # counts[word] = counts[word] + 1  # counts[word]如果沒有就要報錯
            # 字典。get(k) 如果字典中沒有這個鍵 返回 NONE
            counts[word] = counts.get(word, 0) + 1

4.詞語過濾,刪除無關詞,重復詞

    counts['孔明'] =  counts['孔明'] +  counts['孔明曰']
    counts['玄德'] = counts['玄德'] + counts['玄德曰'] +counts['劉備']
    counts['關公'] = counts['關公'] +counts['云長']
    for word in excludes:
        del counts[word]

5.排序

    items = list(counts.items())
    print(items)

    def sort_by_count(x):
        return x[1]
    items.sort(key=sort_by_count, reverse=True)

6.序列解包

    li=[]
    for i in range(10):
        # 序列解包
        role, count = items[i]
        print(role, count)
        for _ in range(count):      #_是告訴看代碼的人循環里不需要使用臨時變量
            li.append(role)

7.結論

text=' '.join(li)
    WordCloud(
        font_path='msyh.ttc',
        background_color='white',
        width=800,
        height=600,
        mask=mask,
        #相鄰兩個值的重復
        collocations=False
    ).generate(text).to_file('Top10.png')

匿名函數

匿名函數:lambda函數是一種快速定義單行的最小函數,可以用在任何需要用到函數的地方。
匿名函數返回值是一個函數對象,可以使用變量去接收這個對象。例如 x = lambda x,y:x*y ,代表x是一個計算兩數想成的函數,調用時可以寫成x(3,5)

匿名函數的優點:

-使代碼精簡
-有些只使用一次的函數,不用為其命名
-讓代碼更容易理解

格式:

lambda 參數:返回值

例子

sum=lambda x1,x2:x1+x2
print(sum (2,3))

參數可以有無數個,但是表達式只能有一個
下例函數改為為匿名函數

name_info_list = [
    ('張三',4500),
    ('李四',9900),
    ('王五',2000),
    ('趙六',5500),
]
def sort_by_gz(x):
     return x[1]
name_info_list.sort(key = sort_by_gz)
print('排序后', name_info_list)

修改之后

name_info_list = [
    ('張三',4500),
    ('李四',9900),
    ('王五',2000),
    ('趙六',5500),
]
name_info_list.sort(key=lambda x:x[1],reverse=True)
print(name_info_list)

lambda匿名函數是python語言的一種特色,當我們不需要定義一個函數的時候,可以使用匿名函數來做。

匿名函數的限制:

就是只能有一個表達式,不用寫return,返回值就是該表達式的結果。

匿名函數的好處:

即函數沒有名字,不用擔心函數名沖突,此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數。

列表推導式,列表解析和字典解析

推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的數據序列的結構體。

1.列表推導式

之前我們創建列表是利用for循環

li=[]
for i in range(10):
    li.append(i)
print(li)

列表推導式,也叫列表解析式,英文名稱為list comprehension,可以使用非常簡潔的方式來快速生成滿足特定需求的列表,代碼具有非常強的可讀性。另外,Python的內部實現對列表推導式做了大量優化,可以保證很快的運行速度。

格式:[表達式 for 臨時變量 in 可迭代對象 可以追加條件]

使用列表推導式

print([i for i in range(10)])

利用列表推導式只用一條語句就可以創建列表了。

列表解析

篩選出列表中所以的偶數

li=[]
for i in range(10):
    if i % 2 ==0:
        li.append(i)
print(li)
使用列表解析
print([i for i in range(10) if i%2==0])

篩選出列表中大于0的數(隨機產生10個數)

from  random import  randint
num_list=[randint(-10,10) for _ in range(10)]
print(num_list)
print([i for i in num_list if i>0])
字典解析

生成100給學生的成績

stu_grades={'student{}'.format(i):randint(50,100) for i in range (1,101)}
print(stu_grades)

篩選大于60分的所以學生

print({k:v for k,v in stu_grades.items() if v>60})

matplotlib庫

1.曲線圖

from matplotlib import pyplot as plt

用100個點繪制正弦曲線圖[0,2pi]

import numpy as np

plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


x=np.linspace(0,2*np.pi,num=100)
print(x)
y=np.sin(x)
plt.plot(x,y,color='g',linestyle='--',label='sin(x)')

cosy=np.cos(x)

plt.plot(x,cosy, color='r',label='cos(x)')
plt.xlabel('時間(s)')
plt.ylabel('電壓(v)')
plt.title('歡迎來到python世界')

plt.legend()
plt.show()

2.柱狀圖

import string
from random import randint
# print(string.ascii_uppercase[0:6])
# ['A', 'B', 'C'...]
x = ['口紅{}'.format(x) for x in string.ascii_uppercase[0:5]]

y = [randint(200, 500) for _ in range(5)]
print(x)
print(y)
plt.xlabel('口紅品牌')
plt.ylabel('價格(元)')
plt.bar(x, y)
plt.show()

3.餅圖

隨機產生6個員工的工資范圍在(3500, 9000),并畫出餅圖

from random import randint
import string
counts = [randint(3500, 9000) for _ in range(6)]
labels = ['員工{}'.format(x) for x in string.ascii_lowercase[:6] ]
# 距離圓心點距離
explode = [0.1,0,0, 0, 0,0]
colors = ['red', 'purple','blue', 'yellow','gray','green']
plt.pie(counts,explode = explode,shadow=True, labels=labels, autopct = '%1.1f%%',colors=colors)
plt.legend(loc=2)
plt.axis('equal')
plt.show()

4.散點圖

均值為0,標準差為1的正太分布數據

x=np.random.normal(0,1,100)
y=np.random.normal(0,1,100)
plt.scatter(x,y,alpha=0.5)
plt.show()
x=np.random.normal(0,1,100000)
y=np.random.normal(0,1,100000)
plt.scatter(x,y,alpha=0.1)
plt.show()

將之前做好的三國top10人物以餅圖的方式展示

    li=[]
    peo_li=[]
    for i in range(10):
        # 序列解包
        role, count = items[i]
        a={'name':'','count':0}
        a['name']=role
        a['count']=count
        peo_li.append(a)
        print(role, count)
        for _ in range(count):      #_是告訴看代碼的人循環里不需要使用臨時變量
            li.append(role)
#在解包的同時將前十的人物即出現次數存放當peo_list列表中
    counts = []
    labels = []
    for i in range(len(peo_li)):
        counts.append(peo_li[i]['count'])
        labels.append(peo_li[i]['name'])
    # 距離圓心點距離
    explode = [0.1, 0, 0, 0, 0, 0,0,0,0,0]
    #colors = ['red', 'purple', 'blue', 'yellow', 'gray', 'green']
    plt.pie(counts, explode=explode, shadow=True, labels=labels, autopct = '%1.1f%%')
    plt.legend(loc=2)
    plt.axis('equal')
    plt.show()

完整代碼:

from wordcloud import WordCloud
import jieba
import imageio

mask = imageio.imread('./china.jpg')
1.讀取小說內容
with open('./novel/threekingdom.txt', 'r', encoding='utf-8') as f:
    words = f.read()

    counts = {}  # {‘曹操’:234,‘回寨’:56}
    excludes = {"將軍", "卻說", "丞相", "二人", "不可", "荊州", "不能", "如此", "商議",
                "如何", "主公", "軍士", "軍馬", "左右", "次日", "引兵", "大喜", "天下",
                "東吳", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人馬", "不知",
                "孔明曰","玄德曰","劉備","云長"}
2. 分詞
    words_list = jieba.lcut(words)
    # print(words_list)
    for word in words_list:
        if len(word) <= 1:
            continue
        else:
            # 更新字典中的值
            # counts[word] = 取出字典中原來鍵對應的值 + 1
            # counts[word] = counts[word] + 1  # counts[word]如果沒有就要報錯
            # 字典。get(k) 如果字典中沒有這個鍵 返回 NONE
            counts[word] = counts.get(word, 0) + 1

    print(len(counts))
3. 詞語過濾,刪除無關詞,重復詞
    counts['孔明'] =  counts['孔明'] +  counts['孔明曰']
    counts['玄德'] = counts['玄德'] + counts['玄德曰'] +counts['劉備']
    counts['關公'] = counts['關公'] +counts['云長']
    for word in excludes:
        del counts[word]
4.排序 [(), ()]
    items = list(counts.items())
    print(items)

    # def sort_by_count(x):
    #     return x[1]
    # items.sort(key=sort_by_count, reverse=True)
    items.sort(key=lambda i: i[1], reverse=True)
    li=[]
    peo_li=[]
    for i in range(10):
        # 序列解包
        role, count = items[i]
        a={'name':'','count':0}
        a['name']=role
        a['count']=count
        peo_li.append(a)
        print(role, count)
        for _ in range(count):      #_是告訴看代碼的人循環里不需要使用臨時變量
            li.append(role)
5.得出結論
    text=' '.join(li)
    WordCloud(
        font_path='msyh.ttc',
        background_color='white',
        width=800,
        height=600,
        mask=mask,
        #相鄰兩個值的重復
        collocations=False
    ).generate(text).to_file('Top10.png')

    #用餅圖顯示人物
    from random import randint
    import string
    from matplotlib import pyplot as plt

    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    counts = []
    labels = []
    for i in range(len(peo_li)):
        counts.append(peo_li[i]['count'])
        labels.append(peo_li[i]['name'])
    # 距離圓心點距離
    explode = [0.1, 0, 0, 0, 0, 0,0,0,0,0]
    #colors = ['red', 'purple', 'blue', 'yellow', 'gray', 'green']
    plt.pie(counts, explode=explode, shadow=True, labels=labels, autopct = '%1.1f%%')
    plt.legend(loc=2)
    plt.axis('equal')
    plt.show()

練習:將紅樓夢的top10人物繪制餅圖

完整代碼

from wordcloud import WordCloud
import jieba
import imageio

mask = imageio.imread('./china.jpg')
1.讀取小說內容
with open('./novel/all.txt', 'r', encoding='utf-8') as f:
    words = f.read()
    #print(words)
    counts = {}
    excludes = {"什么", "一個", "我們", "你們", "如今", "說道", "知道", "起來", "這里",
               "出來", "眾人", "那里", "自己", "一面", "只見", "太太", "兩個", "沒有",
               "怎么", "不是", "不知", "這個", "聽見", "這樣", "進來", "咱們", "就是",
               "老太太", "東西", "告訴", "回來", "只是", "大家", "姑娘", "奶奶", "鳳姐兒","分節"}
2. 分詞
    words_list = jieba.lcut(words)
    for word in words_list:
        if len(word) <= 1:
            continue
        else:
            # 更新字典中的值
            # counts[word] = 取出字典中原來鍵對應的值 + 1
            # counts[word] = counts[word] + 1  # counts[word]如果沒有就要報錯
            # 字典。get(k) 如果字典中沒有這個鍵 返回 NONE
            counts[word] = counts.get(word, 0) + 1

    print(len(counts))
3. 詞語過濾,刪除無關詞,重復詞
    counts['賈母'] =  counts['賈母'] +  counts['老太太']
    counts['寶釵'] = counts['寶釵'] + counts['薛寶釵']
    counts['鳳姐'] = counts['鳳姐兒'] + counts['王熙鳳'] +counts['鳳姐']
    counts['寶玉'] = counts['賈寶玉'] +counts['寶玉']
    counts['王夫人'] = counts['王夫人'] + counts['太太']
    counts['黛玉'] = counts['黛玉'] + counts['林黛玉']
    counts['賈政']=counts['賈政']+counts['老爺']
    for word in excludes:
        del counts[word]
4.排序 [(), ()]
    items = list(counts.items())
    #print(items)
   items.sort(key=lambda i: i[1], reverse=True)
    li=[]
    peo_li=[]
    for i in range(10):
        # 序列解包
        role, count = items[i]
        a={'name':'','count':0}
        a['name']=role
        a['count']=count
        peo_li.append(a)
        print(role, count)
        for _ in range(count):      #_是告訴看代碼的人循環里不需要使用臨時變量
            li.append(role)
5.得出結論
    text=' '.join(li)
    WordCloud(
        font_path='msyh.ttc',
        background_color='white',
        width=800,
        height=600,
        mask=mask,
        #相鄰兩個值的重復
        collocations=False
    ).generate(text).to_file('紅樓Top10.png')

    #用餅圖顯示人物
    from random import randint
    import string
    from matplotlib import pyplot as plt

    plt.rcParams["font.sans-serif"] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    counts = []
    labels = []
    for i in range(len(peo_li)):
        counts.append(peo_li[i]['count'])
        labels.append(peo_li[i]['name'])
    # 距離圓心點距離
    explode = [0.1, 0, 0, 0, 0, 0,0,0,0,0]
    #colors = ['red', 'purple', 'blue', 'yellow', 'gray', 'green']
    plt.pie(counts, explode=explode, shadow=True, labels=labels, autopct = '%1.1f%%')
    plt.legend(loc=2)
    plt.axis('equal')
    plt.show()
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容