题目描述:
网上新闻越来越多,希望对新闻进行热词处理并归类,方便获取信息,现在已经将每篇文章处理为2个字符串,即一个标题,一个正文串,字符串中使用“ ”作为分隔符进行分词。
M篇新闻按照新闻发布的先后顺序处理完并输入,现在希望对所有新闻中出现的词语进行处理,输出出现频率最高的topN个词语,作为热词。标题中出现的词语频率系数为3,正文中出现的词语频率系数为1;返回的答案按照词语出现频率由高到低排序,当词语出现的频率相同时,在标题中出现的频率次数高的排在前面;如果仍然相同,则按照词语在标题中出现的先后顺序进行排序,先出现的排在前面;如果仍然相同,则按照词语在正文中出现的先后顺序进行排序,先出现的排在前面。
输入描述:
第一行输入为正整数topN和文章数M,即要输出的出现频率最高的词语的个数和处理文章的数量,由于每篇文章被处理为标题和正文2行,因此后面有2 * M行数据。
从第二行起,是按顺序处理后每篇文章的标题串和正文串,即第二行是第一篇文章的标题串,第三行是第一篇文章的正文串,第四行是第二篇文章的标题串,第五行是第二篇文章的正文串,以此类推。
参数限制如下:
0 < topN < 1000?
0 < M < 100000?
0 < 每篇文章的词语数 < 5000
输出描述:
使用一行输出出现频率最高的topN个词语,每个词语以“ ”隔开。
示例1:
输入:
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 zhhengti kongzhi lianghao
xinguan yimiao linchuang shiyan
wuzhong xinguan yimiao tongguo sanqi linchuang shiyan xiaoguo lianghao
输出 :
xinguan xinzeng bendi
解释:各词语出现频率:
xinguan=2*3+2=8 feiyan=1*3+1=4 xinzeng=1*3+2=5 bendi=1*3+2=5 quezhen=1*3+2=5 anli=1*3+2=5 yimiao=1*3+1=4 linchuang=1*3+1=4 shiyan=1*3+1=4 返回频率最高的三个词语,有4个词语出现频率都为5,标题出现频率都为3,所以选择先出现的两个词语xinzeng和bendi
- 首先,我们需要解析输入的topN和文章数M。
- 然后,我们需要遍历每篇文章的标题和正文,将它们合并成一个字符串。
- 接下来,我们将合并后的字符串进行分词,得到词语列表。
- 统计词语在标题和正文中的出现频率,并根据题目要求计算词语的频率系数。
- 使用字典来记录词语的出现频率和频率系数,并按照题目要求进行排序。
- 最后,输出出现频率最高的topN个词语。
# -*- coding: utf-8 -*-
'''
@File : 2023-B-查找舆情热词.py
@Time : 2023/12/23 21:57:34
@Author : mgc
@Version : 1.0
@Desc : None
'''
def process_news(topN, M, news_list):
# 合并标题和正文,得到文章内容字符串
content_list = []
for i in range(0, len(news_list), 2):
title = news_list[i]
content = news_list[i + 1]
content_list.append(title + " " + content)
# 分词并统计词语出现频率
word_freq = {}
title_freq = {}
for content in content_list:
words = content.split()
for word in words:
if word in word_freq:
word_freq[word] += 1
else:
word_freq[word] = 1
if word in title_freq:
title_freq[word] += 1
else:
title_freq[word] = 1
# 计算词语频率系数
for word in word_freq:
if word in title_freq:
word_freq[word] *= 3
# 按照频率和题目要求排序
sorted_words = sorted(word_freq.items(), key=lambda x: (-x[1], -title_freq.get(x[0], 0)))
# 获取出现频率最高的topN个词语
top_words = [word for word, freq in sorted_words[:topN]]
return " ".join(top_words)
temp = [int(x) for x in input().split(" ")]
topN = temp[0]
M = temp[1]
news_list = []
for _ in range(2 * M):
str = input()
news_list.append(str)
result = process_news(topN, M, news_list)
print(result)