厦门市翔安建设局网站,公司网上注册,WordPress右下角提醒,湖北省建设厅网站怎么打不开实例需求#xff1a;产品清单如A列所示#xff0c;现在如下统计词组词频。想必各位小伙伴都指定如何使用字典对象实现去重#xff0c;进而实现单个单词的词频统计。
但是统计词组词频就没有那么简单了#xff0c;为了便于演示#xff0c;此处的词组只限于两个单词的组合。…实例需求产品清单如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 Car和Car 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)