作者:whatbeg
原文:http://whatbeg.com/2016/04/26/xuweilrc.html
全文约 11075 字,读完可能需要 17 分钟。
关键词
结巴分词 中文分词 TF-IDF 词频 逆文档频率
前言
自从第一次听到许巍的歌,就深深地迷上了他的歌,感觉每一首都钻到了我的心里,也早已把他的歌听得烂熟了。许巍,我最喜欢的歌手,没有之一!
本文我要解决以下问题:
爬取许巍每首歌的歌词,统计他最喜欢用哪些词(即歌词的关键词)
很简单地想到就是直接统计每个词出现的次数(词频TF,词出现的频率,下文同),这样确实可以得到大部分的信息。但是也有两点不好:
1.有很多诸如"的","一个","没有"等无实意的助词等可能会得到很高的词频,这些词叫做"停用词",当然我们可以把它们去掉,像我的代码里就去掉了长度小于2的词,两个词及以上就不能再去了,但是还是会有一些残留。
2.如果出现次数一样呢?当然如果只是为了看下每个词出现的情况,大概了解一下,其实统计下词频就够了,但是为了充分利用数据(好不容易爬来的。。),并得到更多的信息,不妨再多做一步吧。
考虑词频相同的两个词A和B,都出现n次,如果A只在一篇文章出现,出现n次,而B在n篇文章中出现,每篇都出现1次,那么我们认为B这个词很常见,大家都有,所以并不重要,也不能够很好地区分文档;而词A要出现只出现在一篇文章,出现地点比较少,大家不常见到,且能够很好地区分出那篇文档,那么认为它更加重要。自然想到重要性的体现用某个单词在多少篇文档中出现的次数来衡量(sfd),这就是IDF(逆文档频率Inverse Document Frequency)。
上面两个指标TF和IDF乘起来就得到了著名的TF-IDF算法fd的核心。
下面是计算方法:
由于每首歌的长短不同,所以我们将词频归一化,即某个词的词频记为该词在每篇文章中的次数除以该篇文章的总词数的累加和。
![](http://mmbiz.qpic.cn/mmbiz_png/HZW0wwFxbQBJNMhxX7Hy7ANFnPPIt9LZh7hQoicBHJhY8OC1iabERJlEdDB2NCykng80MyaFic9E6TicHOpSIxqeMg/0?wx_fmt=png)
而IDF记为文档总数除以出现该词的文档数,显然,出现某个词的文档数越多,分母越大,则IDF越小,比重越小。
![](http://mmbiz.qpic.cn/mmbiz_png/HZW0wwFxbQBJNMhxX7Hy7ANFnPPIt9LZsS9GvtMbBahT0h90XUfhCIZRktDwPVfbia43Qdhqfd1RPNOkicn72rfw/0?wx_fmt=png)
获取数据
获取数据细节不说了,就是查看网页源代码,然后制定爬取策略,我没有用框架,但是代码量也不大。
这里还是贴下实现的代码:
import requests
import re
import urllib
from bs4 import BeautifulSoup
import codecs
def getPostdata(artistId=1158):
s = requests.Session()
postData = {'type': 'artSong',
'artistId': artistId
}
return s,postData
def PrintLis(lis):
for j in range(len(lis)):