使用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.hqwc.cn/news/283482.html

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

相关文章

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

【算法Hot100系列】无重复字符的最长子串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C语言】基础刷题训练4(含全面分析和代码改进示例)

系列文章目录 提示&#xff1a;该系列文章暂未全部完成&#xff0c;暂时欠缺系列文章目录&#xff0c;见谅 基础刷题训练4&#xff08;含全面分析和代码改进示例&#xff09; 文章目录 系列文章目录前言题目链接(有需要的请自行链接做题)T1&#xff1a;思路1&#xff1a;思路2&…

【MySQL】:内置函数

内置函数 一.日期函数二.字符串函数三.数学函数和其他函数 一.日期函数 1.获得年月日 2.获取时分秒 3.获取时间戳 4.日期加日期 5.日期减日期 6.计算两个日期相差时间 二.字符串函数 1.获取编码 2.拼接字符串 3.判断子串 4.转大写 这些函数使用都非常简单&#xff0c;就不再举例…

初识迭代器(Iterator)——迭代器模式——迭代加深(后续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/ 迭代器&#xff08;Iterator&#xff09; 迭代器是一个非常有用的Python特性&#xff0c;它允许我们遍历一个容器&#xff08;如列表、元组、字典、集合等&#xff09;的元素。迭代器提供了一种方法&…

设计模式——代理模式(结构型)

引言 代理模式是一种结构型设计模式&#xff0c; 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff1a; 有这样一个消耗大量…

格密码:离散高斯与子高斯分布

高斯分布我们都很熟悉&#xff0c;但在格密码中会用到一种特殊的高斯分布&#xff0c;将其取名离散高斯分布&#xff08;discrete Gaussian)。 一. N维连续高斯分布 给定一个正整数n&#xff0c;代表维度。一个正实数&#xff0c;代表标准差&#xff08;高斯分布的标准差决定着…

LeetCode刷题--- 找出所有子集的异或总和再求和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

【TB作品】STM32 PWM之实现呼吸灯,STM32F103RCT6,晨启

文章目录 完整工程参考资料实验过程 实验任务&#xff1a; 1&#xff1a;实现PWM呼吸灯&#xff0c;定时器产生PWM&#xff0c;控制实验板上的LED灯亮灭&#xff1b; 2&#xff1a;通过任意两个按键切换PWM呼吸灯输出到两个不同的LED灯&#xff0c;实现亮灭效果&#xff1b; 3&…

YOLOv5改进 | 注意力篇 | RCS-OSA替换C3实现暴力涨点(减少通道的空间对象注意力机制)

一、本文介绍 本文给大家带来的改进机制是RCS-YOLO提出的RCS-OSA模块&#xff0c;其全称是"Reduced Channel Spatial Object Attention"&#xff0c;意即"减少通道的空间对象注意力"。这个模块的主要功能是通过减少特征图的通道数量&#xff0c;同时关注空…

小程序静默登录-登录拦截实现方案【全局loginPromis加页面拦截】

实现效果&#xff1a; 用户进入小程序访问所有页面运行onload、onShow、onReady函数时保证业务登录态是有效的 实现难点&#xff1a; 由于小程序的启动流程中&#xff0c;页面级和组件级的生命周期函数都不支持异步阻塞&#xff1b;因此会造成一个情况&#xff0c;app.onLau…

鸿蒙Web组件_学习

Web组件概述 Web组件用于在应用程序中显示Web页面内容&#xff0c;为开发者提供页面加载、页面交互、页面调试等能力。 页面加载&#xff1a;Web组件提供基础的前端页面加载的能力&#xff0c;包括加载网络页面、本地页面、Html格式文本数据。页面交互&#xff1a;Web组件提供…