使用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,一经查实,立即删除!

相关文章

Mac如何安装stable diffusion

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

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.…

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

开运算和闭运算的基础是膨胀和腐蚀&#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;将数字从小到大填入各 条斜线&…

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

目录 一、双向链表的概念 二、 双向链表的优缺点分析​与对比 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;如果上…

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

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

【Jmeter】Jmeter基础6-Jmeter元件介绍之前置处理器

前置处理器主要用于处理请求前的准备工作&#xff0c;如&#xff1a;参数、环境变量的设置等。 2.6.1、JSR223预处理程序 作用&#xff1a;请求前的准备工作。 参数说明&#xff1a; 语言&#xff1a;开发脚本所使用的语言&#xff0c;可通过下拉列表选择。参数&#xff1a;传…

Linux实操——安装Mysql

安装Mysql 一、检查是否已经安装了mariadb数据库,并卸载二、下载mysql包&#xff0c;并通过ftp上传到服务器三、解压安装包四、创建数据存储文件夹五、创建执行mysqld命令的用户&#xff0c;并初始化mysql六、启用传输安全七、启动mysql&#xff0c;验证是否安装成功 总结 博主…

【Hive】——DDL(DATABASE)

1 概述 2 创建数据库 create database if not exists test_database comment "this is my first db" with dbproperties (createdByAllen);3 描述数据库信息 describe 可以简写为desc extended 可以展示更多信息 describe database test_database; describe databa…

技术分享 | 接口测试价值与体系

如果把测试简单分为两类&#xff0c;那么就是客户端测试和服务端测试。移动端的测试包括 UI 测试&#xff0c;兼容性测试等&#xff0c;服务端测试包括接口测试。接口测试检查数据的交换、传递和控制管理过程。它绕过了客户端&#xff0c;直接对服务端进行测试。 接口测试的价值…

链表之带头双向循环链表(C语言版)

我们之前已经介绍过链表的知识了&#xff0c;这里我们直接开始实现带头双向循环链表 数据结构之单链表&#xff08;不带头单向非循环链表&#xff09;-CSDN博客 第一步&#xff1a;定义结构体 //定义结构体 typedef int SLTDateType; typedef struct Listnode {SLTDateType d…

字符设备驱动框架的编写

一. 简介 我们在学习裸机或者 STM32 的时候关于驱动的开发就是初始化相应的外设寄存器&#xff0c;在 Linux 驱动开发中&#xff0c;肯定也是要初始化相应的外设寄存器。 只是在 Linux 驱动开发中&#xff0c; 我们需要按照其规定的框架来编写驱动&#xff0c;所以说学 …

【HTML5、CSS3】新增特性总结!

文章目录 23 HTML5 新增特性23.1 语义化标签23.2 多媒体标签23.2.1 视频<video>标签23.2.2 音频<audio>标签 23.3 input属性值23.4 表单属性 24 CSS3 新增特性24.1 属性选择器24.2 结构伪类选择器24.2.1 选择第n个元素24.2.2 常用的6个结构伪类选择器 24.3 伪元素选…

如何用Python向图像中加入噪声

我们在做机器视觉项目的过程中&#xff0c;有的时候需要向图像中加入噪声。Pytorch本身不支持类似的功能&#xff0c;如果自己写的话&#xff0c;不但麻烦&#xff0c;而且容易出错。好在skimage支持这个功能。代码如下&#xff1a; import skimage import matplotlib.pyplot …

抚琴成一快-布鲁斯

布鲁斯 0.理论1.音阶1.大调布鲁斯音阶2.小调布鲁斯音阶 1.基础1.shuffle节奏制音2.十二小节3.和弦4.小调五声音阶 2.演奏手法1.Lamp and Lamp1.基础和声进行2.进阶和声进行1.quick change2. call and respond:3.回旋句 2.Box1.基础和声进行2.进阶和声进行 3.Boogie1.基础节奏2.…

【教学类-06-19】20231217 (按“列”正序题)X-Y之间“加法题+题”(1页最多0-13。填满115空格)

作品展示&#xff1a;按列排序&#xff0c;从小到大正序&#xff08;没有大量空格&#xff09; 1.会有空格做分割线&#xff0c;上面部分是所有的小到大正序加法&#xff0c;下面的部分就是正序题目的不重复随机抽取题目&#xff08;乱序题&#xff09; 2、包含分割空格&…