python的语言是什么歌_用python对歌词进行语言分析
這是剛剛學(xué)python的一個(gè)小練手,最近整理整理總結(jié)下寫成文章,算是個(gè)學(xué)習(xí)的見證吧
通過python爬取了網(wǎng)易云音樂上汪峰最熱門的50首歌詞,并對它們進(jìn)行文本分析:
第一種方法是用TF-IDF算法進(jìn)行關(guān)鍵字提取,第二種方法是詞頻統(tǒng)計(jì)
1、數(shù)據(jù)獲取: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): #根據(jù)歌詞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())) # 當(dāng)前日期,用于文件命名
fn = open('%s.txt' % file_date, 'a+') # 新建文件對象,以追加模式打開
fn.write(content) # 寫入文件
fn.close() # 關(guān)閉文件對象
def get_music_ids_by_musican_id(singer_id): #通過一個(gè)歌手id下載這個(gè)歌手的所有歌詞
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) #括號內(nèi)為歌手id
2、用TF-IDF提取關(guān)鍵字分析,并打印出它們所占的比重。
import jieba.analyse # 導(dǎo)入關(guān)鍵字提取庫
import pandas as pd # 導(dǎo)入pandas
# 讀取文本數(shù)據(jù)
fn = open(r'data\wflyric.txt') # 以只讀方式打開文件
string_data = fn.read() # 使用read方法讀取整段文本
fn.close() # 關(guān)閉文件對象
# 關(guān)鍵字提取
tags_pairs = jieba.analyse.extract_tags(string_data, withWeight=True, allowPOS=['ns', 'n', 'vn', 'v','a'],
withFlag=True) # 提取關(guān)鍵字標(biāo)簽
tags_list = [] # 空列表用來存儲(chǔ)拆分后的三個(gè)值
for i in tags_pairs: # 打印標(biāo)簽、分組和TF-IDF權(quán)重
tags_list.append((i[0].word, i[0].flag, i[1])) # 拆分三個(gè)字段值
tags_pd = pd.DataFrame(tags_list, columns=['word', 'flag', 'weight']) # 創(chuàng)建數(shù)據(jù)框
print (tags_pd) # 打印數(shù)據(jù)框
這里只摘取了top10的關(guān)鍵字
3、詞頻統(tǒng)計(jì),事先準(zhǔn)備好停詞文本,接著開始讀取文本數(shù)據(jù),用正則表達(dá)式去掉不規(guī)范的數(shù)據(jù),然后文本分詞,接著與停詞文本匹配,篩選出有效的文本,最后做詞云效果展示
import re # 正則表達(dá)式庫
import collections # 詞頻統(tǒng)計(jì)庫
import numpy as np # numpy庫
import jieba # 結(jié)巴分詞
import wordcloud # 詞云展示庫
from PIL import Image # 圖像處理庫
import matplotlib.pyplot as plt # 圖像展示庫
# 讀取文本文件
fn = open(r'data\wflyric.txt') # 以只讀方式打開文件
string_data = fn.read() # 使用read方法讀取整段文本
fn.close() # 關(guān)閉文件對象
fn2=open(r'data\stopCn.txt',encoding='utf-8') #停詞文本
remove_words=fn2.read()
fn2.close()
# 文本預(yù)處理
pattern = re.compile(u'\t|\n|\.|-|一|:|;|\)|\(|\?|"|、|\s+') # 建立正則表達(dá)式匹配模式
string_data = re.sub(pattern, '', string_data) # 將符合模式的字符串替換掉
# 文本分詞
seg_list_exact = jieba.cut(string_data, cut_all=False) # 精確模式分詞[默認(rèn)模式]
object_list = [] # 建立空列表用于存儲(chǔ)分詞結(jié)果
for word in seg_list_exact: # 迭代讀出每個(gè)分詞對象
if word not in remove_words: # 如果不在去除詞庫中
object_list.append(word) # 分詞追加到列表
# 詞頻統(tǒng)計(jì)
word_counts = collections.Counter(object_list) # 對分詞做詞頻統(tǒng)計(jì)
word_counts_top10= word_counts.most_common(10) # 獲取前10個(gè)頻率最高的詞
for w, c in word_counts_top10: # 分別讀出每條詞和出現(xiàn)從次數(shù)
print(w, c) # 打印輸出
# 詞頻展示
mask = np.array(Image.open(r'data\wf.jpg')) # 定義詞頻背景
wc = wordcloud.WordCloud(
font_path='C:/Windows/Fonts/simhei.ttf', # 設(shè)置字體格式,不設(shè)置將無法顯示中文
mask=mask, # 設(shè)置背景圖
max_words=50, # 設(shè)置最大顯示的詞數(shù)
max_font_size=100 # 設(shè)置字體最大值
)
wc.generate_from_frequencies(word_counts) # 從字典生成詞云
image_colors = wordcloud.ImageColorGenerator(mask) # 從背景圖建立顏色方案
wc.recolor(color_func=image_colors) # 將詞云顏色設(shè)置為背景圖方案
plt.imshow(wc) # 顯示詞云
plt.axis('off') # 關(guān)閉坐標(biāo)軸
plt.show() # 顯示圖像
詞云效果圖展示:
后續(xù)會(huì)對詞語進(jìn)行進(jìn)一步的情感分析
總結(jié)
以上是生活随笔為你收集整理的python的语言是什么歌_用python对歌词进行语言分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邻居房顶放空气能对着自己的门好吗?
- 下一篇: 念数字python_我是怎样利用pyth