ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4025|回复: 25

[求助] 请教如何通过代码统计文档中每个单词出现的频次?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-3-2 13:34 | 显示全部楼层 |阅读模式
想统计文档中每个单词出现的频次?统计结果按出现频次从高到低进行排序,单词不区分大、小写字母(WHAT、What、what作为同一个单词进行统计),请教能否通过VBA代码实现?
如:
are 50次
do 48次
does 12次
America 1次

英语试题.rar

550.76 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2021-3-2 14:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
遍历每个单词,用字典记录,最后再从大到小排序。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-3-2 14:42 | 显示全部楼层
ming0018 发表于 2021-3-2 14:27
遍历每个单词,用字典记录,最后再从大到小排序。

能否请ming0018兄出手,帮忙写下代码?

TA的精华主题

TA的得分主题

发表于 2021-3-2 22:03 | 显示全部楼层
  1. Sub WordFrequency() '不考虑单词缩写情况
  2.     Dim c$, s$, d, k, i&, j&, temp$, reg, Match, Matches
  3.     s = ActiveDocument.Content.Text
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     d.CompareMode = 1
  6.     Set reg = CreateObject("VBScript.RegExp")
  7.     With reg
  8.         .Pattern = "[A-Za-z]+"
  9.         .Global = True
  10.         Set Matches = .Execute(s)
  11.         For Each Match In Matches
  12.             With Match
  13.                 If d.Exists(.Value) Then d(.Value) = d(.Value) + 1 Else d.Add .Value, 1
  14.             End With
  15.         Next
  16.         k = d.Keys
  17.         For i = 0 To UBound(k) - 1
  18.             For j = i + 1 To UBound(k)
  19.                 If d(k(i)) < d(k(j)) Then
  20.                     temp = k(i)
  21.                     k(i) = k(j)
  22.                     k(j) = temp
  23.                 End If
  24.             Next
  25.         Next
  26.         For i = 0 To UBound(k)
  27.             c = c & k(i) & vbTab & d(k(i)) & "次" & Chr(13)
  28.         Next
  29.         Documents.Add.Content.Text = "共有" & d.Count & "个英文单词(含频次):" & Chr(13) & c
  30.     End With
  31. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-3-3 10:03 | 显示全部楼层
本帖最后由 tangqingfu 于 2021-3-3 10:40 编辑

谢谢shenjianrong163兄的帮助!
请教能否将这些单词及其出现的频次分别导入到一个Exel工作表的A、B两列中(按出现频次从高到低进行排序),导入后,调用”单词表“中名为“全部‘的工作表的数据,若导入的单词存在于名为“全部‘的工作表(A列)中,则在C、D、E列中添加对应的“中文”、“音标”及”课本来源“,若不存在,则为空,请教如何实现?
如:
单词   频次               中文                          音标     课文来源
the        154次   art.这/那个;这/那些               [e&#601;]             七上
to      63次  prep.到,对,向,在…之前        [tu&#720;]             七上


单词表.rar

104.41 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2021-3-3 22:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
tangqingfu 发表于 2021-3-3 10:03
谢谢shenjianrong163兄的帮助!
请教能否将这些单词及其出现的频次分别导入到一个Exel工作表的A、B两列 ...

  1. Sub 统计各单词出现的次数()  '将Word文档与Excel文件放同一目录
  2.     Dim c$, s$, d, d1, k, i&, j&, temp$, reg, Match, Matches, arr, brr(), wb
  3.     s = ActiveDocument.Content.Text
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Set d1 = CreateObject("Scripting.Dictionary")
  6.     Set wb = CreateObject("Excel.Application")
  7.     d.CompareMode = vbTextCompare '不区分大小写
  8.     Set reg = CreateObject("VBScript.RegExp")
  9.     With reg
  10.         .Pattern = "[A-Za-z]+"
  11.         .Global = True
  12.         Set Matches = .Execute(s)
  13.         For Each Match In Matches
  14.             With Match
  15.                 If d.Exists(.Value) Then d(.Value) = d(.Value) + 1 Else d.Add .Value, 1
  16.             End With
  17.         Next
  18.         k = d.Keys
  19.         For i = 0 To UBound(k) - 1
  20.             For j = i + 1 To UBound(k)
  21.                 If d(k(i)) < d(k(j)) Then
  22.                     temp = k(i)
  23.                     k(i) = k(j)
  24.                     k(j) = temp
  25.                 End If
  26.             Next
  27.         Next
  28.         ReDim brr(1 To UBound(k) + 2, 1 To 5)
  29.         j = 1
  30.         brr(j, 1) = "单词": brr(j, 2) = "频次": brr(j, 3) = "中文": brr(j, 4) = "音标": brr(j, 5) = "课文来源"
  31.         For i = 0 To UBound(k)
  32.             j = j + 1
  33.             brr(j, 1) = k(i)
  34.             brr(j, 2) = d(k(i)) & "次"
  35.         Next
  36.     End With
  37.     With wb.WorkBooks.Open(ActiveDocument.Path & "\单词表.xls")
  38.         With .Sheets("全部")
  39.             arr = .UsedRange.Value
  40.             For i = 2 To UBound(arr)
  41.                 d1(LCase(arr(i, 1))) = Array(arr(i, 2), arr(i, 3), arr(i, 4))
  42.             Next
  43.         End With
  44.         With .Sheets("Sheet1")
  45.             .UsedRange.ClearContents
  46.             For i = 2 To UBound(brr)
  47.                 If d1.Exists(LCase(brr(i, 1))) Then
  48.                     brr(i, 3) = d1(LCase(brr(i, 1)))(0)
  49.                     brr(i, 4) = d1(LCase(brr(i, 1)))(1)
  50.                     brr(i, 5) = d1(LCase(brr(i, 1)))(2)
  51.                 End If
  52.             Next
  53.             .[A1].Resize(UBound(brr), 5) = brr
  54.         End With
  55.         .Close True
  56.     End With
  57.     wb.Quit
  58.     Set wb = Nothing
  59.     MsgBox "单词频次统计完成!"
  60. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2021-3-3 22:36 | 显示全部楼层
tangqingfu 发表于 2021-3-3 10:03
谢谢shenjianrong163兄的帮助!
请教能否将这些单词及其出现的频次分别导入到一个Exel工作表的A、B两列 ...

附件供参考:



Word频次统计.rar (662.58 KB, 下载次数: 23)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-3-4 09:04 | 显示全部楼层
本帖最后由 tangqingfu 于 2021-3-4 09:05 编辑

感谢shenjianrong163大侠的再次帮助,效果更理想了!
对于文档中的复数名词(如bike→bikes)、动词过去式、过去分词、现在分词(如walk→walked,walk→walking),形容词的比较级、最高级(如small→smaller→smallest),因为与单词表中的单词不同,无法获取单词相关的“中文”、“音标”及”课文来源“数据
请教能否做到:在“sheet 1"工作表中,若F列的任意单元格输入的单词存在于“全部"工作表的A列中,则自动在C、D、E列中添加对应的“中文”、“音标”及”课文来源“?
对于这些变化的单词,大侠可有更理想的、更智能的处理办法?

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-3-4 09:07 | 显示全部楼层

感谢shenjianrong163大侠的再次帮助,效果更理想了!
对于文档中的复数名词(如bike→bikes)、动词过去式、过去分词、现在分词(如walk→walked,walk→walking),形容词的比较级、最高级(如small→smaller→smallest),因为与单词表中的单词不同,无法获取单词相关的“中文”、“音标”及”课文来源“数据
请教能否做到:在“sheet 1"工作表中,若F列的任意单元格输入的单词存在于“全部"工作表的A列中,则自动在C、D、E列中添加对应的“中文”、“音标”及”课文来源“?
对于这些变化的单词,大侠可有更理想的、更智能的处理办法?

TA的精华主题

TA的得分主题

发表于 2021-3-4 13:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
tangqingfu 发表于 2021-3-4 09:04
感谢shenjianrong163大侠的再次帮助,效果更理想了!
对于文档中的复数名词(如bike→bikes)、动词过去式 ...

对于变化的单词,暂时想不到处理方法。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-29 19:06 , Processed in 0.029122 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表