Lua 文本中出现频率最高的单词

  本文借鉴《Lua程序设计(第四版)》第十一章 – “小插曲:出现频率最高的单词”。
  本文开发一个读取并输出一段文本中出现频率最高的单词的程序。主要数据结构是一个记录文本中出现的每一个单词及其出现次数之间关系的表。使用这个数据结构,该程序可以完成3个主要任务:

  1. 读取文本并计算每一个单词的出现次数
  2. 按照出现次数的降序对单词列表进行排序
  3. 输出有序列表中的前 n n n 个元素

  通过 io.lines("blablabla") 来读取文件,本文使用的是英文小说《简爱(Jane Eyre)》。对于读取的每一个单词,增加对应计数器的值。这里使用模式 "%w+" 来描述 "danci ",也就是一个或多个字母或数字。
  下一步对单词列表进行排序,使用 table.sort 函数,要注意:排序函数必须在 w1 位于 w2 之前时返回真
  最后输出结果,输出出现次数最多的十个单词,完整代码如下:

local counter = {}

for line in io.lines("Jane Eyre.txt") do
	for word in string.gmatch(line, "%w+") do
		counter[word] = (counter[word] or 0) + 1
	end
end

local words = {}

for w in pairs(counter) do
    words[#words + 1] = w
end

table.sort(words, function(w1, w2)
    return counter[w1] > counter[w2] or counter[w1] == counter[w2] and w1 < w2
end)

-- 输出出现次数前10的单词
local n = math.min(10, #words)

for i = 1, n do
    io.write(words[i], "\t", counter[words[i]], "\n")
end

  输出结果为:

the     7356
I       7215
and     6317
to      5112
a       4294
of      4280
in      2661
you     2658
was     2510
my      2088

  可以看到其中很多都是介词,用一个比较简单粗暴的方式,将单词长度 <= 2 的单词都忽略掉,结果为:

the     7356
and     6317
you     2658
was     2510
her     1684
that    1582
not     1480
had     1473
with    1370
for     1263
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值