使用VBA快速统计词组词频(多单词组合)(2/2)

实例需求:产品清单如A列所示,现在如下统计多单词组合词组词频。

在上一篇博客中《使用VBA快速统计词组词频(多单词组合)(1/2)》讲解了如何实现双词的词频统计。

本文将讲解如何实现3词的词频统计,掌握实现方法之后,可以很容易地将代码扩展到实现更多单词词频统计,实现的效果如下图所示。

在这里插入图片描述

Sub Count3Words()Dim oDic1 As Object, oDic2 As Object, oDic3 As ObjectDim aProd, vProd, aWord, vWord, vKey, arrDataDim i As Long, sKey As StringSet oDic1 = CreateObject("scripting.dictionary") ' product list by ONE wordSet oDic2 = CreateObject("scripting.dictionary") ' product list by TWO wordsSet oDic3 = CreateObject("scripting.dictionary") ' product list by THREE wordsarrData = Range("A1").CurrentRegion.ValueFor i = LBound(arrData) + 1 To UBound(arrData)aWord = Split(arrData(i, 1))If UBound(aWord) > 1 ThenFor Each vWord In aWordIf oDic1.exists(vWord) ThenoDic1(vWord) = oDic1(vWord) & "," & arrData(i, 1)ElseoDic1(vWord) = arrData(i, 1)End IfNextEnd IfNext iFor Each vKey In oDic1.keysaProd = Split(oDic1(vKey), ",")For Each vProd In aProdaWord = Split(vProd)For Each vWord In aWordIf vWord <> vKey ThensKey = SortWord(vKey & " " & vWord)If oDic2.exists(sKey) ThenIf InStr(1, oDic2(sKey), vProd, vbTextCompare) = 0 ThenoDic2(sKey) = oDic2(sKey) & "," & vProdEnd IfElseoDic2(sKey) = vProdEnd IfEnd IfNextNextNextFor Each vKey In oDic2.keysaProd = Split(oDic2(vKey), ",")For Each vProd In aProdaWord = Split(vProd)For Each vWord In aWordIf InStr(1, vKey, vWord, vbTextCompare) = 0 ThensKey = SortWord(vKey & " " & vWord)If oDic3.exists(sKey) ThenIf InStr(1, oDic3(sKey), vProd, vbTextCompare) = 0 ThenoDic3(sKey) = oDic3(sKey) & "," & vProdEnd IfElseoDic3(sKey) = vProdEnd IfEnd IfNextNextNextFor Each vKey In oDic3.keysoDic3(vKey) = UBound(Split(oDic3(vKey), ",")) + 1NextRange("D:E").ClearRange("D1:E1").Value = Array("Word Pair", "Times")Range("D2").Resize(oDic3.Count, 1) = Application.Transpose(oDic3.keys)Range("E2").Resize(oDic3.Count, 1) = Application.Transpose(oDic3.items)
End Sub
Function SortWord(ByVal sText As String) As StringDim i As Long, j As Long, aWord, sTmp As StringaWord = Split(sText)If UBound(aWord) = 0 ThenSortWord = sTextElseFor i = LBound(aWord) To UBound(aWord) - 1For j = i + 1 To UBound(aWord)If aWord(i) > aWord(j) ThensTmp = aWord(i): aWord(i) = aWord(j): aWord(j) = sTmpEnd IfNextNextSortWord = Join(aWord)End If
End Function

【代码解析】
对于代码中和 上一篇博客 相同的部分,此处就不做赘述。
第9~20行代码将根据每个单词(产品名称拆分)合并产品名称清单,保存在oDic1
第21~38行代码将根据双词合并产品名称清单,保存在oDic2

此处实现逻辑比双词要更复杂,例如:对于两个单词sWord1和sWord2,只有如下两种两种组合方式:

  • sWord1 sWord2
  • sWord2 sWord1

但是对于3个单词sWord1、sWord2和sWord3,有如下6种组合方式,但是这些组合包含的单词相同的,其词频统计的结果也是相同的,为了避免统计结果中的重复,需要对于单词组合进行排序,也就是说使用排序后的单词组合作为字典对象的键,确保单词组合的唯一性,如果使用升序排列,那么将采用第一种组合方法作为键。其中排序由自定义函数SortWord实现。

  • sWord1 sWord2 sWord3
  • sWord1 sWord3 sWord3
  • sWord2 sWord1 sWord3
  • sWord2 sWord3 sWord1
  • sWord3 sWord1 sWord2
  • sWord3 sWord2 sWord1

第39~56行代码将根据3词合并产品名称清单,保存在oDic3
第44行代码判断单词是否存在与vKey中,避免3个单词组合中出现重复的单词。
第45行代码调用自定义函数将3个单词进行排序生成字典的键。
第46~52行代码更新oDic3中的键值对。
第57~59行代码根据字典对象中产品名称清单,统计3词组合的词频。
第60~63行代码将统计结果输出到工作表中。

第65~80行代码为自定义函数SortWord
第67行代码使用空格作为分隔符将参数sText拆分为数组。
如果拆分后数组只有单个元素,说明sText不包含空格,那么无需进行排序,第68行代码将sText设置为函数返回值。
第71~77行代码使用冒泡法进行排序。
第74行代码实现数据组元素交换。
第78行代码将排序的数组元素合并为一个字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端Vue必问面试题

1,Vue3.0 为什么要使用 proxy 在 Vue2 中, 0bject.defineProperty 会改变原始数据,而 Proxy 是创建对象的虚拟表示,并提供 set 、get 和 deleteProperty 等处理器,这些处理器可在访问或修改原始对象上的属性时进行拦截,有以下特点∶ 不需用使用 Vue. s e t 或 V u e . s…

硬件编程语言

硬件画板说白了就是电气的连接&#xff0c;相较于PCB连接在2.5D中完成&#xff08;有些大佬们是直接3D设计&#xff09;考虑的东西会更多&#xff0c;原理图的抽象使得硬件思路更加简单。 就算是这样&#xff0c; 增加到上千门器件后的大工程是非常难以进行的编辑和检查的&…

Mac如何安装stable diffusion

今天跟大家一起在Mac电脑上安装下stable diffusion&#xff0c;在midjourney等模型收费的情况下如何用自己的电脑算力用上免费的画图大模型呢&#xff1f;来吧一起实操起来 一、安装homebrew 官网地址&#xff1a;Homebrew — The Missing Package Manager for macOS (or Lin…

认识Trino

认识Trino 一、Trino二、结构三、集群四、coordinator五、Worker六、数据源七、连接器八、目录九、架构十、表十一、查询执行模型十二、陈述十三、查询十四、阶段十五、任务十六、分隔十七、Driver十八、Operator十九、Exchange 一、Trino Trino&#xff08;前身为PrestoSQL&a…

conda和pip配置国内镜像源

1、conda配置镜像源&#xff1a; 使用conda进行安装时&#xff0c;访问的是国外的网络&#xff0c;所以下载和安装包时会特别慢。我们需要更换到国内镜像源地址&#xff0c;这里我更换到国内的清华大学地址。&#xff08;永久添加镜像&#xff09; Windows和Linux 对于conda修…

SQL进阶理论篇(十):数据库中的锁

文章目录 简介按照锁的粒度进行划分从数据库管理的角度进行划分从程序员的角度进行划分为什么共享锁会发生死锁&#xff1f;参考文献 简介 索引和锁&#xff0c;是数据库中的两个核心知识点。 索引的相关知识点&#xff0c;在之前的几章里我们已经介绍的差不多了。接下来我们…

[pasecactf_2019]flask_ssti proc ssti config

其实这个很简单 Linux的/proc/self/学习-CSDN博客 首先ssti 直接fenjing一把锁了 这里被加密后 存储在 config中了 然后我们去config中查看即可 {{config}} 可以获取到flag的值 -M7\x10wd94\x02!-\x0eL\x0c;\x07(DKO\r\x17!2R4\x02\rO\x0bsT#-\x1cZ\x1dG然后就可以写代码解…

MNIST内置手写数字数据集的实现

torchvision库 torchivision库是PyTorch中用来处理图像和视频的一个辅助库&#xff0c;接下来我们就会使用torchvision库加载内置的数据集进行分类模型的演示 为了统一数据加载和处理代码&#xff0c;PyTorch提供了两个类用于处理数据加载&#xff0c;他们分别是torch.utils.…

leetcode:641. 设计循环双端队列

设计循环双端队列 实现 MyCircularDeque 类: MyCircularDeque(int k) &#xff1a;构造函数,双端队列最大为 k 。 boolean insertFront()&#xff1a;将一个元素添加到双端队列头部。 如果操作成功返回 true &#xff0c;否则返回 false 。 boolean insertLast() &#xff1a;…

机器视觉技术与应用实战(开运算、闭运算、细化)

开运算和闭运算的基础是膨胀和腐蚀&#xff0c;可以在看本文章前先阅读这篇文章机器视觉技术与应用实战&#xff08;Chapter Two-04&#xff09;-CSDN博客 开运算&#xff1a;先腐蚀后膨胀。开运算可以使图像的轮廓变得光滑&#xff0c;具有断开狭窄的间断和消除细小突出物的作…

饥荒Mod 开发(十五):小地图显示物品

饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 本篇源码 饥荒中按下Tab键可以显示地图&#xff0c;刚开始进入游戏的时候地图是未探索状态&#xff0c;所以我们并不知道地图上面的物品分布情况。并且地图上只会显示很少一部分的物品&#xff0c;比如树枝&#xff0c;草&#xf…

C++二维数组(4)

蛇形遍历 题目描述&#xff1a;用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。 蛇形填充方法为&#xff1a; 对于每一条左下-右上的斜线&#xff0c;从左上到右下依次编号1,2,...,2n-1&#xff1b;按编号从小到大的顺序&#xff0c;将数字从小到大填入各 条斜线&…

【Linux】操作文件和目录

简介 常见的一些对文件和目录操作的命令如下&#xff1a; cp&#xff1a;复制文件和目录。mv&#xff1a;移动/重命名文件和目录。mkdir&#xff1a;创建目录。rm&#xff1a;删除文件和目录。ln&#xff1a;创建硬链接和符号链接。 用图形文件管理器来完成一些由这些命令执…

Debezium发布历史11

原文地址&#xff1a; https://debezium.io/blog/2016/10/25/Debezium-0-3-4-Released/ Debezium 0.3.4 发布 2016 年 10 月 25 日 作者&#xff1a; Randall Hauch 发布 mysql docker 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&…

链表基础知识(二、双向链表头插、尾插、头删、尾删、查找、删除、插入)

目录 一、双向链表的概念 二、 双向链表的优缺点分析​与对比 2.1双向链表特点&#xff1a; 2.2双链表的优劣&#xff1a; 2.3循环链表的优劣 2.4 顺序表和双向链表的优缺点分析​ 三、带头双向循环链表增删改查实现 3.1SList.c 3.2创建一个新节点、头节点 3.3头插 3.…

C# WPF上位机开发(知识产权ip保护)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 上位机软件如果是和硬件模块搭配开发&#xff0c;这个时候大部分上位机基本上都是白送的&#xff0c;不会收取相关的费用。但是&#xff0c;如果上…

计算机网络基础——以太网类型,常见标准和架构

一、标准以太网 标准以太网&#xff08;10Mbit/s&#xff09;通常只定位在网络的接入层&#xff0c;新一代多媒体、影像和数据库产品很容易将10Mbit/s运行的以太网的带宽吞没。10Mbit/s 的以太网可以实现100m距离的连接。 二、快速以太网 数据传输速率为100Mbps 的快速以太网…

提示工程指南

大家好,欢迎来到本课程。在接下来的时间里,我们将一起学习如何使用 OpenAI 的提示工程指南来更有效地使用大语言模型。 目录 什么是提示工程?提示工程的原则提示工程的技巧提示工程的最佳实践提示工程的常见问题什么是提示工程? 提示工程是指设计和编写提示语以获得所需输…

项目遇到Bug如何解决(思路)

找到Bug,分析Bug,解决Bug 语法错误 ESLint:代码规则约束检测的操作&#xff0c;利用ESLint可以更好的帮助我们避免一些语法的错误信息&#xff0c;例如括号是不是匹配等。Prettier:代码格式化工具进行语法的错误和纠正&#xff0c;当出现语法错误的时候&#xff0c;代码格式化…

chrome升级后,调试vue在控制台输出总是显示cjs.js

当前chrome版本120.0.6099.72 在vue中使用console.log输出时&#xff0c;总是显示cjs.js多少多少行&#xff0c;不能显示源文件名及行数 【解决方案】 打开控制台的设置 左侧找到“Ignore List”&#xff0c;取消勾选"enable Lgnore Listing"&#xff0c;并重启chr…