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

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

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

在这里插入图片描述

示例代码如下。

Sub CountWorPair()
    Dim oDic1 As Object, oDic2 As Object, oDic3 As Object
    Dim aProd, vProd, aWord, vWord, vKey, arrData
    Dim sKey1 As String, sKey2 As String
    Dim i As Long, j As Long, k As Long
    Set oDic1 = CreateObject("scripting.dictionary")
    Set oDic2 = CreateObject("scripting.dictionary")
    Set oDic3 = CreateObject("scripting.dictionary")
    arrData = Range("A1").CurrentRegion.Value
    For i = LBound(arrData) + 1 To UBound(arrData)
        aWord = Split(arrData(i, 1))
        For Each vWord In aWord
            If oDic1.exists(vWord) Then
                oDic1(vWord) = oDic1(vWord) & "," & arrData(i, 1)
            Else
                oDic1(vWord) = arrData(i, 1)
            End If
        Next
    Next i
    For Each vKey In oDic1.keys
        aProd = Split(oDic1(vKey), ",")
        oDic2.RemoveAll
        For Each vProd In aProd
            aWord = Split(vProd)
            For Each vWord In aWord
                If oDic2.exists(vWord) Then
                    oDic2(vWord) = oDic2(vWord) + 1
                Else
                    oDic2(vWord) = 1
                End If
            Next
        Next
        For Each vWord In oDic2.keys
            If vWord <> vKey Then
                sKey1 = vKey & " " & vWord
                sKey2 = vWord & " " & vKey
                If oDic3.exists(sKey1) Then
                    If oDic2(vWord) > oDic3(sKey1) Then oDic3(sKey1) = oDic2(vWord)
                ElseIf oDic3.exists(sKey2) Then
                    If oDic2(vWord) > oDic3(sKey2) Then oDic3(sKey2) = oDic2(vWord)
                Else
                    oDic3(sKey1) = oDic2(vWord)
                End If
            End If
        Next
    Next
    Range("D:E").Clear
    Range("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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云Arthas使用——在日志没有输出异常情况下,如何进行线上bug定位 stack命令 和 trace命令

前言 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类…

深入理解:指针变量的解引用 与 加法运算

前言 指针变量的解引用和加法运算是非常高频的考点&#xff0c;也是难点&#xff0c;因为对初学者的不友好&#xff0c;这就导致了各大考试都很喜欢在这里出题&#xff0c;通常会伴随着强制类型转换、二维数组、数组指针等一起考查大家对指针的理解。但是不要怕&#xff0c;也许…

托盘四向穿梭车自动化密集库供应|单机智能向系统智能跨越的HEGERLS托盘四向车系统

随着物流产业的迅猛发展&#xff0c;托盘四向穿梭式自动化密集仓储系统可认为是在穿梭车货架系统基础上提出的一种新仓储概念。托盘四向穿梭式立体库因其在流通仓储体系中所具有的高效密集存储功能优势、运作成本优势与系统化智能化管理优势&#xff0c;已发展为仓储物流的主流…

契约锁2023年伙伴大会连下58城,顺利收官!

10月以来&#xff0c;携手全国58城的IT伙伴&#xff0c;共同探讨电子签章海量市场下的发展机遇以及合作模式、交流分享电子签章海量市场机遇、体验电子签章产品在组织数字化建设中的应用价值。 以简单易用、方便实施的产品&#xff0c;和开放共享政策&#xff0c;广结伙伴、共建…

常用汇编指令集

寄存器 如上是OD展示的寄存器&#xff0c;逐条说明常用的寄存器和标志位含义&#xff1a; EIP&#xff1a;寄存器指向即将要执行的指令的地址&#xff08;EIP中的地址&#xff0c;就是下一步要执行指令的地址&#xff09; ESP&#xff1a;里面的内容永远指向堆栈的最顶端 EAX&…

浪涌保护器参数指南:浪涌保护器行业选型方案

浪涌保护器&#xff08;SPD&#xff09;是一种用于限制瞬态过电压和泄放浪涌电流的器件&#xff0c;可有效降低电子设备在雷击、电源故障等情况下受到的损害。其主要作用是当系统发生浪涌时&#xff0c;将过电压、过电流泄放到大地&#xff0c;从而保护设备和人身安全。然而浪涌…

微表情检测(一)----LGAttNet论文总结

LGAttNet: Automatic microexpression detection using dualstream local and global attentions Abstract 微表情识别之前需要先进行微表情的检测。我们提出了一种基于双重注意力网络的微表情检测架构&#xff0c;称为LGAttNet。LGAttNet是第一个利用与二维卷积神经网络组合的…

虚拟机-桥接模式连接

文章目录 1.查看宿主机再用的IP信息2.桥接模式-虚拟机设置VMware设置虚拟机设置重启网络服务 1.查看宿主机再用的IP信息 ipconfig /all 注&#xff1a; 在虚拟机中要设置同网段的ip设置同一个子网掩码设置同一个网关设置同一个DNS服务器 2.桥接模式-虚拟机设置 VMware设置 虚…

从零开始学习 JS APL(五):完整指南和实例解析

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习内容&#xff1a; Window对象&#xff1a; 定时器-延时函数&#xff1a; JS 执行机制&#xff1a; location对象&#xff1a; 本地存储&#xff1a; 本地存储分类- localStorage&#xff1a…

代码签名的工作原理

代码签名的基础是PKI安全体系。代码签名证书由签名证书私钥和公钥证书两部分组成。私钥用于代码的签名&#xff0c;公钥用于私钥签名的验证和证书持有者的身份识别。 1. 发布者从CA机构&#xff08;如JoySSL&#xff09;申请数字证书&#xff1b; 2. 发布者开发出代码&#x…

物联网主机E6000:工业领域的数据融合与5G未来

一、物联网的崛起 在科技日新月异的今天&#xff0c;物联网已经成为了我们生活中不可或缺的一部分。从智能家居到工业自动化&#xff0c;物联网的应用已经深入到我们生活的各个角落。而在这个大背景下&#xff0c;物联网主机的出现&#xff0c;更是为我们的生活带来了前所未有的…

3、RocketMQ源码分析(三)

RocketMQ源码-NameServer架构设计及启动流程 本文我们来分析NameServer相关代码&#xff0c;在正式分析源码前&#xff0c;我们先来回忆下NameServer的功能&#xff1a; NameServer是一个非常简单的Topic路由注册中心&#xff0c;其角色类似Dubbo中的zookeeper&#xff0c;支…

一文详解集合竞价,建议收藏!

集合竞价是指对在规定的一段时间内接受买卖申报一次性集中撮合的竞价方式。沪深市场9:15-9:25及14:57-15:00为集合竞价的时间段。集合竞价的所有交易以同一个价格成交。集合竞价的成交价确定原则是&#xff1a; 1、可实现最大成交量的价格&#xff1b; 2、高于该价格的买入申…

图表控件LightningChart .NET中文教程 - 如何创建WPF 2D热图?(二)

LightningChart.NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学…

评论功能实现方案

构建高效且安全的评论功能&#xff1a;实现方案探讨。 1、分析 我们以b站的评论为例&#xff0c;用下图来解释我们评论的分级。 我们可以抽出存储评论的数据表属性 评论id父级id评论作者id被回复用户ID评论帖子ID评论内容创建时间 可以设计如下的数据表 其中pid表示父id。 …

如何销售汽车之 汽车销售技巧和话术

如何销售汽车之 汽车销售技巧和话术 当前&#xff0c;汽车销售市场的竞争日益激烈&#xff0c;消费者对汽车的需求和要求也越来越高。但是市场竞争车型也非常多&#xff0c;如何更好的做好销售业绩突破&#xff0c;提高汽车销量&#xff0c;创造汽车销售佳绩&#xff0c;就需要…

【JUC】二十一、CAS比较并交换

文章目录 1、初体验2、CAS概述3、Unsafe类4、Unsafe汇编5、原子引用AutomicReference6、手写自旋锁SpinLock7、CAS的两大缺点8、AtomicStampedReference类解决ABA问题 1、初体验 没有CAS时&#xff0c;多线程环境下不使用原子类保证线程安全&#xff0c;比如i&#xff0c;可以…

java学习part35List

155-集合框架-List接口常用方法的测试_哔哩哔哩_bilibili 1.List接口常用方法 2.不同实现类

Chart 3 OpenCL on Snapdragon

文章目录 前言3.1、Adreno GPU3.2、Adreno GPU 架构3.2.1、Adreno硬件架构在OpenCL方面的高层视图3.2.2、Waves and fibers3.2.3、 Latency hiding3.2.4 、L2缓存3.2.5、工作组分配3.2.6、Coalesced access&#xff08;合并访问&#xff09; 3.3 图形和计算负载之间的上下文切换…

如何做好一个软件开发项目经理?

要成为一名优秀的软件开发项目经理&#xff0c;需要具备一定的技术知识和管理能力。下面是学习和发展软件开发项目经理职业所需的关键能力和工作内容。 首先&#xff0c;作为软件开发项目经理&#xff0c;你需要具备扎实的软件开发知识和技能。这包括熟悉常用的编程语言、开发框…