python的语言是什么歌_用python对歌词进行语言分析
這是剛剛學python的一個小練手,最近整理整理總結下寫成文章,算是個學習的見證吧
通過python爬取了網易云音樂上汪峰最熱門的50首歌詞,并對它們進行文本分析:
第一種方法是用TF-IDF算法進行關鍵字提取,第二種方法是詞頻統計
1、數據獲取:request+json+BeautifulSoup
import requests
import json
import re
from bs4 import BeautifulSoup
import time
user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
headers = {'User-Agent': user_agent} # 定義頭信息
def download_by_music_id(music_id): #根據歌詞id下載
url = 'http://music.163.com/api/song/lyric?'+ 'id=' + str(music_id)+ '&lv=1&kv=1&tv=-1'
r = requests.get(url,headers=headers)
json_obj = r.text
j = json.loads(json_obj)
lrc = j['lrc']['lyric']
pat = re.compile(r'\[.*\]') #這里幾行代碼是把歌詞中的空格和符號之類的去掉
lrc = re.sub(pat,"",lrc)
lrc = lrc.strip()
return lrc
def write_data(content):
file_date = time.strftime('%Y-%m-%d', time.localtime(time.time())) # 當前日期,用于文件命名
fn = open('%s.txt' % file_date, 'a+') # 新建文件對象,以追加模式打開
fn.write(content) # 寫入文件
fn.close() # 關閉文件對象
def get_music_ids_by_musican_id(singer_id): #通過一個歌手id下載這個歌手的所有歌詞
singer_url = 'http://music.163.com/artist?'+ 'id='+str(singer_id)+ '&lv=1&kv=1&tv=-1'
r = requests.get(singer_url,headers=headers).text
soupObj = BeautifulSoup(r,'lxml')
song_ids = soupObj.find('textarea').text
jobj = json.loads(song_ids)
for item in jobj:
write_data(download_by_music_id(item['id']))
print(jobj.size)
get_music_ids_by_musican_id(5347) #括號內為歌手id
2、用TF-IDF提取關鍵字分析,并打印出它們所占的比重。
import jieba.analyse # 導入關鍵字提取庫
import pandas as pd # 導入pandas
# 讀取文本數據
fn = open(r'data\wflyric.txt') # 以只讀方式打開文件
string_data = fn.read() # 使用read方法讀取整段文本
fn.close() # 關閉文件對象
# 關鍵字提取
tags_pairs = jieba.analyse.extract_tags(string_data, withWeight=True, allowPOS=['ns', 'n', 'vn', 'v','a'],
withFlag=True) # 提取關鍵字標簽
tags_list = [] # 空列表用來存儲拆分后的三個值
for i in tags_pairs: # 打印標簽、分組和TF-IDF權重
tags_list.append((i[0].word, i[0].flag, i[1])) # 拆分三個字段值
tags_pd = pd.DataFrame(tags_list, columns=['word', 'flag', 'weight']) # 創建數據框
print (tags_pd) # 打印數據框
這里只摘取了top10的關鍵字
3、詞頻統計,事先準備好停詞文本,接著開始讀取文本數據,用正則表達式去掉不規范的數據,然后文本分詞,接著與停詞文本匹配,篩選出有效的文本,最后做詞云效果展示
import re # 正則表達式庫
import collections # 詞頻統計庫
import numpy as np # numpy庫
import jieba # 結巴分詞
import wordcloud # 詞云展示庫
from PIL import Image # 圖像處理庫
import matplotlib.pyplot as plt # 圖像展示庫
# 讀取文本文件
fn = open(r'data\wflyric.txt') # 以只讀方式打開文件
string_data = fn.read() # 使用read方法讀取整段文本
fn.close() # 關閉文件對象
fn2=open(r'data\stopCn.txt',encoding='utf-8') #停詞文本
remove_words=fn2.read()
fn2.close()
# 文本預處理
pattern = re.compile(u'\t|\n|\.|-|一|:|;|\)|\(|\?|"|、|\s+') # 建立正則表達式匹配模式
string_data = re.sub(pattern, '', string_data) # 將符合模式的字符串替換掉
# 文本分詞
seg_list_exact = jieba.cut(string_data, cut_all=False) # 精確模式分詞[默認模式]
object_list = [] # 建立空列表用于存儲分詞結果
for word in seg_list_exact: # 迭代讀出每個分詞對象
if word not in remove_words: # 如果不在去除詞庫中
object_list.append(word) # 分詞追加到列表
# 詞頻統計
word_counts = collections.Counter(object_list) # 對分詞做詞頻統計
word_counts_top10= word_counts.most_common(10) # 獲取前10個頻率最高的詞
for w, c in word_counts_top10: # 分別讀出每條詞和出現從次數
print(w, c) # 打印輸出
# 詞頻展示
mask = np.array(Image.open(r'data\wf.jpg')) # 定義詞頻背景
wc = wordcloud.WordCloud(
font_path='C:/Windows/Fonts/simhei.ttf', # 設置字體格式,不設置將無法顯示中文
mask=mask, # 設置背景圖
max_words=50, # 設置最大顯示的詞數
max_font_size=100 # 設置字體最大值
)
wc.generate_from_frequencies(word_counts) # 從字典生成詞云
image_colors = wordcloud.ImageColorGenerator(mask) # 從背景圖建立顏色方案
wc.recolor(color_func=image_colors) # 將詞云顏色設置為背景圖方案
plt.imshow(wc) # 顯示詞云
plt.axis('off') # 關閉坐標軸
plt.show() # 顯示圖像
詞云效果圖展示:
后續會對詞語進行進一步的情感分析
總結
以上是生活随笔為你收集整理的python的语言是什么歌_用python对歌词进行语言分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邻居房顶放空气能对着自己的门好吗?
- 下一篇: 念数字python_我是怎样利用pyth