精华内容
下载资源
问答
  • 关于Python版本的词云wordcloud模块的简单应用和源码分析

    Python版本的词云生成模块从2015年的v1.0到现在,已经更新到了v1.7。

    下载请移步至:https://pypi.org/project/wordcloud/

    wordcloud简单应用:

    import jieba
    import wordcloud
    
    w = wordcloud.WordCloud(
        width=600,
        height=600,
        background_color='white',
        font_path='msyh.ttc'
    )
    text = '看到此标题,我也是感慨万千 首先弄清楚搞IT和被IT搞,谁是搞IT的?马云就是,马化腾也是,刘强东也是,他们都是叫搞IT的, 但程序员只是被IT搞的人,可以比作盖楼砌砖的泥瓦匠,你想想,四十岁的泥瓦匠能跟二十左右岁的年轻人较劲吗?如果你是老板你会怎么做?程序员只是技术含量高的泥瓦匠,社会是现实的,社会的现实是什么?利益驱动。当你跑的速度不比以前快了时,你就会被挨鞭子赶,这种窘境如果在做程序员当初就预料到的话,你就会知道,到达一定高度时,你需要改变行程。 程序员其实真的不是什么好职业,技术每天都在更新,要不停的学,你以前学的每天都在被淘汰,加班可能是标配了吧。 热点,你知道什么是热点吗?社会上啥热就是热点,我举几个例子:在早淘宝之初,很多人都觉得做淘宝能让自己发展,当初的规则是产品按时间轮候展示,也就是你的商品上架时间一到就会被展示,不论你星级多高。这种一律平等的条件固然好,但淘宝随后调整了显示规则,对产品和店铺,销量进行了加权,一下导致小卖家被弄到了很深的胡同里,没人看到自己的产品,如何卖?做广告费用也非常高,入不敷出,想必做过淘宝的都知道,再后来淘宝弄天猫,显然,天猫是上档次的商城,不同于淘宝的摆地摊,因为摊位费涨价还闹过事,闹也白闹,你有能力就弄,没能力就淘汰掉。前几天淘宝又推出C2M,客户反向定制,客户直接挂钩大厂家,没你小卖家什么事。 后来又出现了微商,在微商出现当天我就知道这东西不行,它比淘宝假货还下三滥.我对TX一直有点偏见,因为骗子都使用QQ 我说这么多只想说一个事,世界是变化的,你只能适应变化,否则就会被淘汰。 还是回到热点这个话题,育儿嫂这个职位有很多人了解吗?前几年放开二胎后,这个职位迅速串红,我的一个亲戚初中毕业,现在已经月入一万五,职务就是照看刚出生的婴儿28天,节假日要双薪。 你说这难到让我一个男的去当育儿嫂吗?扯,我只是说热点问题。你没踩在热点上,你赚钱就会很费劲 这两年的热点是什么?短视频,你可以看到抖音的一些作品根本就不是普通人能实现的,说明专业级人才都开始努力往这上使劲了。 我只会编程,别的不会怎么办?那你就去编程。没人用了怎么办?你看看你自己能不能雇佣你自己 学会适应社会,学会改变自己去适应社会 最后说一句:科大讯飞的刘鹏说的是对的。那我为什么还做程序员?他可以完成一些原始积累,只此而已。'
    new_str = ' '.join(jieba.lcut(text))
    w.generate(new_str)
    w.to_file('x.png')
    

     下面分析源码:

    wordcloud源码中生成词云图的主要步骤有:

    1、分割词组

    2、生成词云

    3、保存图片

    我们从 generate(self, text)切入,发现它仅仅调用了自身对象的一个方法 self.generate_from_text(text)

        def generate_from_text(self, text):
            """Generate wordcloud from text.
            """
            words = self.process_text(text) # 分割词组
            self.generate_from_frequencies(words) # 生成词云的主要方法(重点分析)
            return self

    process_text()源码如下,处理的逻辑比较简单:分割词组、去除数字、去除's、去除数字、去除短词、去除禁用词等。

        def process_text(self, text):
            """Splits a long text into words, eliminates the stopwords.
    
            Parameters
            ----------
            text : string
                The text to be processed.
    
            Returns
            -------
            words : dict (string, int)
                Word tokens with associated frequency.
    
            ..versionchanged:: 1.2.2
                Changed return type from list of tuples to dict.
    
            Notes
            -----
            There are better ways to do word tokenization, but I don't want to
            include all those things.
            """
    
            flags = (re.UNICODE if sys.version < '3' and type(text) is unicode else 0) 
                    
            regexp = self.regexp if self.regexp is not None else r"\w[\w']+"
    
            # 获得分词
            words = re.findall(regexp, text, flags)
            # 去除 's
            words = [word[:-2] if word.lower().endswith("'s") else word for word in words]
            # 去除数字
            if not self.include_numbers:
                words = [word for word in words if not word.isdigit()]
            # 去除短词,长度小于指定值min_word_length的词,被视为短词,筛除
            if self.min_word_length:
                words = [word for word in words if len(word) >= self.min_word_length]
            # 去除禁用词
            stopwords = set([i.lower() for i in self.stopwords])
            if self.collocations:
                word_counts = unigrams_and_bigrams(words, stopwords, self.normalize_plurals, self.collocation_threshold)
            else:
                # remove stopwords
                words = [word for word in words if word.lower() not in stopwords]
                word_counts, _ = process_tokens(words, self.normalize_plurals)
    
            return word_counts

    重头戏来了

    generate_from_frequencies(self, frequencies, max_font_size=None) 方法体内的代码比较多,总体上分为以下几步:

    1、排序

    2、词频归一化

    3、创建绘图对象

    4、确定初始字体大小(字号)

    5、扩展单词集

    6、确定每个单词的字体大小、位置、旋转角度、颜色等信息

    源码如下(根据个人理解已添加中文注释):

        def generate_from_frequencies(self, frequencies, max_font_size=None):
            """Create a word_cloud from words and frequencies.
    
            Parameters
            ----------
            frequencies : dict from string to float
                A contains words and associated frequency.
    
            max_font_size : int
                Use this font-size instead of self.max_font_size
    
            Returns
            -------
            self
    
            """
            # make sure frequencies are sorted and normalized
            # 1、排序
            # 对“单词-频率”列表按频率降序排序
            frequencies = sorted(frequencies.items(), key=itemgetter(1), reverse=True)
            if len(frequencies) <= 0:
                raise ValueError("We need at least 1 word to plot a word cloud, "
                                 "got %d." % len(frequencies))
            # 确保单词数在设置的最大范围内,超出的部分被舍弃掉
            frequencies = frequencies[:self.max_words]
    
            # largest entry will be 1
            # 取第一个单词的频率作为最大词频
            max_frequency = float(frequencies[0][1])
    
            # 2、词频归一化
            # 把所有单词的词频归一化,由于单词已经排序,所以归一化后应该是这样的:[('xxx', 1),('xxx', 0.96),('xxx', 0.87),...]
            frequencies = [(word, freq / max_frequency)
                           for word, freq in frequencies]
    
            # 随机对象,用于产生一个随机数,来确定是否旋转90度
            if self.random_state is not None:
                random_state = self.random_state
            else:
                random_state = Random()
    
            if self.mask is not None:
                boolean_mask = self._get_bolean_mask(self.mask)
                width = self.mask.shape[1]
                height = self.mask.shape[0]
            else:
                boolean_mask = None
                height, width = self.height, self.width
            # 用于查找单词可能放置的位置,例如图片有效范围内的空白处(非文字区域)
            occupancy = IntegralOccupancyMap(height, width, boolean_mask)
    
            # 3、创建绘图对象
            # create image
            img_grey = Image.new("L", (width, height))
            draw = ImageDraw.Draw(img_grey)
            img_array = np.asarray(img_grey)
            font_sizes, positions, orientations, colors = [], [], [], []
    
            last_freq = 1.
    
            # 4、确定初始字号
            # 确定最大字号
            if max_font_size is None:
                # if not provided use default font_size
                max_font_size = self.max_font_size
    
            # 如果最大字号是空的,就需要确定一个最大字号作为初始字号
            if max_font_size is None:
                # figure out a good font size by trying to draw with
                # just the first two words
                if len(frequencies) == 1:
                    # we only have one word. We make it big!
                    font_size = self.height
                else:
                    # 递归进入当前函数,以获得一个self.layout_,其中只有前两个单词的词频信息
                    # 使用这两个词频计算出一个初始字号
                    self.generate_from_frequencies(dict(frequencies[:2]),
                                                   max_font_size=self.height)
                    # find font sizes
                    sizes = [x[1] for x in self.layout_]
                    try:
                        font_size = int(2 * sizes[0] * sizes[1]
                                        / (sizes[0] + sizes[1]))
                    # quick fix for if self.layout_ contains less than 2 values
                    # on very small images it can be empty
                    except IndexError:
                        try:
                            font_size = sizes[0]
                        except IndexError:
                            raise ValueError(
                                "Couldn't find space to draw. Either the Canvas size"
                                " is too small or too much of the image is masked "
                                "out.")
            else:
                font_size = max_font_size
    
            # we set self.words_ here because we called generate_from_frequencies
            # above... hurray for good design?
            self.words_ = dict(frequencies)
    
            # 5、扩展单词集
            # 如果单词数不足最大值,则扩展单词集以达到最大值
            if self.repeat and len(frequencies) < self.max_words:
                # pad frequencies with repeating words.
                times_extend = int(np.ceil(self.max_words / len(frequencies))) - 1
                # get smallest frequency
                frequencies_org = list(frequencies)
                downweight = frequencies[-1][1]
                # 扩展单词数,词频会保持原有词频的递减规则。
                for i in range(times_extend):
                    frequencies.extend([(word, freq * downweight ** (i + 1))
                                        for word, freq in frequencies_org])
    
            # 6、确定每一个单词的字体大小、位置、旋转角度、颜色等信息
            # start drawing grey image
            for word, freq in frequencies:
                if freq == 0:
                    continue
                # select the font size
                rs = self.relative_scaling
                if rs != 0:
                    font_size = int(round((rs * (freq / float(last_freq))
                                           + (1 - rs)) * font_size))
                if random_state.random() < self.prefer_horizontal:
                    orientation = None
                else:
                    orientation = Image.ROTATE_90
                tried_other_orientation = False
                # 寻找可能放置的位置,如果寻找一次,没有找到,则尝试改变文字方向或缩小字体大小,继续寻找。
                # 直到找到放置位置或者字体大小超出字号下限
                while True:
                    # try to find a position
                    font = ImageFont.truetype(self.font_path, font_size)
                    # transpose font optionally
                    transposed_font = ImageFont.TransposedFont(
                        font, orientation=orientation)
                    # get size of resulting text
                    box_size = draw.textsize(word, font=transposed_font)
                    # find possible places using integral image:
                    result = occupancy.sample_position(box_size[1] + self.margin,
                                                       box_size[0] + self.margin,
                                                       random_state)
                    if result is not None or font_size < self.min_font_size:
                        # either we found a place or font-size went too small
                        break
                    # if we didn't find a place, make font smaller
                    # but first try to rotate!
                    if not tried_other_orientation and self.prefer_horizontal < 1:
                        orientation = (Image.ROTATE_90 if orientation is None else
                                       Image.ROTATE_90)
                        tried_other_orientation = True
                    else:
                        font_size -= self.font_step
                        orientation = None
    
                if font_size < self.min_font_size:
                    # we were unable to draw any more
                    break
    
                # 收集该词的信息:字体大小、位置、旋转角度、颜色
                x, y = np.array(result) + self.margin // 2
                # actually draw the text
                # 此处绘制图像仅仅用于寻找放置单词的位置,而不是最终的词云图片。词云图片是在另一个函数中生成:to_image
                draw.text((y, x), word, fill="white", font=transposed_font)
                positions.append((x, y))
                orientations.append(orientation)
                font_sizes.append(font_size)
                colors.append(self.color_func(word, font_size=font_size,
                                              position=(x, y),
                                              orientation=orientation,
                                              random_state=random_state,
                                              font_path=self.font_path))
                # recompute integral image
                if self.mask is None:
                    img_array = np.asarray(img_grey)
                else:
                    img_array = np.asarray(img_grey) + boolean_mask
                # recompute bottom right
                # the order of the cumsum's is important for speed ?!
                occupancy.update(img_array, x, y)
                last_freq = freq
    
            # layout_是单词信息列表,表中每项信息:单词、频率、字体大小、位置、旋转角度、颜色等信息。为后续步骤的绘图工作做好准备。
            self.layout_ = list(zip(frequencies, font_sizes, positions,
                                    orientations, colors))
            return self

    注意

    在第6步确定位置时,程序使用循环和随机数来查找合适的放置位置,源码如下。

                # 寻找可能放置的位置,如果寻找一次,没有找到,则尝试改变文字方向或缩小字体大小,继续寻找。
                # 直到找到放置位置或者字体大小超出字号下限
                while True:
                    # try to find a position
                    font = ImageFont.truetype(self.font_path, font_size)
                    # transpose font optionally
                    transposed_font = ImageFont.TransposedFont(
                        font, orientation=orientation)
                    # get size of resulting text
                    box_size = draw.textsize(word, font=transposed_font)
                    # find possible places using integral image:
                    result = occupancy.sample_position(box_size[1] + self.margin,
                                                       box_size[0] + self.margin,
                                                       random_state)
                    if result is not None or font_size < self.min_font_size:
                        # either we found a place or font-size went too small
                        break
                    # if we didn't find a place, make font smaller
                    # but first try to rotate!
                    if not tried_other_orientation and self.prefer_horizontal < 1:
                        orientation = (Image.ROTATE_90 if orientation is None else
                                       Image.ROTATE_90)
                        tried_other_orientation = True
                    else:
                        font_size -= self.font_step
                        orientation = None

    其中 occupancy.sample_position() 是具体寻找合适位置的方法。当你试图进一步了解其中的奥秘时,却发现你的【Ctrl+左键】已经无法跳转到深层代码了,悲哀的事情还是发生了......o(╥﹏╥)o

    在wordcloud.py文件的顶部有这么一行: from .query_integral_image import query_integral_image query_integral_image 是一个pyd文件,该文件无法直接查看。有关pyd格式的更多资料,请自行查阅。

    再回到 generate_from_frequencies 上来,方法的最后把数据整理到了 self.layout_ 变量里,这里面就是所有词组绘制时所需要的信息了。然后就可以调用to_file()方法,保存图片了。

        def to_file(self, filename):
    
            img = self.to_image()
            img.save(filename, optimize=True)
            return self

    核心方法 to_image() 就会把self.layout_里的信息依次取出,绘制每一个词组。

        def to_image(self):
            self._check_generated()
            if self.mask is not None:
                width = self.mask.shape[1]
                height = self.mask.shape[0]
            else:
                height, width = self.height, self.width
    
            img = Image.new(self.mode, (int(width * self.scale),
                                        int(height * self.scale)),
                            self.background_color)
            draw = ImageDraw.Draw(img)
            for (word, count), font_size, position, orientation, color in self.layout_:
                font = ImageFont.truetype(self.font_path,
                                          int(font_size * self.scale))
                transposed_font = ImageFont.TransposedFont(
                    font, orientation=orientation)
                pos = (int(position[1] * self.scale),
                       int(position[0] * self.scale))
                draw.text(pos, word, fill=color, font=transposed_font)
    
            return self._draw_contour(img=img)

     

    引申思考:

    查找文字合适的放置该怎样实现呢?(注意:文字笔画的空隙里也是可以放置更小一字号的文字)

     

    ~ End ~

    展开全文
  • 使用布局,它本身是出色的数据可视化的扩展。 依存关系 , , , 演示应用程序项目使用jquery.get()方法获取初始数据。 jQuery本身不是必需的。 动机 将D3数据可视化功能与React Components技术结合在一起,以...
  • WordCloud 中英文词云图绘制

    千次阅读 2019-06-09 17:10:06
    摘要:当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云...

    摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。

    这篇文章中详细说明各种形式的词云图绘制步骤。

     

    1. 英文词云

    我们先绘制英文文本的词云图,因为它相对简单一些。这里以《海上钢琴师》这部电影的剧本为例。

    首先,准备好电影剧本的文本文件(如下图):

     

    接下来,我们绘制一个最简单的矩形词云图,代码如下:

     1import os
     2from os import path
     3from wordcloud import WordCloud
     4from matplotlib import pyplot as plt
     5# 获取当前文件路径
     6d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
     7# 获取文本text
     8text = open(path.join(d,'legend1900.txt')).read()
     9# 生成词云
    10wc = WordCloud(scale=2,max_font_size = 100)
    11wc.generate_from_text(text)
    12# 显示图像
    13plt.imshow(wc,interpolation='bilinear')
    14plt.axis('off')
    15plt.tight_layout()
    16#存储图像
    17wc.to_file('1900_basic.png')
    18# or
    19# plt.savefig('1900_basic.png',dpi=200)
    20plt.show()
    

    这里,通过 open() 方法读取文本文件,然后在 WordCloud 方法中设置了词云参数,再利用 generate_from_text() 方法生成该电影剧本的词云,最后显示和保存词云图。十几行代码就可以生成最简单的词云图:

     

    通过上面的词云图,你可能会发现有几点问题:

    • 可不可以更换背景,比如白色?

    • 词云图能不能换成其他形状或者图片?

    • 词云中最显眼的词汇 「ONE」,并没有实际含义,能不能去掉?

    以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下 WordCloud 的API 参数及它的一些方法。

    这里,我们列出它的各项参数,并注释重要的几项:

     1wordcloud.WordCloud(
     2    font_path=None,  # 字体路径,英文不用设置路径,中文需要,否则无法正确显示图形
     3    width=400, # 默认宽度
     4    height=200, # 默认高度
     5    margin=2, # 边缘
     6    ranks_only=None, 
     7    prefer_horizontal=0.9, 
     8    mask=None, # 背景图形,如果想根据图片绘制,则需要设置
     9    scale=1, 
    10    color_func=None, 
    11    max_words=200, # 最多显示的词汇量
    12    min_font_size=4, # 最小字号
    13    stopwords=None, # 停止词设置,修正词云图时需要设置
    14    random_state=None, 
    15    background_color='black', # 背景颜色设置,可以为具体颜色,比如white或者16进制数值
    16    max_font_size=None, # 最大字号
    17    font_step=1, 
    18    mode='RGB', 
    19    relative_scaling='auto', 
    20    regexp=None, 
    21    collocations=True, 
    22    colormap='viridis', # matplotlib 色图,可更改名称进而更改整体风格
    23    normalize_plurals=True, 
    24    contour_width=0, 
    25    contour_color='black', 
    26    repeat=False)
    

    关于更详细的用法,你需要到官网了解。

    了解了各项参数后,我们就可以自定义想要的词云图了。比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:

    1wc = WordCloud(
    2    scale=2,# 缩放2倍
    3    max_font_size = 100,
    4    background_color = '#383838',# 灰色
    5    colormap = 'Blues') 
    6# colormap名称 https://matplotlib.org/examples/color/colormaps_reference.html
    

    结果如下:

     

    接下来,我们提升一点难度,通过设置 StopWords 去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。

     

     

    代码实现如下:

     1import os
     2from os import path
     3import numpy as np
     4from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
     5from PIL import Image
     6from matplotlib import pyplot as plt
     7from scipy.misc import imread
     8import random
     9
    10def wc_english():
    11    # 获取当前文件路径
    12    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
    13    # 获取文本text
    14    text = open(path.join(d,'legend1900.txt')).read()
    15    # 读取背景图片
    16    background_Image = np.array(Image.open(path.join(d, "mask1900.jpg")))
    17    # or
    18    # background_Image = imread(path.join(d, "mask1900.jpg"))
    19    # 提取背景图片颜色
    20    img_colors = ImageColorGenerator(background_Image)
    21    # 设置英文停止词
    22    stopwords = set(STOPWORDS)
    23    wc = WordCloud(
    24        margin = 2, # 设置页面边缘
    25        mask = background_Image,
    26        scale = 2,
    27        max_words = 200, # 最多词个数
    28        min_font_size = 4, # 最小字体大小
    29        stopwords = stopwords,
    30        random_state = 42,
    31        background_color = 'white', # 背景颜色
    32        max_font_size = 150, # 最大字体大小
    33        )
    34    # 生成词云
    35    wc.generate_from_text(text)
    36    # 等价于
    37    # wc.generate(text)
    38    # 根据图片色设置背景色
    39    wc.recolor(color_func=img_colors)
    40    #存储图像
    41    wc.to_file('1900pro1.png')
    42    # 显示图像
    43    plt.imshow(wc,interpolation='bilinear')
    44    plt.axis('off')
    45    plt.tight_layout()
    46    plt.show()
    

    这里,首先通过 open() 方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。

    接着设置了词云自带的英文 StopWords 停止词,用来分割筛除文本中不需要的词汇,比如:a、an、the 这些。

    然后,在 WordCloud 方法中,设置词云的具体参数。generate_from_text() 方法生成该词云,recolor() 则是根据图片色彩绘制词云文字颜色。最终的词云绘制效果如下:

     

    现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:

    1# 获取文本词排序,可调整 stopwords
    2process_word = WordCloud.process_text(wc,text)
    3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    4print(sort[:50]) # 获取文本词频最高的前50个词
    5# 结果
    6[('one', 60), ('ship', 47), ('Nineteen Hundred', 43), ('know', 38), ('music', 36), ...]
    7
    8stopwords = set(STOPWORDS)
    9stopwords.add('one')
    

    首先,我们对文本词频进行排序,可以看到 「ONE」词频最高,就将它添加进 stopwords 中,这样就可以屏蔽该词从而不在词云中显示。

    需要注意的是,这种手动添加停止词的方法适用于词数量比较少的情况。

     

    另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:

    1def grey_color_func(word, font_size, position, orientation, random_state=None,
    2                    **kwargs):
    3        return "hsl(0, 0%%, %d%%)" % random.randint(50, 100)
    4        # 随机设置hsl色值
    5wc.recolor(color_func=grey_color_func) 
    

    效果如下:

     

    以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。

    2. 中文词云

    相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用 jieba 包来切割分词。因为它可以说是最好的中文分词包了,GitHub 上拥有 160 K 的 Star 数。安装好 jieba 包后,我们就可以对文本进行分词然后生成词云。

    这里,选取吴军老师的著作《浪潮之巅》作为中文文本的案例,仍然采用图片形式的词云图。素材准备好后,接下来就可以开始中文词云图绘制。

     

    首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式:

    1text = open(path.join(d,'langchao.txt'),'rb').read()
    2text_charInfo = chardet.detect(text)
    3print(text_charInfo)
    4# 结果
    5{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
    6text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()
    

    接着,对文本进行分词。jieba 分词有 3 种方式:精确模式、全模式和搜索引擎模式,它们之间的差别,可以用一个例子来体现。

    比如,有这样的一句话:「"我来到北京清华大学"」,用 3 种模式进行分词,结果分别如下:

    • 全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

    • 精确模式: 我/ 来到/ 北京/ 清华大学

    • 搜索引擎模式: 我/ 来/ 来到/ 北京/ 清华/ 大学/ 清华大学/

    根据结果可知,我们应该选择「精确模式」来分词。关于 jieba 包的详细用法,可以参考 GitHub 仓库链接:

    https://github.com/fxsjy/jieba

    分词完成后,还需要设置 stopwords 停止词,由于 WordCloud 没有中文停止词,所以需要自行构造。这里可以采取两种方式来构造:

    • 通过 stopwords.update() 方法手动添加

    • 根据已有 stopwords 词库遍历文本筛除停止词

    2.1. stopwords.update() 手动添加

    这种方法和前面的英文停止词构造的方法是一样的,目的是在词云图中不显示 stopwords 就行了 ,即先不设置 stopwords,而是先对文本词频进行排序,然后将不需要的词语添加为 stopwords 即可,代码实现如下:

    1# 获取文本词排序,可调整 stopwords
    2process_word = WordCloud.process_text(wc,text)
    3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    4print(sort[:50]) # # 获取文本词频最高的前50个词
    5
    6[('公司', 1273), ('但是', 769), ('IBM', 668), ('一个', 616), ('Google', 429), ('自己', 396), ('因此', 363), ('微软', 358), ('美国', 344), ('没有', 334)...]
    

    可以看到,我们先输出文本词频最高的一些词汇后,发现:「但是」、「一个」、「因此」这些词都是不需要显示在词云图中的。因此,可以把这些词用列表的形式添加到 stopwords 中,然后再次绘制词云图就能得出比较理想的效果,完整代码如下:

     1import chardet
     2import jieba
     3text+=' '.join(jieba.cut(text,cut_all=False)) # cut_all=False 表示采用精确模式
     4# 设置中文字体
     5font_path = 'C:\Windows\Fonts\SourceHanSansCN-Regular.otf'  # 思源黑体
     6# 读取背景图片
     7background_Image = np.array(Image.open(path.join(d, "wave.png")))
     8# 提取背景图片颜色
     9img_colors = ImageColorGenerator(background_Image)
    10# 设置中文停止词
    11stopwords = set('')
    12stopwords.update(['但是','一个','自己','因此','没有','很多','可以','这个','虽然','因为','这样','已经','现在','一些','比如','不是','当然','可能','如果','就是','同时','比如','这些','必须','由于','而且','并且','他们'])
    13
    14wc = WordCloud(
    15        font_path = font_path, # 中文需设置路径
    16        margin = 2, # 页面边缘
    17        mask = background_Image,
    18        scale = 2,
    19        max_words = 200, # 最多词个数
    20        min_font_size = 4, #
    21        stopwords = stopwords,
    22        random_state = 42,
    23        background_color = 'white', # 背景颜色
    24        # background_color = '#C3481A', # 背景颜色
    25        max_font_size = 100,
    26        )
    27wc.generate(text)
    28# 获取文本词排序,可调整 stopwords
    29process_word = WordCloud.process_text(wc,text)
    30sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    31print(sort[:50]) # 获取文本词频最高的前50个词
    32# 设置为背景色,若不想要背景图片颜色,就注释掉
    33wc.recolor(color_func=img_colors)
    34# 存储图像
    35wc.to_file('浪潮之巅basic.png')
    36# 显示图像
    37plt.imshow(wc,interpolation='bilinear')
    38plt.axis('off')
    39plt.tight_layout()
    40plt.show()    

    stopwords 添加之前:

     

    stopwords 添加之后:

     

    可以看到,stopwords.update() 这种方法需要手动去添加,比较麻烦一些,而且如果 stopwords 过多的话,添加就比较费时了。下面介绍第 2 种自动去除 stopwords 的方法。

    2.2. stopwords 库自动遍历删除

    这种方法的思路也比较简单,主要分为 2 个步骤:

    • 利用已有的中文 stopwords 词库,对原文本进行分词后,遍历词库去除停止词,然后生成新的文本文件。

    • 根据新的文件绘制词云图,便不会再出现 stopwords,如果发现 stopwords 词库不全可以进行补充,然后再次生成词云图即可。

    代码实现如下:

     1# 对原文本分词
     2def cut_words():
     3    # 获取当前文件路径
     4    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
     5    text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()
     6    text = jieba.cut(text,cut_all=False)
     7    content = ''
     8    for i in text:
     9        content += i
    10        content += " "
    11    return content
    12
    13# 加载stopwords
    14def load_stopwords():
    15    filepath = path.join(d,r'stopwords_cn.txt')
    16    stopwords = [line.strip() for line in open(filepath,encoding='utf-8').readlines()]
    17    # print(stopwords) # ok
    18    return stopwords
    19
    20# 去除原文stopwords,并生成新的文本
    21def move_stopwwords(content,stopwords):
    22    content_after = ''
    23    for word in content:
    24        if word not in stopwords:
    25            if word != '\t'and'\n':
    26                content_after += word
    27
    28    content_after = content_after.replace("   ", " ").replace("  ", " ")
    29    # print(content_after)
    30    # 写入去停止词后生成的新文本
    31    with open('langchao2.txt','w',encoding='UTF-8-SIG') as f:
    32        f.write(content_after)
    

    网上有很多中文 stopwords 词库资料,这里选取了一套包含近 2000 个词汇和标点符号的词库:stopwords_cn.txt,结构形式如下:

     

    遍历该 stopwords 词库,删除停止词获得新的文本,然后利用第一种方法绘制词云图即可。

    首先输出一下文本词频最高的部分词汇,可以看到常见的停止词已经没有了:

    1[('公司', 1462), ('美国', 366), ('IBM', 322), ('微软', 320), ('市场', 287), ('投资', 263), ('世界', 236), ('硅谷', 235), ('技术', 234), ('发展', 225), ('计算机', 218), ('摩托罗拉', 203)...]
    

    词云图最终效果如下:

     

    3. Frenquency 词云图

    上面两种中英文词云图都是通过文本绘制的,而除了直接读入文本生成词云以外,比较常见的还有通过「词频」绘制词云图。这种词云图,则可以使用 DataFrame 或者 字典格式 来绘制。

    下面,以此前我们爬过的一篇「近十年 世界大学排名 TOP500 强」教程的数据为例,介绍如何绘制词频词云图。

    该份数据大小为 5001行 x 6 列,我们想根据各国 TOP 500 强大学的数量,来可视化地展示各国之间的大学数量差异。

     1world_rank    university  score   quantity    year    country
     21    哈佛大学    100 500 2009    USA
     32    斯坦福大学   73.1    499 2009    USA
     43    加州大学-伯克利    71  498 2009    USA
     54    剑桥大学    70.2    497 2009    UK
     65    麻省理工学院  69.5    496 2009    USA
     7...
     8496    犹他州立大学      2018    USA
     9497    圣拉斐尔生命健康大学      2018    Italy
    10498    早稻田大学       2018    Japan
    11499    韦恩州立大学      2018    USA
    12500    西弗吉尼亚大学     2018    USA
    

    这里,有两种方式可以直接生成频率词云图,第一种是 利用 Series 列表生成,代码实现如下:

     1import pandas as pd
     2import matplotlib.dates as mdate
     3from wordcloud import WordCloud
     4import matplotlib.pyplot as plt
     5
     6df = pd.read_csv('university.csv',encoding = 'utf-8')
     7df = df.groupby(by = 'country').count()
     8df = df['world_rank'].sort_values(ascending = False)
     9print(df[:10])
    10# 结果如下:
    11country
    12USA               1459
    13Germany            382
    14UK                 379
    15China              320
    16France             210
    17Canada             209
    18Japan              206
    19Australia          199
    20Italy              195
    21Netherlands        122
    

    第二种方式是转换为 dict 字典生成,一行代码就可以完成:

    1df = dict(df)
    2print(df)
    3# 结果如下:
    4{'USA': 1459, 'Germany': 382, 'UK': 379, 'China': 320, 'France': 210,..}
    

    数据转换好以后,就可以生成词云图了,代码实现如下:

     1font_path='C:\Windows\Fonts\SourceHanSansCN-Regular.otf'  # 思源黑
     2wordcloud = WordCloud(
     3    background_color = '#F3F3F3',
     4    font_path = font_path,
     5    width = 5000,
     6    height = 300,
     7    margin = 2,
     8    max_font_size = 200,
     9    random_state = 42,
    10    scale = 2,
    11    colormap = 'viridis',  # 默认virdis
    12    )
    13wordcloud.generate_from_frequencies(df)
    14# or
    15# wordcloud.fit_words(df)
    16plt.imshow(wordcloud,interpolation = 'bilinear')
    17plt.axis('off')
    18plt.show()
    

    效果如下:

     

    可以看到,美国最为突出,其次是德国、英国、中国等。看来,我们国内的大学还得加把劲啊。

    以上,就是绘制词云图常见的几种方式。

    本文完。

    文中代码可以在下面的链接中获取:

    https://github.com/makcyun/eastmoney_spider

    展开全文
  • 摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常...

    640

    摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。

    写在前面:由于文中有一些超链接,无法在公众号打开,建议点击底部「阅读原文」或者复制下面的博客链接到浏览器打开,体验更好。

    https://www.makcyun.top/

    在上一篇文章「

    640

    1. 英文词云

    我们先绘制英文文本的词云图,因为它相对简单一些。这里以《海上钢琴师》这部电影的剧本为例。

    首先,准备好电影剧本的文本文件(如下图):

    640

    接下来,我们绘制一个最简单的矩形词云图,代码如下:

     1import os
     2from os import path
     3from wordcloud import WordCloud
     4from matplotlib import pyplot as plt
     5# 获取当前文件路径
     6d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
     7# 获取文本text
     8text = open(path.join(d,'legend1900.txt')).read()
     9# 生成词云
    10wc = WordCloud(scale=2,max_font_size = 100)
    11wc.generate_from_text(text)
    12# 显示图像
    13plt.imshow(wc,interpolation='bilinear')
    14plt.axis('off')
    15plt.tight_layout()
    16#存储图像
    17wc.to_file('1900_basic.png')
    18# or
    19# plt.savefig('1900_basic.png',dpi=200)
    20plt.show()
    

    这里,通过 open() 方法读取文本文件,然后在 WordCloud 方法中设置了词云参数,再利用 generate_from_text() 方法生成该电影剧本的词云,最后显示和保存词云图。十几行代码就可以生成最简单的词云图:

    640

    通过上面的词云图,你可能会发现有几点问题:

    • 可不可以更换背景,比如白色?

    • 词云图能不能换成其他形状或者图片?

    • 词云中最显眼的词汇 「ONE」,并没有实际含义,能不能去掉?

    以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下 WordCloud 的API 参数及它的一些方法。

    这里,我们列出它的各项参数,并注释重要的几项:

     1wordcloud.WordCloud(
     2    font_path=None,  # 字体路径,英文不用设置路径,中文需要,否则无法正确显示图形
     3    width=400, # 默认宽度
     4    height=200, # 默认高度
     5    margin=2, # 边缘
     6    ranks_only=None, 
     7    prefer_horizontal=0.9, 
     8    mask=None, # 背景图形,如果想根据图片绘制,则需要设置
     9    scale=1, 
    10    color_func=None, 
    11    max_words=200, # 最多显示的词汇量
    12    min_font_size=4, # 最小字号
    13    stopwords=None, # 停止词设置,修正词云图时需要设置
    14    random_state=None, 
    15    background_color='black', # 背景颜色设置,可以为具体颜色,比如white或者16进制数值
    16    max_font_size=None, # 最大字号
    17    font_step=1, 
    18    mode='RGB', 
    19    relative_scaling='auto', 
    20    regexp=None, 
    21    collocations=True, 
    22    colormap='viridis', # matplotlib 色图,可更改名称进而更改整体风格
    23    normalize_plurals=True, 
    24    contour_width=0, 
    25    contour_color='black', 
    26    repeat=False)
    

    关于更详细的用法,你需要到官网了解。

    了解了各项参数后,我们就可以自定义想要的词云图了。比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:

    1wc = WordCloud(
    2    scale=2,# 缩放2倍
    3    max_font_size = 100,
    4    background_color = '#383838',# 灰色
    5    colormap = 'Blues') 
    6# colormap名称 https://matplotlib.org/examples/color/colormaps_reference.html
    

    结果如下:

    640

    接下来,我们提升一点难度,通过设置 StopWords 去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。

    640


    代码实现如下:

     1import os
     2from os import path
     3import numpy as np
     4from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
     5from PIL import Image
     6from matplotlib import pyplot as plt
     7from scipy.misc import imread
     8import random
     9
    10def wc_english():
    11    # 获取当前文件路径
    12    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
    13    # 获取文本text
    14    text = open(path.join(d,'legend1900.txt')).read()
    15    # 读取背景图片
    16    background_Image = np.array(Image.open(path.join(d, "mask1900.jpg")))
    17    # or
    18    # background_Image = imread(path.join(d, "mask1900.jpg"))
    19    # 提取背景图片颜色
    20    img_colors = ImageColorGenerator(background_Image)
    21    # 设置英文停止词
    22    stopwords = set(STOPWORDS)
    23    wc = WordCloud(
    24        margin = 2, # 设置页面边缘
    25        mask = background_Image,
    26        scale = 2,
    27        max_words = 200, # 最多词个数
    28        min_font_size = 4, # 最小字体大小
    29        stopwords = stopwords,
    30        random_state = 42,
    31        background_color = 'white', # 背景颜色
    32        max_font_size = 150, # 最大字体大小
    33        )
    34    # 生成词云
    35    wc.generate_from_text(text)
    36    # 等价于
    37    # wc.generate(text)
    38    # 根据图片色设置背景色
    39    wc.recolor(color_func=img_colors)
    40    #存储图像
    41    wc.to_file('1900pro1.png')
    42    # 显示图像
    43    plt.imshow(wc,interpolation='bilinear')
    44    plt.axis('off')
    45    plt.tight_layout()
    46    plt.show()
    

    这里,首先通过 open() 方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。

    接着设置了词云自带的英文 StopWords 停止词,用来分割筛除文本中不需要的词汇,比如:a、an、the 这些。

    然后,在 WordCloud 方法中,设置词云的具体参数。generate_from_text() 方法生成该词云,recolor() 则是根据图片色彩绘制词云文字颜色。最终的词云绘制效果如下:

    640

    现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:

    1# 获取文本词排序,可调整 stopwords
    2process_word = WordCloud.process_text(wc,text)
    3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    4print(sort[:50]) # 获取文本词频最高的前50个词
    5# 结果
    6[('one', 60), ('ship', 47), ('Nineteen Hundred', 43), ('know', 38), ('music', 36), ...]
    7
    8stopwords = set(STOPWORDS)
    9stopwords.add('one')
    

    首先,我们对文本词频进行排序,可以看到 「ONE」词频最高,就将它添加进 stopwords 中,这样就可以屏蔽该词从而不在词云中显示。

    需要注意的是,这种手动添加停止词的方法适用于词数量比较少的情况。

    640

    另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:

    1def grey_color_func(word, font_size, position, orientation, random_state=None,
    2                    **kwargs):
    3        return "hsl(0, 0%%, %d%%)" % random.randint(50, 100)
    4        # 随机设置hsl色值
    5wc.recolor(color_func=grey_color_func) 
    

    效果如下:

    640

    以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。

    2. 中文词云

    相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用 jieba 包来切割分词。因为它可以说是最好的中文分词包了,GitHub 上拥有 160 K 的 Star 数。安装好 jieba 包后,我们就可以对文本进行分词然后生成词云。

    这里,选取吴军老师的著作《浪潮之巅》作为中文文本的案例,仍然采用图片形式的词云图。素材准备好后,接下来就可以开始中文词云图绘制。

    640

    首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式:

    1text = open(path.join(d,'langchao.txt'),'rb').read()
    2text_charInfo = chardet.detect(text)
    3print(text_charInfo)
    4# 结果
    5{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
    6text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()
    

    接着,对文本进行分词。jieba 分词有 3 种方式:精确模式、全模式和搜索引擎模式,它们之间的差别,可以用一个例子来体现。

    比如,有这样的一句话:「"我来到北京清华大学"」,用 3 种模式进行分词,结果分别如下:

    • 全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

    • 精确模式: 我/ 来到/ 北京/ 清华大学

    • 搜索引擎模式: 我/ 来/ 来到/ 北京/ 清华/ 大学/ 清华大学/

    根据结果可知,我们应该选择「精确模式」来分词。关于 jieba 包的详细用法,可以参考 GitHub 仓库链接:

    https://github.com/fxsjy/jieba

    分词完成后,还需要设置 stopwords 停止词,由于 WordCloud 没有中文停止词,所以需要自行构造。这里可以采取两种方式来构造:

    • 通过 stopwords.update() 方法手动添加

    • 根据已有 stopwords 词库遍历文本筛除停止词

    2.1. stopwords.update() 手动添加

    这种方法和前面的英文停止词构造的方法是一样的,目的是在词云图中不显示 stopwords 就行了 ,即先不设置 stopwords,而是先对文本词频进行排序,然后将不需要的词语添加为 stopwords 即可,代码实现如下:

    1# 获取文本词排序,可调整 stopwords
    2process_word = WordCloud.process_text(wc,text)
    3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    4print(sort[:50]) # # 获取文本词频最高的前50个词
    5
    6[('公司', 1273), ('但是', 769), ('IBM', 668), ('一个', 616), ('Google', 429), ('自己', 396), ('因此', 363), ('微软', 358), ('美国', 344), ('没有', 334)...]
    

    可以看到,我们先输出文本词频最高的一些词汇后,发现:「但是」、「一个」、「因此」这些词都是不需要显示在词云图中的。因此,可以把这些词用列表的形式添加到 stopwords 中,然后再次绘制词云图就能得出比较理想的效果,完整代码如下:

     1import chardet
     2import jieba
     3text+=' '.join(jieba.cut(text,cut_all=False)) # cut_all=False 表示采用精确模式
     4# 设置中文字体
     5font_path = 'C:\Windows\Fonts\SourceHanSansCN-Regular.otf'  # 思源黑体
     6# 读取背景图片
     7background_Image = np.array(Image.open(path.join(d, "wave.png")))
     8# 提取背景图片颜色
     9img_colors = ImageColorGenerator(background_Image)
    10# 设置中文停止词
    11stopwords = set('')
    12stopwords.update(['但是','一个','自己','因此','没有','很多','可以','这个','虽然','因为','这样','已经','现在','一些','比如','不是','当然','可能','如果','就是','同时','比如','这些','必须','由于','而且','并且','他们'])
    13
    14wc = WordCloud(
    15        font_path = font_path, # 中文需设置路径
    16        margin = 2, # 页面边缘
    17        mask = background_Image,
    18        scale = 2,
    19        max_words = 200, # 最多词个数
    20        min_font_size = 4, #
    21        stopwords = stopwords,
    22        random_state = 42,
    23        background_color = 'white', # 背景颜色
    24        # background_color = '#C3481A', # 背景颜色
    25        max_font_size = 100,
    26        )
    27wc.generate(text)
    28# 获取文本词排序,可调整 stopwords
    29process_word = WordCloud.process_text(wc,text)
    30sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    31print(sort[:50]) # 获取文本词频最高的前50个词
    32# 设置为背景色,若不想要背景图片颜色,就注释掉
    33wc.recolor(color_func=img_colors)
    34# 存储图像
    35wc.to_file('浪潮之巅basic.png')
    36# 显示图像
    37plt.imshow(wc,interpolation='bilinear')
    38plt.axis('off')
    39plt.tight_layout()
    40plt.show()    

    stopwords 添加之前:

    640

    stopwords 添加之后:

    640

    可以看到,stopwords.update() 这种方法需要手动去添加,比较麻烦一些,而且如果 stopwords 过多的话,添加就比较费时了。下面介绍第 2 种自动去除 stopwords 的方法。

    2.2. stopwords 库自动遍历删除

    这种方法的思路也比较简单,主要分为 2 个步骤:

    • 利用已有的中文 stopwords 词库,对原文本进行分词后,遍历词库去除停止词,然后生成新的文本文件。

    • 根据新的文件绘制词云图,便不会再出现 stopwords,如果发现 stopwords 词库不全可以进行补充,然后再次生成词云图即可。

    代码实现如下:

     1# 对原文本分词
     2def cut_words():
     3    # 获取当前文件路径
     4    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
     5    text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()
     6    text = jieba.cut(text,cut_all=False)
     7    content = ''
     8    for i in text:
     9        content += i
    10        content += " "
    11    return content
    12
    13# 加载stopwords
    14def load_stopwords():
    15    filepath = path.join(d,r'stopwords_cn.txt')
    16    stopwords = [line.strip() for line in open(filepath,encoding='utf-8').readlines()]
    17    # print(stopwords) # ok
    18    return stopwords
    19
    20# 去除原文stopwords,并生成新的文本
    21def move_stopwwords(content,stopwords):
    22    content_after = ''
    23    for word in content:
    24        if word not in stopwords:
    25            if word != '\t'and'\n':
    26                content_after += word
    27
    28    content_after = content_after.replace("   ", " ").replace("  ", " ")
    29    # print(content_after)
    30    # 写入去停止词后生成的新文本
    31    with open('langchao2.txt','w',encoding='UTF-8-SIG') as f:
    32        f.write(content_after)
    

    网上有很多中文 stopwords 词库资料,这里选取了一套包含近 2000 个词汇和标点符号的词库:stopwords_cn.txt,结构形式如下:

    640

    遍历该 stopwords 词库,删除停止词获得新的文本,然后利用第一种方法绘制词云图即可。

    首先输出一下文本词频最高的部分词汇,可以看到常见的停止词已经没有了:

    1[('公司', 1462), ('美国', 366), ('IBM', 322), ('微软', 320), ('市场', 287), ('投资', 263), ('世界', 236), ('硅谷', 235), ('技术', 234), ('发展', 225), ('计算机', 218), ('摩托罗拉', 203)...]
    

    词云图最终效果如下:

    640

    3. Frenquency 词云图

    上面两种中英文词云图都是通过文本绘制的,而除了直接读入文本生成词云以外,比较常见的还有通过「词频」绘制词云图。这种词云图,则可以使用 DataFrame 或者 字典格式 来绘制。

    下面,以此前我们爬过的一篇「

    该份数据大小为 5001行 x 6 列,我们想根据各国 TOP 500 强大学的数量,来可视化地展示各国之间的大学数量差异。

     1world_rank    university  score   quantity    year    country
     21    哈佛大学    100 500 2009    USA
     32    斯坦福大学   73.1    499 2009    USA
     43    加州大学-伯克利    71  498 2009    USA
     54    剑桥大学    70.2    497 2009    UK
     65    麻省理工学院  69.5    496 2009    USA
     7...
     8496    犹他州立大学      2018    USA
     9497    圣拉斐尔生命健康大学      2018    Italy
    10498    早稻田大学       2018    Japan
    11499    韦恩州立大学      2018    USA
    12500    西弗吉尼亚大学     2018    USA
    

    这里,有两种方式可以直接生成频率词云图,第一种是 利用 Series 列表生成,代码实现如下:

     1import pandas as pd
     2import matplotlib.dates as mdate
     3from wordcloud import WordCloud
     4import matplotlib.pyplot as plt
     5
     6df = pd.read_csv('university.csv',encoding = 'utf-8')
     7df = df.groupby(by = 'country').count()
     8df = df['world_rank'].sort_values(ascending = False)
     9print(df[:10])
    10# 结果如下:
    11country
    12USA               1459
    13Germany            382
    14UK                 379
    15China              320
    16France             210
    17Canada             209
    18Japan              206
    19Australia          199
    20Italy              195
    21Netherlands        122
    

    第二种方式是转换为 dict 字典生成,一行代码就可以完成:

    1df = dict(df)
    2print(df)
    3# 结果如下:
    4{'USA': 1459, 'Germany': 382, 'UK': 379, 'China': 320, 'France': 210,..}
    

    数据转换好以后,就可以生成词云图了,代码实现如下:

     1font_path='C:\Windows\Fonts\SourceHanSansCN-Regular.otf'  # 思源黑
     2wordcloud = WordCloud(
     3    background_color = '#F3F3F3',
     4    font_path = font_path,
     5    width = 5000,
     6    height = 300,
     7    margin = 2,
     8    max_font_size = 200,
     9    random_state = 42,
    10    scale = 2,
    11    colormap = 'viridis',  # 默认virdis
    12    )
    13wordcloud.generate_from_frequencies(df)
    14# or
    15# wordcloud.fit_words(df)
    16plt.imshow(wordcloud,interpolation = 'bilinear')
    17plt.axis('off')
    18plt.show()
    

    效果如下:

    640

    可以看到,美国最为突出,其次是德国、英国、中国等。看来,我们国内的大学还得加把劲啊。

    以上,就是绘制词云图常见的几种方式。

    本文完。

    文中代码可以在下面的链接中获取:

    https://github.com/makcyun/eastmoney_spider

    ◆ ◆ ◆  ◆ ◆

    数据森麟
    长按二维码关注我们


    数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以通过扫描下方管理员二维码,让管理员帮忙拉进群,期待大家的加入。

    管理员二维码:

    猜你喜欢

    ● 

    ● 

    ● 

    ● 

       ● 

    展开全文
  • 来源:第2大脑 链接:https://mp.weixin.qq.com/s/G9LikLmL82l594_7JWiNig摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的...

    来源:第2大脑 链接:

    https://mp.weixin.qq.com/s/G9LikLmL82l594_7JWiNig

    摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。

    写在前面:由于文中有一些超链接,无法在公众号打开,复制下面的博客链接到浏览器打开,体验更好。

    https://www.makcyun.top/

    在上一篇文章「pyspider 爬取并分析虎嗅网 5 万篇文章 」中的文本可视化部分,我们通过 WordCloud 和 jieba 两个包绘制了中文词云图,当时只是罗列出了代码,并没有详细介绍。接下来,将详细说明各种形式的词云图绘制步骤。

    ee89be377b7a7098fdf4e3cb3133f7e4.png

    1. 英文词云

    我们先绘制英文文本的词云图,因为它相对简单一些。这里以《海上钢琴师》这部电影的剧本为例。

    首先,准备好电影剧本的文本文件(如下图):

    04c996fd3865d6e52c81f7efa9306f79.png

    接下来,我们绘制一个最简单的矩形词云图,代码如下:

    1import os
     2from os import path
     3from wordcloud import WordCloud
     4from matplotlib import pyplot as plt
     5# 获取当前文件路径
     6d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
     7# 获取文本text
     8text = open(path.join(d,'legend1900.txt')).read()
     9# 生成词云
    10wc = WordCloud(scale=2,max_font_size = 100)
    11wc.generate_from_text(text)
    12# 显示图像
    13plt.imshow(wc,interpolation='bilinear')
    14plt.axis('off')
    15plt.tight_layout()
    16#存储图像
    17wc.to_file('1900_basic.png')
    18# or
    19# plt.savefig('1900_basic.png',dpi=200)
    20plt.show()

    这里,通过 open() 方法读取文本文件,然后在 WordCloud 方法中设置了词云参数,再利用 generate_from_text() 方法生成该电影剧本的词云,最后显示和保存词云图。十几行代码就可以生成最简单的词云图:

    2c8e97fef2e70f144a2df7db7e13d7f5.png

    通过上面的词云图,你可能会发现有几点问题:

    • 可不可以更换背景,比如白色?
    • 词云图能不能换成其他形状或者图片?
    • 词云中最显眼的词汇 「ONE」,并没有实际含义,能不能去掉?

    以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下 WordCloud 的API 参数及它的一些方法。

    这里,我们列出它的各项参数,并注释重要的几项:

     1wordcloud.WordCloud(
     2    font_path=None,  # 字体路径,英文不用设置路径,中文需要,否则无法正确显示图形
     3    width=400, # 默认宽度
     4    height=200, # 默认高度
     5    margin=2, # 边缘
     6    ranks_only=None, 
     7    prefer_horizontal=0.9, 
     8    mask=None, # 背景图形,如果想根据图片绘制,则需要设置
     9    scale=1, 
    10    color_func=None, 
    11    max_words=200, # 最多显示的词汇量
    12    min_font_size=4, # 最小字号
    13    stopwords=None, # 停止词设置,修正词云图时需要设置
    14    random_state=None, 
    15    background_color='black', # 背景颜色设置,可以为具体颜色,比如white或者16进制数值
    16    max_font_size=None, # 最大字号
    17    font_step=1, 
    18    mode='RGB', 
    19    relative_scaling='auto', 
    20    regexp=None, 
    21    collocations=True, 
    22    colormap='viridis', # matplotlib 色图,可更改名称进而更改整体风格
    23    normalize_plurals=True, 
    24    contour_width=0, 
    25    contour_color='black', 
    26    repeat=False)

    关于更详细的用法,你需要到官网了解。

    了解了各项参数后,我们就可以自定义想要的词云图了。比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:

    1wc = WordCloud(
    2    scale=2,# 缩放2倍
    3    max_font_size = 100,
    4    background_color = '#383838',# 灰色
    5    colormap = 'Blues') 
    6# colormap名称 https://matplotlib.org/examples/color/colormaps_reference.html

    结果如下:

    cba44fd6086981947828f04c090f9922.png

    接下来,我们提升一点难度,通过设置 StopWords 去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。

    8f196405381db855e4f3d01c478c305d.png

    代码实现如下:

     1import os
     2from os import path
     3import numpy as np
     4from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
     5from PIL import Image
     6from matplotlib import pyplot as plt
     7from scipy.misc import imread
     8import random
     9
    10def wc_english():
    11    # 获取当前文件路径
    12    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
    13    # 获取文本text
    14    text = open(path.join(d,'legend1900.txt')).read()
    15    # 读取背景图片
    16    background_Image = np.array(Image.open(path.join(d, "mask1900.jpg")))
    17    # or
    18    # background_Image = imread(path.join(d, "mask1900.jpg"))
    19    # 提取背景图片颜色
    20    img_colors = ImageColorGenerator(background_Image)
    21    # 设置英文停止词
    22    stopwords = set(STOPWORDS)
    23    wc = WordCloud(
    24        margin = 2, # 设置页面边缘
    25        mask = background_Image,
    26        scale = 2,
    27        max_words = 200, # 最多词个数
    28        min_font_size = 4, # 最小字体大小
    29        stopwords = stopwords,
    30        random_state = 42,
    31        background_color = 'white', # 背景颜色
    32        max_font_size = 150, # 最大字体大小
    33        )
    34    # 生成词云
    35    wc.generate_from_text(text)
    36    # 等价于
    37    # wc.generate(text)
    38    # 根据图片色设置背景色
    39    wc.recolor(color_func=img_colors)
    40    #存储图像
    41    wc.to_file('1900pro1.png')
    42    # 显示图像
    43    plt.imshow(wc,interpolation='bilinear')
    44    plt.axis('off')
    45    plt.tight_layout()
    46    plt.show()

    这里,首先通过 open() 方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。

    接着设置了词云自带的英文 StopWords 停止词,用来分割筛除文本中不需要的词汇,比如:a、an、the 这些。

    然后,在 WordCloud 方法中,设置词云的具体参数。generate_from_text() 方法生成该词云,recolor() 则是根据图片色彩绘制词云文字颜色。最终的词云绘制效果如下:

    355944a50cbb6919b26eec956d67c0de.png

    现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:

    1# 获取文本词排序,可调整 stopwords
    2process_word = WordCloud.process_text(wc,text)
    3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    4print(sort[:50]) # 获取文本词频最高的前50个词
    5# 结果
    6[('one', 60), ('ship', 47), ('Nineteen Hundred', 43), ('know', 38), ('music', 36), ...]
    7
    8stopwords = set(STOPWORDS)
    9stopwords.add('one')

    首先,我们对文本词频进行排序,可以看到 「ONE」词频最高,就将它添加进 stopwords 中,这样就可以屏蔽该词从而不在词云中显示。

    需要注意的是,这种手动添加停止词的方法适用于词数量比较少的情况。

    dda82b5dff8c2cc378594c3c70fb9187.png

    另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:

    1def grey_color_func(word, font_size, position, orientation, random_state=None,
    2                    **kwargs):
    3        return "hsl(0, 0%%, %d%%)" % random.randint(50, 100)
    4        # 随机设置hsl色值
    5wc.recolor(color_func=grey_color_func) 

    效果如下:

    5a77e4a0df99d0e94573753cbe7af1cd.png

    以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。

    2. 中文词云

    相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用 jieba 包来切割分词。因为它可以说是最好的中文分词包了,GitHub 上拥有 160 K 的 Star 数。安装好 jieba 包后,我们就可以对文本进行分词然后生成词云。

    这里,选取吴军老师的著作《浪潮之巅》作为中文文本的案例,仍然采用图片形式的词云图。素材准备好后,接下来就可以开始中文词云图绘制。

    a54a77274ebf60af7cefea5e4b5d5160.png

    首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式:

    1text = open(path.join(d,'langchao.txt'),'rb').read()
    2text_charInfo = chardet.detect(text)
    3print(text_charInfo)
    4# 结果
    5{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
    6text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()

    接着,对文本进行分词。jieba 分词有 3 种方式:精确模式、全模式和搜索引擎模式,它们之间的差别,可以用一个例子来体现。

    比如,有这样的一句话:「"我来到北京清华大学"」,用 3 种模式进行分词,结果分别如下:

    • 全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
    • 精确模式: 我/ 来到/ 北京/ 清华大学
    • 搜索引擎模式: 我/ 来/ 来到/ 北京/ 清华/ 大学/ 清华大学/

    根据结果可知,我们应该选择「精确模式」来分词。关于 jieba 包的详细用法,可以参考 GitHub 仓库链接:

    https://github.com/fxsjy/jieba

    分词完成后,还需要设置 stopwords 停止词,由于 WordCloud 没有中文停止词,所以需要自行构造。这里可以采取两种方式来构造:

    • 通过 stopwords.update() 方法手动添加
    • 根据已有 stopwords 词库遍历文本筛除停止词

    2.1. stopwords.update() 手动添加

    这种方法和前面的英文停止词构造的方法是一样的,目的是在词云图中不显示 stopwords 就行了 ,即先不设置 stopwords,而是先对文本词频进行排序,然后将不需要的词语添加为 stopwords 即可,代码实现如下:

    1# 获取文本词排序,可调整 stopwords
    2process_word = WordCloud.process_text(wc,text)
    3sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    4print(sort[:50]) # # 获取文本词频最高的前50个词
    5
    6[('公司', 1273), ('但是', 769), ('IBM', 668), ('一个', 616), ('Google', 429), ('自己', 396), ('因此', 363), ('微软', 358), ('美国', 344), ('没有', 334)...]

    可以看到,我们先输出文本词频最高的一些词汇后,发现:「但是」、「一个」、「因此」这些词都是不需要显示在词云图中的。因此,可以把这些词用列表的形式添加到 stopwords 中,然后再次绘制词云图就能得出比较理想的效果,完整代码如下:

    1import chardet
     2import jieba
     3text+=' '.join(jieba.cut(text,cut_all=False)) # cut_all=False 表示采用精确模式
     4# 设置中文字体
     5font_path = 'C:WindowsFontsSourceHanSansCN-Regular.otf'  # 思源黑体
     6# 读取背景图片
     7background_Image = np.array(Image.open(path.join(d, "wave.png")))
     8# 提取背景图片颜色
     9img_colors = ImageColorGenerator(background_Image)
    10# 设置中文停止词
    11stopwords = set('')
    12stopwords.update(['但是','一个','自己','因此','没有','很多','可以','这个','虽然','因为','这样','已经','现在','一些','比如','不是','当然','可能','如果','就是','同时','比如','这些','必须','由于','而且','并且','他们'])
    13
    14wc = WordCloud(
    15        font_path = font_path, # 中文需设置路径
    16        margin = 2, # 页面边缘
    17        mask = background_Image,
    18        scale = 2,
    19        max_words = 200, # 最多词个数
    20        min_font_size = 4, #
    21        stopwords = stopwords,
    22        random_state = 42,
    23        background_color = 'white', # 背景颜色
    24        # background_color = '#C3481A', # 背景颜色
    25        max_font_size = 100,
    26        )
    27wc.generate(text)
    28# 获取文本词排序,可调整 stopwords
    29process_word = WordCloud.process_text(wc,text)
    30sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
    31print(sort[:50]) # 获取文本词频最高的前50个词
    32# 设置为背景色,若不想要背景图片颜色,就注释掉
    33wc.recolor(color_func=img_colors)
    34# 存储图像
    35wc.to_file('浪潮之巅basic.png')
    36# 显示图像
    37plt.imshow(wc,interpolation='bilinear')
    38plt.axis('off')
    39plt.tight_layout()
    40plt.show()    

    stopwords 添加之前:

    93d1b967d9c93e24e95e9741679c7b24.png

    stopwords 添加之后:

    f0c398697ebd4288b726c9eb41d19076.png

    可以看到,stopwords.update() 这种方法需要手动去添加,比较麻烦一些,而且如果 stopwords 过多的话,添加就比较费时了。下面介绍第 2 种自动去除 stopwords 的方法。

    2.2. stopwords 库自动遍历删除

    这种方法的思路也比较简单,主要分为 2 个步骤:

    • 利用已有的中文 stopwords 词库,对原文本进行分词后,遍历词库去除停止词,然后生成新的文本文件。
    • 根据新的文件绘制词云图,便不会再出现 stopwords,如果发现 stopwords 词库不全可以进行补充,然后再次生成词云图即可。

    代码实现如下:

    1# 对原文本分词
     2def cut_words():
     3    # 获取当前文件路径
     4    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
     5    text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()
     6    text = jieba.cut(text,cut_all=False)
     7    content = ''
     8    for i in text:
     9        content += i
    10        content += " "
    11    return content
    12
    13# 加载stopwords
    14def load_stopwords():
    15    filepath = path.join(d,r'stopwords_cn.txt')
    16    stopwords = [line.strip() for line in open(filepath,encoding='utf-8').readlines()]
    17    # print(stopwords) # ok
    18    return stopwords
    19
    20# 去除原文stopwords,并生成新的文本
    21def move_stopwwords(content,stopwords):
    22    content_after = ''
    23    for word in content:
    24        if word not in stopwords:
    25            if word != 't'and'n':
    26                content_after += word
    27
    28    content_after = content_after.replace("   ", " ").replace("  ", " ")
    29    # print(content_after)
    30    # 写入去停止词后生成的新文本
    31    with open('langchao2.txt','w',encoding='UTF-8-SIG') as f:
    32        f.write(content_after)

    网上有很多中文 stopwords 词库资料,这里选取了一套包含近 2000 个词汇和标点符号的词库:stopwords_cn.txt,结构形式如下:

    b1037ef23179974924bb3be010670974.png

    遍历该 stopwords 词库,删除停止词获得新的文本,然后利用第一种方法绘制词云图即可。

    首先输出一下文本词频最高的部分词汇,可以看到常见的停止词已经没有了:

    1[('公司', 1462), ('美国', 366), ('IBM', 322), ('微软', 320), ('市场', 287), ('投资', 263), ('世界', 236), ('硅谷', 235), ('技术', 234), ('发展', 225), ('计算机', 218), ('摩托罗拉', 203)...]

    词云图最终效果如下:

    e1ebee80557b3866ae6c2978ed922da7.png

    3. Frenquency 词云图

    上面两种中英文词云图都是通过文本绘制的,而除了直接读入文本生成词云以外,比较常见的还有通过「词频」绘制词云图。这种词云图,则可以使用 DataFrame 或者 字典格式 来绘制。

    下面,以此前我们爬过的一篇「近十年 世界大学排名 TOP500 强」教程的数据为例,介绍如何绘制词频词云图。

    该份数据大小为 5001行 x 6 列,我们想根据各国 TOP 500 强大学的数量,来可视化地展示各国之间的大学数量差异。

    1world_rank    university  score   quantity    year    country
     21    哈佛大学    100 500 2009    USA
     32    斯坦福大学   73.1    499 2009    USA
     43    加州大学-伯克利    71  498 2009    USA
     54    剑桥大学    70.2    497 2009    UK
     65    麻省理工学院  69.5    496 2009    USA
     7...
     8496    犹他州立大学      2018    USA
     9497    圣拉斐尔生命健康大学      2018    Italy
    10498    早稻田大学       2018    Japan
    11499    韦恩州立大学      2018    USA
    12500    西弗吉尼亚大学     2018    USA

    这里,有两种方式可以直接生成频率词云图,第一种是 利用 Series 列表生成,代码实现如下:

    1import pandas as pd
     2import matplotlib.dates as mdate
     3from wordcloud import WordCloud
     4import matplotlib.pyplot as plt
     5
     6df = pd.read_csv('university.csv',encoding = 'utf-8')
     7df = df.groupby(by = 'country').count()
     8df = df['world_rank'].sort_values(ascending = False)
     9print(df[:10])
    10# 结果如下:
    11country
    12USA               1459
    13Germany            382
    14UK                 379
    15China              320
    16France             210
    17Canada             209
    18Japan              206
    19Australia          199
    20Italy              195
    21Netherlands        122

    第二种方式是转换为 dict 字典生成,一行代码就可以完成:

    1df = dict(df)
    2print(df)
    3# 结果如下:
    4{'USA': 1459, 'Germany': 382, 'UK': 379, 'China': 320, 'France': 210,..}

    数据转换好以后,就可以生成词云图了,代码实现如下:

     1font_path='C:WindowsFontsSourceHanSansCN-Regular.otf'  # 思源黑
     2wordcloud = WordCloud(
     3    background_color = '#F3F3F3',
     4    font_path = font_path,
     5    width = 5000,
     6    height = 300,
     7    margin = 2,
     8    max_font_size = 200,
     9    random_state = 42,
    10    scale = 2,
    11    colormap = 'viridis',  # 默认virdis
    12    )
    13wordcloud.generate_from_frequencies(df)
    14# or
    15# wordcloud.fit_words(df)
    16plt.imshow(wordcloud,interpolation = 'bilinear')
    17plt.axis('off')
    18plt.show()

    效果如下:

    814dbb9d35e9c98199c68f1f6ad140f3.png

    可以看到,美国最为突出,其次是德国、英国、中国等。看来,我们国内的大学还得加把劲啊。

    以上,就是绘制词云图常见的几种方式。

    展开全文
  • 词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信好友签名,制作...
  • Wordcloud生成指定形状的词云

    千次阅读 2020-03-30 16:15:36
    wordcloud是Python扩展中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概。 首先贴出一张词云图(以哈利波特小说为例): 在生成词云图之前,首先要做一些...
  • 基于python的词云生成技术分析 中文分词 在Python中可以使用第三方的jieba进行中文分词处理。jieba能够将一段中文文本分隔成中文词语序列。jieba分词原理是依靠中文词库,利用一个中文词库确定汉字之间的关联...
  • 《红楼梦》人物出场词云 import jieba from wordcloud import WordCloud excludes=['什么','一个','我们','那是','你们','如今',\ '说到','知道','老太太','起来','姑娘','这里',\ '出来','他们','众人','自己','...
  • Python——WordCloud与Frenquency词云图 中英文绘制一、前期准备(一)主要模块包介绍功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表...
  • 下面这段代码是制作热词图的,用到了以下技术: jieba,把文本分词 wordcloud,制作热图 chardet,辨别文件的编码格式,其中中文统一为GB18030,更加的兼容 imageio,提取图片的形状 其他:自动识别文件编码,自动...
  • Wordcloud是一个词云展示的第三方 -词云是以词语为基本单位,更加直观和艺术的展示文本 例如: wordcloud库安装 cmd下 pip install wordcloud 如果pip显示没有命令,你需要: -确保Path环境变量配置正确。打开...
  • NLP之WordCloud:基于jieba+matplotlib对一段文本生成词云图~~情人节最好的礼物(给你一张过去的词云图,看看那时我们的爱情) 目录 输出词云图结果 输出文本统计 设计思路 实现代码 ...
  • 大致思路:Python扩展库wordcloud可以用来制作词云,而pillow提供了图像处理功能,代码结合二者创建了词云头像,其中把给定的图像作为参考,只保留词云中与图像前景对应位置的像素,起到裁剪作用。
  • 开发工具 pycharm ...pip install wordcloud 词云库 pip install jieba 分词库 代码分析 1、获取评论页的内容 url = 'https://movie.douban.com/subject/34841067/comments?status=P' heade...
  • 结果 主要的步骤: 1.数据获取:用爬虫或者直接去相关网站上复制文本内容,我是直接去...1.安装处理词图的模块 wordcloud  pip install wordcloud 2.安装将文本序列按完整的意思切分成一个一个词的模块 jieba  ...
  • 生成词云之python中WordCloud包的用法

    千次阅读 2018-04-16 12:55:11
    效果图: 这是python中使用wordcloud包生成的词云图。下面来介绍一下wordcloud包的基本用法。wordcloud包的基本用法class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=...
  • 词云

    2021-03-28 00:22:56
    使用python wordcloud库实现词云wordcloud库简介新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • 最近闲来无事,就用前段时间学习的jieba分词和词云WordCloud,以及网上看的python爬虫爬取了《斗罗》最燃的107集弹幕,结合做了词云分析,从这个过程中确实学到了不少技术,下面就分别详细的介绍吧! 首先,前期...
  • 要给她做个炫酷的词云都找不到好的资料,我什么时候受过这气!!! 现在好了,不用找了,我有了,嘿嘿 基础案例(英文词云) 基础案例(中文词云) 骚操作一:透明图像 骚操作二:字体颜色按图像显示 骚操作三...
  • Python_词云

    2020-04-19 00:49:34
    Python_词频统计与词云词频统计词云四行代码生成一个词云美化词云 ...import wordcloud # 导入词云制作第三方库wordcloud w = wordcloud.WordCloud() # 创建词云对象,赋值给w,现在w就表示了一个词云对象 w.g...
  • 公众号:第2大脑摘要:当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和...
  • WordCloud 简介

    千次阅读 2019-01-24 09:32:00
    WordCloud 简介 GitHub GitHub:https://github.com/amueller/word_cloud example:... ...wordcloud 是什么?...词云图 ...说wordcloud 之前我们要先了解一个名词,词云图 ,什么...
  • Python 词云系列

    2019-05-22 17:00:33
    https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html 词云又叫文字云,是...
  • 找了挺多词云生成办法很多都会有各种各样的问题,找到一个简单实现的文章保存下关于词云wordcloud什么是词云呢?词云又叫文字云,是对文本数据中出现频率较高的“关键词”在视觉上的突出呈现,形成关键词的渲染形成...
  • 10行python代码的词云

    万次阅读 多人点赞 2017-03-06 10:22:56
    关于词云wordcloud什么是词云呢?词云又叫文字云,是对文本数据中出现频率较高的“关键词”在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思。现在,可以...
  • 词云图的绘制

    2020-11-18 22:53:37
    文章目录词云图的绘制一、wordcloud库二、案例1.引入库2.读入数据3.plt.figure(figsize=(10,10))总结 词云图的绘制 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 978
精华内容 391
关键字:

wordcloud词云库技术