python實現詞雲圖
阿新 • • 發佈:2020-12-05
引言
最近再參加網頁設計大賽,任務量都在網頁設計和網頁修改,以至於落了好多天學習大資料的知識。今天比賽結束,正好寫一篇網頁大賽用到的技術
正文
我們做的是一個豆瓣top250資料分析的一個網頁,其中有一項技術是用到了詞雲,今天正好把這項技術說說。
具體怎麼做的呢,首先我們先爬取了豆瓣top250 220條關於某個電影的短評,然後將短評存到資料庫,讀取資料庫,將關於該部電影的短評組成一句話,進行jieba分詞,然後再過濾掉停用詞,製作詞雲圖,最後儲存詞雲圖.
步驟
1、導包
## 包的作用 import jieba #分詞 from wordcloud import WordCloud #詞雲 from PIL import Image #圖片處理 import numpy as np #將圖片變成陣列 import collections #計數器 from matplotlib import pyplot as plt #繪圖 import sqlite3 #資料庫
2、讀取資料,並返回資料
def get_data(db_name,sql): #連線資料庫 conn = sqlite3.connect(db_name) #獲取遊標 cursor = conn.cursor() #執行sql語句 data = cursor.execute(sql) text = "" #拼接資訊 for item in data: text += item[0]+" " cursor.close() #關閉資料庫 conn.close() return text
3、進行分詞,並返回字典。(name:對應的單詞,value:單詞出現的個數)
def cut_word(text): #分詞:cut_all=False:精確模式 HMM=True:使用隱式馬爾科夫 cut = jieba.cut(text,cut_all=False,HMM=True) object_list = [] #讀取停用詞 with open("stop_word.txt", 'r', encoding='UTF-8') as meaninglessFile: stopwords = set(meaninglessFile.read().split('\n')) stopwords.add(' ') #如果單詞不在停用詞裡,則新增 for word in cut: if word not in stopwords: object_list.append(word) #collections.Counter 計數器,統計單詞個數 word_counts = collections.Counter(object_list) print(word_counts) return word_counts
4、生成詞雲圖並儲存
def get_cloud(word_counts,i):
#遮罩圖:必須是白底的
img = Image.open(r'./img/tree.jpg')
img_array = np.array(img) #將圖片變為陣列
wc = WordCloud(
background_color = 'white', # 背景顏色
mask = img_array, #遮罩圖片
font_path = 'msyh.ttc' #字型樣式
)
wc.generate_from_frequencies(word_counts) #生成詞雲圖
fig = plt.figure(1)
plt.imshow(wc) # 顯示詞雲
plt.axis('off') # 關閉儲存
#plt.show()
#調整邊框
plt.subplots_adjust(top=0.99, bottom=0.01, right=0.99, left=0.01, hspace=0, wspace=0)
#儲存圖片
plt.savefig(r'./movie_img/movie{0}.jpg'.format(i),dpi = 500)
5、總的程式碼
#-*- codeing = utf-8 -*-
#@Time : 2020/11/14 22:16
#@Author : 楊曉
#@File : testCloud.py
#@Software: PyCharm
## 包的作用
import jieba #分詞
from wordcloud import WordCloud #詞雲
from PIL import Image #圖片處理
import numpy as np #將圖片變成陣列
import collections #計數器
from matplotlib import pyplot as plt #繪圖
import sqlite3 #資料庫
# 獲取短評資訊
def get_data(db_name,sql):
#連線資料庫
conn = sqlite3.connect(db_name)
#獲取遊標
cursor = conn.cursor()
#執行sql語句
data = cursor.execute(sql)
text = ""
for item in data:
text += item[0]+" "
cursor.close()
#關閉資料庫
conn.close()
return text
def cut_word(text):
#分詞:cut_all=False:精確模式 HMM=True:使用隱式馬爾科夫
cut = jieba.cut(text,cut_all=False,HMM=True)
object_list = []
#讀取停用詞
with open("stop_word.txt", 'r', encoding='UTF-8') as meaninglessFile:
stopwords = set(meaninglessFile.read().split('\n'))
stopwords.add(' ')
#如果單詞不在停用詞裡,則新增
for word in cut:
if word not in stopwords:
object_list.append(word)
#collections.Counter 計數器,統計單詞個數
word_counts = collections.Counter(object_list)
print(word_counts)
return word_counts
def get_cloud(word_counts,i):
#遮罩圖:必須是白底的
img = Image.open(r'./img/tree.jpg')
img_array = np.array(img) #將圖片變為陣列
wc = WordCloud(
background_color = 'white', # 背景顏色
mask = img_array, #遮罩圖片
font_path = 'msyh.ttc' #字型樣式
)
wc.generate_from_frequencies(word_counts) #生成詞雲圖
fig = plt.figure(1)
plt.imshow(wc) # 顯示詞雲
plt.axis('off') # 關閉儲存
#plt.show()
#調整邊框
plt.subplots_adjust(top=0.99, bottom=0.01, right=0.99, left=0.01, hspace=0, wspace=0)
#儲存圖片
plt.savefig(r'./movie_img/movie{0}.jpg'.format(i),dpi = 500)
if __name__ == '__main__':
for i in range(1,251):
#編寫查詢語句
sql = "select info from movie"+str(i)
text = get_data('duanping',sql)
word_counts = cut_word(text)
get_cloud(word_counts,i)