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