基于线性表和二叉排序树的低频词过滤系统
(一)实验内容
-
对于一篇给定的英文文章,分别利用线性表和二叉排序树来实现单词频率的统计,实现低频词的过滤,并比较两种方法的效率。具体要求如下:
-
读取英文文章文件(Infile.txt),识别其中的单词。
-
分别利用线性表和二叉排序树构建单词的存储结构。当识别出一个单词后,若线性表或者二叉排序树中没有该单词,则在适当的位置上添加该单词;若该单词已经被识别,则增加其出现的频率。
-
统计结束后,删除出现频率低于五次的单词,并显示该单词和其出现频率。
-
其余单词及其出现频率按照从高到低的次序输出到文件中(Outfile.txt),同时输出用两种方法完成该工作所用的时间。
-
计算查找表的ASL值,分析比较两种方法的效率。
(二)相关算法及其实现
1、主界面代码部分
此函数主要就是使用print打印出主界面
def menu():
print("------------------------")
print("1.线性表")
print("2.二叉排序树")
print("3.退出系统")
print("------------------------")
2、利用线性表来实现单词频率的统计
def linear():
showfile_info = open('Infile.txt', 'r')
line_info = showfile_info.read()
# 去掉文本中的标点符号
line_info = line_info.replace('.', '')
line_info = line_info.replace(',', '')
line_info = line_info.replace('!', '')
line_info = line_info.replace('"', '')
line_info = line_info.replace(':', '')
wordlist = line_info.split()
wordfreq = []
for w in wordlist:
wordfreq.append(wordlist.count(w)) # 记录单词出现的频率
dit = dict(zip(wordlist, wordfreq))
# 将字典的key转换成列表
key_lst = list(dit)
length = len(key_lst)
new_lst = [] # 创建新的列表用来存储出现频率大于5次的单词
for i in range(0, length):
if int(dit[key_lst[i]]) > 5:
new_lst.append(key_lst[i])
new_length = len(new_lst)
start = time.perf_counter() # 起始时间
for i in range(new_length - 1): # 选择排序
max_index = i
for j in range(i + 1, new_length):
if dit[new_lst[max_index]] < dit[new_lst[j]]:
max_index= j
if i != max_index:
temp=new_lst[i]
new_lst[i] = new_lst[max_index]
new_lst[max_index]=temp
for i in range(0,new_length):
print(new_lst[i],end=':')
print(dit[new_lst[i]])
infile_info = open('Outfile.txt', 'a') # 以追加的方式向文件中写入数据,如果文件不存在就创建一个文件
infile_info.write(str(new_lst[i])+':'+str(dit[new_lst[i]])+'\n')
end