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

实例需求:产品清单如A列所示,现在如下统计词组词频。想必各位小伙伴都指定如何使用字典对象实现去重,进而实现单个单词的词频统计。

但是统计词组词频就没有那么简单了,为了便于演示,此处的词组只限于两个单词的组合。提到词组,很多时候大家先想到的是如何将获取全部的组合,例如n个无重复单词,可以产生的无重复词组个数为C(n,2) ,但是在本示例中并不需要获取这些全部组合,实现思路自然也就不同了。

在这里插入图片描述

示例代码如下。

Sub CountWorPair()Dim oDic1 As Object, oDic2 As Object, oDic3 As ObjectDim aProd, vProd, aWord, vWord, vKey, arrDataDim sKey1 As String, sKey2 As StringDim i As Long, j As Long, k As LongSet oDic1 = CreateObject("scripting.dictionary")Set oDic2 = CreateObject("scripting.dictionary")Set oDic3 = CreateObject("scripting.dictionary")arrData = Range("A1").CurrentRegion.ValueFor i = LBound(arrData) + 1 To UBound(arrData)aWord = Split(arrData(i, 1))For Each vWord In aWordIf oDic1.exists(vWord) ThenoDic1(vWord) = oDic1(vWord) & "," & arrData(i, 1)ElseoDic1(vWord) = arrData(i, 1)End IfNextNext iFor Each vKey In oDic1.keysaProd = Split(oDic1(vKey), ",")oDic2.RemoveAllFor Each vProd In aProdaWord = Split(vProd)For Each vWord In aWordIf oDic2.exists(vWord) ThenoDic2(vWord) = oDic2(vWord) + 1ElseoDic2(vWord) = 1End IfNextNextFor Each vWord In oDic2.keysIf vWord <> vKey ThensKey1 = vKey & " " & vWordsKey2 = vWord & " " & vKeyIf oDic3.exists(sKey1) ThenIf oDic2(vWord) > oDic3(sKey1) Then oDic3(sKey1) = oDic2(vWord)ElseIf oDic3.exists(sKey2) ThenIf oDic2(vWord) > oDic3(sKey2) Then oDic3(sKey2) = oDic2(vWord)ElseoDic3(sKey1) = oDic2(vWord)End IfEnd IfNextNextRange("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

【代码解析】
第6~7行代码创建字典对象。

  • oDic1用于按照单词合并产品名称,即字典键为单词,字典值为逗号连接的产品名称。
  • oDic2用于统计每个单词的出现次数,注意并非全部产品的词频。
  • oDic3用于统计词组(两个单词组合)的词频。
    第9行代码将数据表加载到数组中。
    第10~19行代码循环处理每行数据,按照单词合并产品名称,oDic1("Red")的值为所有包含Red的产品名称。
    第14行代码合并产品名称。
    第16行代码为字典对象添加键值。
    第20~42行代码循环遍历oDic1中的键,最终实现统计词组词频。
    第21行代码读取oDic1的值(逗号连接的产品名称),并按照逗号拆分为产品列表(数组)。
    第22行代码清空oDic2对象。
    第23~32行代码循环变量产品列表aProd。
    第24行代码将产品列表拆分为单词列表aWord。
    第25~31行代码统计单词词频。例如处理oDic1("Red")时,将统计包含Red的产品名称中,每个单词出现的次数。
    第33~41行代码循环遍历oDic2中的键,统计词组词频。
    第34行代码判断oDic1键是否与oDic2键相同,由于产品名称中不会出现重复的单词,因此Red Red属于无效的词组。
    第35~36行代码将两个键值按照不同的次序进行组合。
    这里是本示例中的小技巧,由于Red CarCar Red实际上属于同一个词组,二者的词频也移动相同,因此在输出结果中只需要保留一个即可,所以此处需要将创建两个变量sKey1和sKey2。
    第37行代码判断oDic3中是否已经存在sKey1和sKey2,如果不存在,那么第38行代码在oDic3中添加键值。

这个逻辑看起来有些复杂,下面举例说明。
以词组Red Car为例,oDic1("Red")的值为Red Car,Red Kia Car,经过拆分统计oDic2("Car")的值为2,即词频为2,最终oDic3("Red Car")的值2,当然结果字典中也可能是oDic3("Car Red")

第43行代码清空目标单元格区域。
第44行代码设置表格标题。
第45行代码将词组(oDic3的键)写入D列。
第45行代码将词频(oDic3的值)写入E列。

微软文档:

Dictionary object

Range.Resize property (Excel)

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

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

相关文章

Excel 表列序号

题目链接 Excel 表列序号 题目描述 注意点 columnTitle 仅由大写英文组成1 < columnTitle.length < 7 解答思路 对于"CAB"&#xff0c;计算其序列号的思路&#xff1a;字母B的贡献值为2&#xff0c;字母A的贡献值为1 * 26&#xff0c;字母C的贡献值为3 * …

HarmonyOS学习 第1节 DevEco Studio配置

俗话说的好&#xff0c;工欲善其事,必先利其器。我们先下载官方的开发工具DevEco Studio. 下载完成后&#xff0c;进行安装。 双击DevEco Studio&#xff0c;点击Next按照指引完成安装 重新启动DevEco&#xff0c;点击 Agree 进入环境配置&#xff0c;安装Node.js和ohpm 点击Ne…

【开源】基于Vue+SpringBoot的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

妙手ERP功能更新:TikTok支持打印10×10面单、Ozon支持设置最低售价、超过90天的Shopee订单买家信息不再显示......

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 自定义平台SKU时&#xff0c;连接符支持为空或可输入其他符号&#xff08;不支持输入数字、emoji、文字&#xff09; Ozon - 支…

拦截 open调用 (进程白名单,文件白名单)

拦截 open 文章目录 拦截 open第一个需求文件结构进程白名单文件白名单 测试代码第一个版本版本二代码演示 增加一个日志记录代码解释 gcc -shared -fPIC -o libintercept.so intercept.c -ldlLD_PRELOAD./libintercept.so ./processA在Linux中&#xff0c;我们可以使用LD_PREL…

艺术画廊展厅网站制作的效果如何

艺术展厅往往有很多人前往&#xff0c;在主要城市有不少画廊&#xff0c;对经营者来说&#xff0c;不同于销售行业&#xff0c;其更多的是打造品牌吸引用户前来或合作等形式&#xff0c;而由于行业特殊性&#xff0c;需要准属性用户才会前往。 因此在品牌打造及信息承载宣传方…

动手学深度学习笔记

1. 深度学习基础与MLP 1.1 框架&#xff1a; 线性回归&#xff1b; Softmax回归&#xff08;实际上用于分类问题&#xff09;&#xff1b; 感知机与多层感知机&#xff1b; 模型选择&#xff1b; 权重衰退&#xff08;weight decay&#xff09;&#xff1b; 丢弃法&…

Facebook广告报告指标CPC

在Facebook广告中&#xff0c;CPC可以作为一个关键指标来评估广告效果和投资回报。较低的CPC意味着广告主能以更低的价格获得更多的点击量&#xff0c;从而降低广告投放成本。而较高的CPC可能暗示着广告主需要更大的预算才能获得相同数量的点击。本文小编将讲讲Facebook广告报告…

如何做好口译服务,同传和交传哪个服务好

随着中国经济的蓬勃发展和综合实力的不断增强&#xff0c;中国与世界各国的交流也日益频繁。口译作为对外交流的桥梁与纽带&#xff0c;需求量与日俱增&#xff0c;其重要性不言而喻。那么&#xff0c;如何做好口译服务呢&#xff1f;是同传还是交传更好呢&#xff1f; 业内专家…

企业贷款行业如何获客?

贷款行业是指提供贷款服务的行业&#xff0c;包括各种类型的金融机构&#xff0c;如银行、信用社、贷款公司、保险公司等。这些机构通过向个人或企业提供贷款服务&#xff0c;满足其资金需求。 主要分为个人贷款和企业贷款。个人贷款指银行或其他金融机构向符合贷款条件的自然…

redis-学习笔记(hash)

Redis 自身已经是 键值对 结构了 Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成后, 到了 value 这一层, 还可以用 哈希类型 来组织 (简单的说就是哈希里面套哈希 [数组里面套数组 -> 二维数组] ) [ field value ] hset key field value [ field va…

Python接口自动化测试数据和代码分离解析

common中存放的是整个项目中公共使用的封装方法 从工程目录上可以看到区分 datas中专门存放测试数据(yml文件) cases中专门集中存放测试用例 ... 数据分离的第一步先找到工程项目路径 1 2 3 4 5 6 7 8 9 10 11 12 # -*- encoding: utf-8 -*- """ __Software…