首页 / AG体育 / 用Python制作英超球队wordcloud(词云)

用Python制作英超球队wordcloud(词云)

英超联赛从来就是一个不缺乏话题的赛事。围绕球队的话题,层出不穷。谈到阿森纳,我们想到的是争夺第四、想到的是球员离队消息;谈到曼城双雄,便会自然联系到争冠、积分榜这些字眼。每天各大门户网站的小编,都会争抢着将实时的球队消息编辑成热点新闻。这些新闻重复提到的关键词,是我们关心的。于是,我从某浪、某易的英超版面下,利用爬虫抓取了本赛季的数百篇新闻文章,并将关键词提取出来,利用非常流行的可视化工具wordcloud词云制作出热点词图像。先放出一张效果图感受下,背景图我用的阿森纳教练温格。(图片来自温格)

爬虫抓新闻

新闻门户网站都会将新闻分类,通过标签管理,例如某浪打开这个页面,可以一页一页翻阅阿森纳新闻。这里我利用selenium模拟浏览器翻页操作,将每一篇新闻的网页链接保存下来。接下里如何抓取新闻中的文本,我是用Beautifulsoup,她可以帮我从复杂的网页结构中提取出纯文本文字的部分。并保存下来。

from pattern import web
from bs4 import BeautifulSoup

def parse(response):
    # 解析html
    dom = web.Element(response.text)
    # 提取文章标题
    article_title = str(dom.by_tag('h1.article-a__title')[0].content.encode('utf-8')).strip()
    # 提取文章发表日期
    date = str(dom.by_tag('span.article-a__time')[0].content.encode('utf-8'))
    # 提取文章标签
    tags = [str(tag.content.encode('utf-8')) for tag in dom.by_tag('section.article-a_keywords')[0].by_tag('a')]
    # 锁定文章文本
    article = dom.by_tag('div.article-a__content')[0]
    # 分段落提取文章文本内容
    article_content = ''
    for ele in article.by_tag('p'):
        article_content += ele.content
        text = str(BeautifulSoup(article_content, "html.parser").get_text().encode('utf-8')).strip()

为了方便整理数据和后续处理,我利用PyMongo将新闻存入Mongo数据库。每条记录存储一篇新闻的标题、发布日期、标签、文本内容。截图如下。

分词及提取关键词

有了几百篇跟球队相关的新闻文章,下一步需要清洗文本数据。我用jieba分词工具,这里不谈内部的算法原理,可以简单理解她将每个句子按词性分割,起到“我爱北京天安门”分割成“我/爱/北京天安门”的效果,那么句子变成了一个个独立的词,接下来就按照词为单位统计出现的频次。最后,按出现频次由高到低列出,被提到次数最多的100个词。

from jieba.analyse import extract_tags
import jieba

# 停止词
jieba.analyse.set_stop_words(stop_words_path='停止词.txt')

# 词典语料库
jieba.load_userdict(f='词典语料库.txt')

# jieba提取文本的关键词
keywords = extract_tags(text, topK=100, withWeight=True, allowPOS=())
for word, weight in keywords:
    print(word)

>> 万英镑
加盟
续约
合同
主帅
替补
希望
转会
今夏
...

足球报道中,常常提到一些术语,例如主场、客场、犯规、赛后,这些词是所有球队的新闻中共有的,换句话说我们不关心这些词,需要在“停止词.txt”中手动添加进去,jieba分词工具将屏蔽这些词。

此外,一些球员的名字我们需要手动加入到“词典语料库.txt”内,这样分词工具将不会把“拉卡泽特”理解为拉卡和泽特两个人。

利用wordcloud制作球队词云

上一步中,我们已经将数百篇球队新闻的关键词提出。(被提到次数最多的100个词)接下来绘制词云。只需要十几行代码。

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from matplotlib import pyplot as plt
import numpy as np

# 设置背景图片
background = np.array(Image.open("温格.png"))
#background = np.array(Image.open("瓜迪奥拉.png"))

wc = WordCloud(background_color="white", max_words=1000, mask=background, 
               max_font_size=500, random_state=444, font_path='SimSun.TTC')

# 生成词云, keywords是上一步中jieba提取的关键词
wc.generate_from_frequencies(dict(keywords))

# 从背景图片生成颜色值
image_colors = ImageColorGenerator(background)

# 以下代码显示图片
plt.figure(figsize=(10, 8))
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")

# 绘制词云
# recolor wordcloud and show
plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")
# 绘制背景图片为颜色的图片
plt.figure()
plt.imshow(background, cmap=plt.cm.gray)
plt.axis("off")

# 保存图片
#wc.to_file(path.join(d, "名称.png"))

下面是阿森纳的效果图。有两张。图一出现的球员名字,大多是本赛季表现活跃的。当然阿森纳和温格是最常被提到的。紧跟着是大腿桑切斯、厄齐尔。注意,字体越大,出现次数越多。

当我屏蔽了球员的名字,可以看到更多有价值的信息,也很符合阿森纳的现况,状态不好,多名当家球星身陷转会谣言中。

下面是本赛季英超的夺冠热门,曼城。我用了瓜迪奥拉当背景。本赛季表现优异的德布劳内、阿圭罗、斯特林都是大大的字号。

当我屏蔽了球员和教练姓名之后出现的词云图,可能更能给我们直观的感受,本赛季的曼城,就是大写的进球、连胜、冠军。

完。

本文来自网络,不代表AG体育立场,转载请注明出处:http://www.zzlyjnkj.com/365bet/2841/

365bet作者

上一篇
下一篇

为您推荐


返回顶部