2024年2月

本文深入探讨了云计算的起源、发展路径、当前的技术应用、安全与合规性及未来展望。通过详尽的分析,揭示了云计算如何从基础设施服务发展到现今的多元化技术领域,包括无服务器计算、容器化、云原生技术等,并强调了安全与合规在云计算广泛采用中的重要性。同时,展望了云计算与AI、边缘计算等技术的融合,以及其对未来数字经济和社会发展的积极影响。

关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

一、云计算的起源和演进

file

1.1 早期计算模型

在探讨云计算的起源和演进之前,理解早期的计算模型对于构建全面的视角至关重要。早期计算模型的发展奠定了云计算的基础,为其演进提供了技术和理念的支撑。

1.1.1 集中式计算模型

在计算技术的早期阶段,主要采用的是集中式计算模型。在这个模型中,所有的计算任务都由中心计算机完成,而终端设备主要用于数据输入和输出。这种模型的优势是集中管理和高效利用资源,但也存在着灵活性差和扩展性有限的问题。

1.1.2 客户端-服务器计算模型

随着技术的进步,客户端-服务器(Client-Server, C/S)计算模型逐渐流行起来。在这个模型中,客户端负责用户界面和用户体验,而服务器负责数据处理和存储。C/S模型提高了系统的灵活性和扩展性,但随着用户数量的增加,服务器的负载也会随之增加,可能会导致性能瓶颈。

1.1.3 分布式计算模型

为了解决C/S模型中的性能瓶颈问题,分布式计算模型应运而生。分布式计算通过网络将计算任务分配到多台计算机上执行,每台计算机只负责执行一部分任务。这种模型不仅提高了系统的性能,而且增强了系统的可靠性和可扩展性。

1.1.4 网格计算与集群计算

网格计算和集群计算是分布式计算的两种具体实现。集群计算通常是将多台计算机连接在一起,作为一个整体来提供服务。而网格计算则是通过网络将多台计算机连接在一起,形成一个虚拟的超级计算机来执行大规模的计算任务。

以上几种计算模型的发展为云计算的出现铺垫了道路。云计算继承了分布式计算和集群计算的优势,同时通过虚拟化技术和自动化管理,进一步提高了系统的灵活性和可扩展性,为用户提供了更为高效和便捷的计算服务。通过回顾早期计算模型的发展,我们可以更好地理解云计算的技术基础和发展趋势。

1.2 虚拟化技术的崛起

虚拟化技术是云计算发展的重要基石,它改变了传统的硬件与软件的关系,为资源的高效利用和动态分配提供了可能。虚拟化技术的崛起可以从几个方面来展开。

1.2.1 虚拟化技术的基本概念

虚拟化技术允许在单一的物理硬件上运行多个操作系统或多个应用程序实例,每个实例都在一个独立、隔离的虚拟环境中运行。这种技术通过虚拟化层将硬件资源抽象化,使得软件不再直接依赖于特定的硬件平台。

1.2.2 虚拟化技术的种类

虚拟化技术主要可以分为几类:

  • 服务器虚拟化
    : 允许在一个物理服务器上运行多个独立的虚拟服务器实例。
  • 存储虚拟化
    : 将多个物理存储设备集中管理,呈现为一个统一的存储资源池。
  • 网络虚拟化
    : 将物理网络设备和连接抽象化,提供灵活的网络配置和管理。
  • 桌面虚拟化
    : 在服务器上运行多个桌面环境,用户可以通过网络访问自己的虚拟桌面。

1.2.3 虚拟化技术的优势

虚拟化技术带来了许多优势:

  • 资源优化
    : 通过资源共享和动态分配,提高了硬件资源的利用率。
  • 成本节约
    : 减少了物理硬件的需求,降低了能源和管理成本。
  • 灵活性和快速响应
    : 快速部署和迁移虚拟机,提高了IT服务的灵活性和响应速度。
  • 易于管理和维护
    : 集中管理和自动化运维,简化了系统管理和维护工作。

1.2.4 虚拟化技术的影响

虚拟化技术的崛起为云计算的发展提供了技术基础。通过虚拟化,云服务提供商可以在大规模的硬件基础设施上高效地运行和管理多租户的应用程序,为用户提供灵活、可扩展和低成本的计算服务。同时,虚拟化技术也催生了一系列新的计算模型和服务模式,如基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS),进一步推动了云计算技术的创新和应用。

通过对虚拟化技术的探讨,我们可以更好地理解云计算的技术基础和发展动力,为后续深入探讨云计算提供了坚实的基础。

1.3 云计算的初现

云计算并非突如其来的新技术,而是在长期的技术演进和市场需求推动下逐渐成形。它的初现标志着计算模型向更为集中、高效和服务化的方向发展。云计算的出现,不仅改变了企业的IT运营模式,也为个人用户提供了前所未有的便利。

1.3.1 云计算概念的提出

云计算这个概念最早可以追溯到2000年代初,当时网络的快速发展和虚拟化技术的成熟为云计算的出现提供了基础。2006年,亚马逊推出了Elastic Compute Cloud (EC2),这被认为是云计算商业服务的开始。

1.3.2 云计算模型的初步形成

随着亚马逊EC2的成功,其他技术公司也开始探索云计算模型。云计算最初的模型主要集中在基础设施即服务(IaaS)上,提供了基本的计算、存储和网络服务。随后,平台即服务(PaaS)和软件即服务(SaaS)也逐渐得到关注和发展。

1.3.3 云服务的初步应用

云计算初现时,主要应用于大型企业和技术先锋公司。它们利用云服务快速扩展业务、优化运营和降低成本。同时,云服务也开始向中小企业和个人用户开放,例如网络备份、文件分享和在线协作工具等。

1.3.4 行业认可与标准化

随着云计算模型的不断完善和应用的推广,行业组织和标准化机构也开始关注云计算。云计算相关的标准和协议开始逐渐形成,为云计算的进一步发展提供了良好的基础。

云计算的初现阶段,见证了其从概念到实践的转变。虽然在这个阶段,云计算的模型和服务还不完善,但它为后续的发展奠定了基础,显示了其对传统IT运营模式的颠覆性影响。同时,云计算也在逐渐得到行业和市场的认可,为其成为主流的计算模型打下了坚实的基础。

1.4 云计算模型的演变

云计算自其初现以来,经历了持续的技术创新和模型演进。从最初的基础设施即服务(IaaS)到平台即服务(PaaS)和软件即服务(SaaS),再到后来的容器服务和函数即服务(FaaS),云计算模型的演变反映了市场需求的变化和技术的进步。

1.4.1 从IaaS到PaaS和SaaS

  • 基础设施即服务(IaaS)
    : 云计算最初以IaaS模型为主,提供基本的计算、存储和网络资源,使用户能够灵活地部署和管理虚拟机。
  • 平台即服务(PaaS)
    : 随着技术的发展,PaaS模型逐渐兴起,提供了开发、运行和管理应用程序的完整平台,降低了开发和运营的难度。
  • 软件即服务(SaaS)
    : SaaS模型则进一步简化了用户的操作,直接提供可用的软件服务,无需用户关心底层的基础设施和平台。

1.4.2 容器服务的兴起

容器技术如Docker和Kubernetes的出现,推动了云计算模型向容器服务(CaaS)的演进。容器不仅提供了比虚拟机更高的资源利用率,还简化了应用的部署和管理。

1.4.3 函数即服务(FaaS)与无服务器计算

函数即服务(FaaS)是无服务器计算的一种实现,它允许开发者只关注代码逻辑,而无需管理底层的基础设施。通过FaaS,用户可以更加灵活、高效地开发和运行应用程序。

1.4.4 云原生的发展

云原生是云计算模型演进的重要方向,它强调在云环境中开发、部署和运行应用程序,利用云的弹性、可扩展性和自动化能力,以实现快速、稳定和持续的服务交付。

1.4.5 边缘计算与云计算的融合

随着IoT和5G技术的发展,边缘计算逐渐崭露头角。通过将计算任务分布在网络的边缘,边缘计算可以降低延迟、节省带宽,并提高数据的安全性。边缘计算和云计算的融合,将为未来的计算模型提供更多可能性。

云计算模型的演变,反映了技术和市场的动态变化。从最初的基础设施服务,到后来的无服务器计算和边缘计算,云计算不断地推动着IT行业的创新和变革,也展现了其持续的生命力和广泛的应用前景。通过深入理解云计算模型的演变,我们可以更好地把握云计算的发展趋势,为未来的技术探索和应用提供有价值的参考。


2. 当前的云计算技术与应用

file
云计算技术已经成为现代IT基础设施和服务的核心组成部分。其广泛的应用和不断的技术创新,为企业和个人用户提供了前所未有的便利和可能。

2.1 云服务模型

现代的云计算服务主要包括IaaS、PaaS和SaaS三个层次,各自为用户提供不同层次的服务和管理能力。

2.1.1 基础设施即服务 (IaaS)

IaaS提供基本的计算、存储和网络资源,使用户能够灵活地部署和管理虚拟机。它提供了高度的自由度和控制能力,但也要求用户具备一定的系统管理和运维能力。

2.1.2 平台即服务 (PaaS)

PaaS提供了开发、运行和管理应用程序的完整平台,包括操作系统、开发框架、数据库和中间件等。它简化了开发和运维的流程,使用户能够更专注于应用程序的开发和创新。

2.1.3 软件即服务 (SaaS)

SaaS直接为用户提供可用的软件服务,无需用户关心底层的基础设施和平台。它提供了丰富的应用程序和服务,覆盖了办公、通讯、财务、市场等多个领域。

2.2 云计算的核心技术

云计算的技术演进和创新是其成功的重要因素,下面几点是云计算核心技术的一些重要方面。

2.2.1 容器化与微服务

容器化技术如Docker,以及容器编排技术如Kubernetes,为微服务架构提供了基础。通过容器化,应用程序可以在独立、隔离的环境中运行,简化了部署和管理的过程。

2.2.2 无服务器计算

无服务器计算允许用户只关注应用程序的逻辑,而无需管理底层的基础设施。它提供了高度的灵活性和快速的部署能力,适用于事件驱动和短期运行的应用程序。

2.2.3 DevOps与持续集成/持续交付 (CI/CD)

DevOps文化和CI/CD流程是云计算环境中的重要实践。它们提高了开发和运维的效率,缩短了软件交付的周期,也提高了系统的稳定性和可靠性。

2.3 云计算应用领域

云计算的应用已经渗透到了各个行业和领域,为数字化转型和业务创新提供了强大的支持。

2.3.1 企业级应用

云计算为企业提供了高效、灵活和可靠的IT基础设施。通过云服务,企业可以快速扩展业务、优化运营和降低成本。

2.3.2 数据分析与人工智能

云计算提供了大规模的计算和存储能力,为数据分析和人工智能的应用提供了基础。通过云服务,企业和研究机构可以更快、更便捷地开展数据挖掘、机器学习和深度学习等项目。

2.3.3 行业解决方案

云服务提供商提供了一系列针对特定行业的解决方案,如医疗、金融、制造和教育等,帮助行业客户解决特定的业务和技术问题。

云计算技术与应用的丰富多样,展示了其在现代IT领域的核心地位和广泛影响。通过深入了解云计算的技术架构和应用实践,我们可以更好地把握其发展趋势,为未来的技术创新和应用提供有益的参考。


3. 云计算的安全与合规

云计算的安全与合规是推动其广泛采用的核心因素之一。它涵盖了数据保护、网络安全、合规性和标准等多个方面,为企业和个人用户提供了一个可信赖的云服务环境。

3.1 数据安全

数据是云计算环境中最宝贵的资产,其安全保护对于用户和服务提供商都至关重要。

3.1.1 数据加密

  • 传输加密
    : 在数据传输过程中,应用SSL/TLS等加密技术来保护数据的隐私和完整性。
  • 存储加密
    : 在数据存储时,应用AES等加密算法对数据进行加密保护,防止未授权访问。

3.1.2 数据脱敏

数据脱敏是一种保护敏感信息的技术,它通过对敏感数据进行替换、屏蔽或删除,以减少数据泄露的风险。

3.1.3 数据备份和恢复

定期的数据备份和快速的数据恢复是确保数据安全的重要措施。云服务提供商通常会提供灵活的备份和恢复解决方案。

3.2 网络安全

网络安全是云计算安全的另一个重要方面,它包括网络隔离、访问控制和监控等多个方面。

3.2.1 网络隔离

通过虚拟私有网络(VPN)和私有云等技术实现网络的隔离,以降低网络攻击的风险。

3.2.2 访问控制

实施严格的访问控制策略,确保只有授权用户和系统能够访问网络资源。

3.2.3 网络监控

实时的网络监控和日志分析,以及定期的安全审计和评估,是识别和预防网络安全威胁的重要手段。

3.3 合规性与标准

合规性和标准是推动云计算安全和可信赖的重要机制。

3.3.1 行业标准

遵守ISO 27001、PCI DSS等国际和行业安全标准,以确保云服务的安全和可信赖。

3.3.2 法律和法规

遵守GDPR、HIPAA等法律和法规的要求,以保护用户的隐私和数据安全。

3.3.3 第三方审计和认证

通过第三方的审计和认证,验证和证明云服务的安全和合规性。

云计算的安全与合规是一个多层次、多方面的问题。它不仅要求服务提供商提供安全可靠的技术和服务,也要求用户具备正确的安全意识和实践。通过深入理解云计算的安全和合规要求,我们可以更好地保护自己的数据和应用,同时也为云计算的长期发展和广泛采用提供了良好的基础。


4. 未来的云计算

file
随着技术的不断进步和市场需求的持续增长,云计算正朝着更高效、更智能、更多元化的方向发展。未来的云计算将不仅仅是IT基础设施的提供者,更将成为数字经济的重要支撑和创新的引擎。

4.1 云原生技术的普及

云原生是云计算发展的重要方向,它通过微服务、容器、Kubernetes等技术,实现了应用的快速开发、部署和运营。

4.1.1 举例:微服务架构

例如,大型互联网公司如Netflix和Twitter已经采用微服务架构来提升系统的可扩展性和敏捷性。

4.2 无服务器计算的成熟

无服务器计算将进一步简化开发和运维流程,使开发者能够更专注于应用逻辑。

4.2.1 举例:AWS Lambda

例如,AWS Lambda允许开发者只需上传代码,就可以构建高可用的应用程序,无需管理底层的服务器和基础设施。

4.3 混合云和多云环境

混合云和多云环境将成为企业的主流选择,以满足不同应用和数据的部署需求。

4.3.1 举例:Google Anthos

例如,Google Anthos提供了一个统一的平台,支持在私有云、Google Cloud和其他公有云上统一管理和运行应用程序。

4.4 边缘计算的集成

边缘计算将与云计算深度集成,形成一个统一的、分布式的计算网络。

4.4.1 举例:AWS Wavelength

例如,AWS Wavelength将云服务延伸到了网络的边缘,以实现更低的延迟和更高的带宽效率。

4.5 AI和ML的融合

云计算将与人工智能和机器学习深度融合,提供智能的数据处理和分析能力。

4.5.1 举例:Azure Machine Learning

例如,Azure Machine Learning提供了一个完整的、基于云的机器学习平台,支持模型的开发、训练和部署。

4.6 绿色环保的云计算

随着对环境问题的关注增加,绿色、低碳的云计算将得到更多的重视。

4.6.1 举例:Google的碳中和承诺

例如,Google承诺在2030年实现碳中和,其数据中心的能效也在不断提高,以降低碳排放。

未来的云计算将在技术创新和应用实践中持续发展和演变。它将为企业和个人用户提供更多的可能性,同时也将为社会的数字化转型和可持续发展提供重要的支持。通过深入了解云计算的未来发展,我们可以更好地把握技术的趋势和机遇,为未来的创新和应用做好充分的准备。


五、总结

经过对云计算的起源、发展、当前技术与应用、安全与合规以及未来发展的深入剖析,我们不难发现云计算已然成为现代数字技术的基石。它不仅仅是一种技术或服务模型,更是一种推动企业创新和社会进步的重要力量。

5.1 技术演进的持续推动

云计算从最初的虚拟化技术,到后来的IaaS、PaaS和SaaS模型,再到近年来的无服务器计算、容器化和云原生技术,显示了其持续的技术演进和创新能力。每一次技术的进步,都为用户提供了更高效、更灵活、更可靠的服务,同时也推动了新的应用模式和业务模型的产生。

5.2 安全与合规的重要性

随着云计算应用的不断扩展,安全与合规成为了不容忽视的问题。通过严格的安全措施、合规性要求和第三方审计,云计算正在努力构建一个可信赖的服务环境,以满足不同行业和地区的法律、法规和标准要求。

5.3 未来的云计算:智能、绿色、多元

未来的云计算将不仅仅是基础设施的提供者,更将成为智能技术、绿色环保和多元化应用的推动者。通过与AI、ML、边缘计算等技术的融合,云计算将为智能城市、智能制造、智能医疗等领域提供强大的支持。同时,绿色、低碳的云计算也将为可持续发展提供重要的技术基础。

5.4 结语

云计算不仅仅改变了我们的技术架构和服务模式,更改变了我们看待和利用技术的方式。它将继续以其独特的价值和广泛的应用,成为推动数字经济发展的重要引擎。在这个过程中,我们不仅将见证技术的持续创新,也将见证社会的持续进步和人类生活的持续改善。在未来的云计算世界中,每一个组织和个人都将有更多的可能和机会,以实现自身的价值和贡献社会的进步。

关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
如有帮助,请多关注
TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

本文档适用于github和gitlab

issue介绍

GitHub 中的 issue 功能是一种用于跟踪项目中任务、缺陷、功能请求和讨论的工具。通过 issue,项目成员可以提出问题、报告 bug、请求新功能,进行讨论,并且能够将 issue 与代码变更(比如 pull request)关联起来,以便更好地进行协作和项目管理。

以下是 GitHub 中 issue 功能的一些特点和用途:

  1. 创建和分配任务
    :可以使用 issue 来记录需要完成的任务,包括 bug 修复、功能开发等,然后对这些任务进行分配给团队成员。

  2. bug 追踪
    :开发人员和用户可以通过 issue 报告发现的 bug,然后进行跟踪和解决。

  3. 讨论和建议
    :项目成员可以在 issue 中进行讨论、提出新的想法和建议,从而促进项目的进步和改进。

  4. 标记和筛选
    :可以为 issue 添加标签(label)和里程碑(milestone),以便对任务进行分类和筛选。

  5. 关联代码变更
    :可以将 issue 与具体的代码变更(如 pull request)关联起来,以便更好地追踪代码变更背后的原因和需求。

  6. 自动关闭
    :通过在 commit message 或者 pull request 描述中加入特定的关键词和 issue 编号,可以实现当代码变更被合并后自动关闭相关的 issue。

总之,GitHub 中的 issue 功能为团队协作和项目管理提供了一个灵活而强大的工具,有助于提高项目的可见性、协作效率和质量管理水平。

issue实践

一 Issue label的定义
,可以按着类型对issue打标签,如文档、bug、新功能、测试用例、线上bug等等。

下面选自阿里higress的label定义规范

提交消息可以帮助审稿人更好地理解提交 PR 的目的是什么。它还可以帮助加快代码审查过程。我们鼓励贡献者使用显式的提交信息,而不是模糊的信息。一般来说,我们提倡以下提交消息类型:

  • docs: xxxx. For example, "docs: add docs about Higress cluster installation".
  • feature: xxxx.For example, "feature: use higress config instead of istio config".
  • bugfix: xxxx. For example, "bugfix: fix panic when input nil parameter".
  • refactor: xxxx. For example, "refactor: simplify to make codes more readable".
  • test: xxx. For example, "test: add unit test case for func InsertIntoArray".

其他可读和显式的表达方式。

二 根据bug或者需求建立issue
,支持markdown(md)语法,一直认为,md文件阅读起来对开发人员更加友好,简洁+清晰是我们喜欢的。

三 分支代码修改完成,提交时,commit 与issue关联,或者在申请RP/MR时,关联对应的issue id
,一般情况下,在团队开发时,为了保证代码的健壮与安全,我们会将分支代码推到远程,通过合并请求的方式,由多人进行分别审核,都审核通过,你的代码才能合并到目标分支,在合并请求描述时,可以添加issue的关联关系,如fix #1,表示修复的issue is为1的bug。

四 分支审核之后,合并到目标分支后,对应的issue将会自动关闭

五 commit合并后,关联issue自动全闭的关键字总结
,如果觉得关键字太多,你就使用1种也是可以的,如closes #1,表示合并到目标分支后,自动关闭issue 1。

  • Close, Closes, Closed, Closing, close, closes, closed, closing
  • Fix, Fixes, Fixed, Fixing, fix, fixes, fixed, fixing
  • Resolve, Resolves, Resolved, Resolving, resolve, resolves, resolved, resolving
  • Implement, Implements, Implemented, Implementing, implement, implements, implemented, implementing

理论与实战:一篇看懂Python词云


后宫王镇贴


前言:本文初编辑于2024年2月2日

该项目代码的仓库地址:
https://github.com/A-Piece-Of-Maple/WordCloud

CSDN:
https://blog.csdn.net/rvdgdsva

博客园:
https://www.cnblogs.com/hassle


总结

截至2024.2.2,想要学习词云,能够找到的文章大部分都是【基于文本生成的词云(使用ganerate)】,而不是【基于频率生成的词云(使用generate_from_frequencies)】,而且功能各有残缺,有些API还没有解释清楚,到头来还是要自己总结一下各个零散帖子的精华做一篇新人指导

本程序中文可用,按照词语频率分布,Python实现,调用jieba中文分词库和wordcloud库,支持停用词,支持自定义词组,支持自定义图片背景,支持自定义文字对应图片颜色


实现原理

导入一篇txt文档,使用jieba库对文档中的文字进行分词,计算各个词汇出现的频率,使用wordcloud库按照词汇频率的大小生成词云。

注意,不是使用
wordcloud.generate()
,这个方法没有按照词汇频率的方式实现词云

停用词

在讲区别之前,来看看停用词是什么。下面是不调用停用词的词云,观感很差对吧。

实现方式区别

【基于文本生成词云】:txt文章->调用
wordcloud.generate()
,内部调用停用词->保存图片

这种方法观感很差

【基于频率生成词云】:txt文章->分词->去空格空行->自己手动去除停用词->计算频率生成字典->调用
wordcloud.generate_from_frequencies()
->保存图

这种方法是理想方法

注意!
wordcloud.generate()
的参数是字符串,
wordcloud.generate_from_frequencies()
的参数是字典

你们会注意到,【基于频率生成词云】操作会麻烦一些,需要手动去除停用词。笨方法,但是有用。

看源码,对于
stopword
的操作,如果调用
WordCloud()
进行对象的创建,这个创建过程是没有办法处理字典元素的,很蠢

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:
    words = [word for word in words if word.lower() not in stopwords]
    word_counts, _ = process_tokens(words, self.normalize_plurals)


介绍库

Jieba库

jieba库是一个方便实用的中文文本分词工具,被广泛应用于中文文本处理和自然语言处理的各个领域。支持三种分词模式:精确模式、全模式和搜索引擎模式。本文使用全模式。

如果想对jieba库的分词模式有更深入的了解,可以看这篇:
jieba分词有哪些模式?

Wordcloud库

wordcloud是一个用于生成词云图的Python库。词云图是一种可视化方式,通过将文本中的单词按照频率和重要性进行布局,形成一个类似云朵的图形,其中频率高的单词通常显示得更大、更突出。


代码+解释

导入相关库

from os import path
import jieba
from collections import Counter
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
from PIL import Image

from os import path
: 导入
os
模块中的
path
子模块。
path
模块提供了与文件路径相关的功能,例如文件路径的拼接、判断路径是否存在等。

import jieba
: 导入
jieba
模块。
jieba
是一个中文分词库,用于将中文文本分割成单词或词语。

from collections import Counter
: 从
collections
模块中导入
Counter
类。
Counter
是一个用于计数的工具类,可以用于统计元素出现的次数。

from wordcloud import WordCloud, ImageColorGenerator
: 从
wordcloud
模块中导入
WordCloud

ImageColorGenerator
类。
WordCloud
是一个用于生成词云的工具,
ImageColorGenerator
用于生成基于图像颜色的词云。

import numpy as np
: 导入
numpy
模块,并将其命名为
np

numpy
是一个用于进行科学计算的库,提供了高效的数组操作和数值计算功能。

from PIL import Image
: 从
PIL
模块中导入
Image
类。
PIL
是Python Imaging Library的缩写,提供了图像处理的功能,
Image
类用于表示和操作图像。

路径设置

# 获取路径
d = path.dirname(__file__)

这行代码用于获取当前脚本文件的目录路径,并将其赋值给变量
d

# 下面四个自行变换
TXT_path = path.join(d, 'doc//浪潮之巅.txt')  # 文本
MASK_path = path.join(d, 'pic//雾雨魔理沙.png')  # 图片
STOPWORDS_path = path.join(d, r'doc//stopwords_cn.txt')  # 停用词
FONT_path = path.join(d, 'font//msyh.ttf')  # 字体
USERDICT_path = path.join(d, 'doc//自定义词组.txt')

这些行代码定义了几个文件的路径,包括文本文件路径
TXT_path
、图片文件路径
MASK_path
、停用词文件路径
STOPWORDS_path
、字体文件路径
FONT_path
和自定义词典文件路径
USERDICT_path
。这些文件路径可以根据实际情况进行修改。

# 找到txt文件
text = open(TXT_path, encoding='UTF-8').read()

这行代码打开指定路径的文本文件,并将文件内容读取到变量
text
中。

# 找到mask文件
mask = np.array(Image.open(MASK_path))

这行代码打开指定路径的图片文件,并将其转换为
numpy
数组,存储在变量
mask
中。这个图片将用作词云的形状。

# 导入自定义词典
jieba.load_userdict(USERDICT_path)

这行代码导入自定义词典,以便中文分词时使用。自定义词典包含一些用户指定的词语,可以影响分词结果。

准备工作

# 提取背景颜色
bg_color = ImageColorGenerator(mask, default_color=None)

这行代码根据图片的颜色生成背景颜色生成器,用于词云的颜色设置。

# 若是中文文本,则先进行分词操作
# cut_all是分词模式,True是全模式,False是精准模式,默认False
wordTemp = jieba.lcut(text, cut_all=True)

这行代码使用
jieba
对文本进行分词操作,将分词结果存储在变量
wordTemp
中。
cut_all=True
表示使用全模式,即将文本中的所有可能成词的部分都进行切分。

words = []
# 设定停用词表
stopword = [line.strip() for line in open(STOPWORDS_path, 'r', encoding='UTF-8').readlines()]
# 载入词
for w in wordTemp:
    if w not in stopword:
        words.append(w)

这部分代码对分词结果进行处理,首先定义一个空列表
words
。然后从停用词表中加载停用词,停用词表文件的路径由
STOPWORDS_path
指定。接下来,对每个分词结果进行检查,如果它不在停用词表中,就将其添加到
words
列表中。

# 去除空格
words = [item.strip() for item in words if item.strip() != '']

这行代码对
words
列表中的每个词去除首尾的空格。

# 去停用词之后的词频统计结果
frequency = dict(Counter(words))

这行代码使用
Counter
类对去除停用词之后的词列表进行词频统计,结果存储在字典
frequency
中。

生成词云

wc = WordCloud(background_color="white",  # 设置背景颜色
               max_words=500,  # 词云显示的最大词数
               mask=mask,  # 设置背景图片
               font_path=FONT_path, 这行代码创建了一个`WordCloud`对象`wc`,用于生成词云图。其中的
# 词频生成词云
wc.generate_from_frequencies(frequency)
# 文本生成词云
# wc.generate(text)

background_color
:词云的背景颜色,这里设置为白色。

max_words
:词云显示的最大词数,这里设置为500。

mask
:词云的背景图片,使用之前读取的图片数组
mask

font_path
:词云中使用的字体文件路径,由变量
FONT_path
指定。

这部分代码用于生成词云。根据词频统计结果
frequency
生成词云图,方法是调用
generate_from_frequencies
函数。另外,也可以根据文本生成词云,将注释的一行取消注释即可。

WordCloud参数详解看这里:
词云-WordCloud参数详解

wc.to_file('output.png')

这行代码将生成的词云图保存为名为
output.png
的文件。

综上所述,这段代码的功能是读取指定的文本文件并进行中文分词,然后根据分词结果生成词云图,并将生成的词云图保存为文件。

前言

大家好,这里是白泽。
《Go语言的100个错误以及如何避免》
是最近朋友推荐我阅读的书籍,我初步浏览之后,大为惊喜。就像这书中第一章的标题说到的:“
Go: Simple to learn but hard to master
”,整本书通过分析100个错误使用 Go 语言的场景,带你深入理解 Go 语言。

我的愿景是以这套文章,在保持权威性的基础上,脱离对原文的依赖,对这100个场景进行篇幅合适的中文讲解。所涉内容较多,总计约 8w 字,这是该系列的第三篇文章,对应书中第21-29个错误场景。