topk 热词

 

给你一段新闻(标题字符串+正文字符串)求解topK热词,热词在标题中出现频率系数3,出现在正文中为1,先标题,相同就出现的先后顺序,后正文,相同就正文中出现的先后顺序。输入n,m。n表示top-n热词,m表示新闻的个数(标题+正文)

输入n,m,n表示top-n热词,m表示新闻数量,输出top-n热词。

输入

3 2
xinguan feiyan xinzeng bendi quezhen anli
ju baodao chengdu xinzeng xinguan feiyan bendi quezhen anli yili shenzhen xinzeng bendi quezhen anli liangli yiqing zhengti kongzhi lianghao
xinguan yimiao lichuang shiyan
wuzhong xinguan yimiao tongguo snaqi lichuang shiyan xiaoguo lianghao

输出:

xinguan xinzeng bendi

 

解析

首先要从题目中提出四种排序的规则:

-(1)每个词出现的频率,在标题中权重为3,在正文中权重为1

--(2)如果出现频率相同,就要按照谁出现在标题中的次数多,谁在前

---(3)如果出现在标题的次数相同,比较词出现在标题中的先后顺序

----(4)如果出现在标题中的先后顺序相同,比较出现在正文中的先后顺序

这里学习下python中的字典排序,sorted(dic.items(), key=lambda x: x[0]) x[0] means key, x[1] means values. In this problem, each key has mutiple values. If we sort values in different orders. We can user `[-x[1][0], x[1][2]]`

 1 n,m = map(int, input().split())
 2 dic = {}
 3 for _ in range(m):
 4     title = input().split()
 5     body = input().split()
 6     for i,w in enumerate(title):
 7         if w not in dic:
 8             dic[w] = [0,0,-1e8,-1e8] #出现的频率,出现在标题的次数,出现在标题的最前位置,出现在正文的最前位置
 9         dic[w][0] += 3
10         dic[w][1] += 1
11         dic[w][2] = max(-i, dic[w][2])
12     for j,w in enumerate(body):
13         if w not in dic:
14             dic[w] = [0,0,-1e8,-1e8]
15         dic[w][0] += 1
16         dic[w][3] = max(-j, dic[w][3])
17 
18 ans = sorted(dic.items(), key=lambda x: x[1] ,reverse=True)
19 for tp in ans[:n]:
20     print(tp[0], end=' ')
posted @ 2022-04-08 23:57  浅忆~  阅读(15)  评论(0编辑  收藏  举报