【华为机试题】(2022.4.6)舆情热词

【华为机试题】(2022.4.6)舆情热词,第1张

舆情热词 题目

用使用" "作为分隔词语的分隔符进行分词。



M篇新闻按照新闻发布的先后顺序处理完开输入,现在希望对所有新闻中出现的词语进行处理,输出出现频率最高的topN个个词语,作为热词。


标题中出现的词语频率系数为3,正文中出现的词语炳率系数为1;返回的答案应该按照词语出现频率由高到低排序,当词语出现的频率相同时,在标题中出现的频率次数高的排在前面;如果仍然相同,则按照词语在标题中出现的先后顺序进行排序,先出现的排在前面;如果仍然相同,则按照词语在正文中出现的先后顺序进行排序,先出现的排在前面。



输入要求

第—行输入为正格数topN和文 章数M,即要输出的出现频率最高的词语的个数和处理的文 章的数量,由于每篇文章被处理为标题和正文2行,因此后面有2*M行数据。


从第二行起,是按顺序处理后每篇文章的标题里和正文串,即第二行是第篇文章的标题串,第三行是第一篇文章的正文串,第四行是第二篇文章的标题串,第五行是第二篇文章的正文里,以此类推。



输出要求

使用一行输出出现频率最高的topN个词语,每个词语以“ ”隔开。


示例 输入
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

思路

本题考察对容器的使用以及多级排序。


可以考虑将标题词频,词序(第一次出现的顺序),以及正文的词频,词序(第一次出现的顺序)单独统计放在不同的容器中。


使用set()集合存放所有词(不重复),进行遍历,将每个词、词频总计、标题词频、标题词序、和正文词频、正文词序进行封装放入List,并提供比较器进行排序。


代码实现

java代码:

public class BreakWordTopN {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int topN=0;
        int articles=0;
        String params = sc.nextLine();
        String[] param = params.split(" ");
        topN = Integer.valueOf(param[0]);
        articles = Integer.valueOf(param[1]);
        //System.out.println("topN:" + topN+",articles:" + articles);

        Map<String, Integer> titles = new HashMap<>();//标题中词频
        Map<String, Integer> titlesSeq = new HashMap<>();//标题中第一次出现这个词的顺序
        Map<String, Integer> contents = new HashMap<>();//正文中词频
        Map<String, Integer> contentsSeq = new HashMap<>();//正文中第一次出现这个词的顺序
        Set<String> words = new HashSet();

        int seqTitle = 0;//标题词顺序索引
        int seqContent = 0;//正文词顺序索引
        for (int i = 0; i < articles; i++) {
            String lineTitle = sc.nextLine();
            //统计标题词频和词序
            for (String word : lineTitle.split(" ")) {
                if (titles.containsKey(word)) {
                    titles.put(word, titles.getOrDefault(word, 0) + 1);
                }else{
                    titles.put(word, 1);
                }
                if (!titlesSeq.containsKey(word)) {
                    titlesSeq.put(word, seqTitle++);
                }
                words.add(word);
            }

            //统计正文词频和词序
            String lineContent = sc.nextLine();
            for (String word : lineContent.split(" ")) {
                if (contents.containsKey(word)) {
                    contents.put(word, titles.getOrDefault(word, 0) + 1);
                }else{
                    contents.put(word, 1);
                }
                if (!contentsSeq.containsKey(word)) {
                    contentsSeq.put(word, seqContent++);
                }
                words.add(word);
            }
        }
        //遍历词集合,将每个词进行词频、词序统计,包装放入list
        List<Container> containerList = new ArrayList<>();
        for (String word : words) {
            Container container = null;
            //word出现分三种情况
            if(titles.containsKey(word) && contents.containsKey(word)){//1.标题、正文都出现
                container =new Container(word, titles.get(word) * 3 + contents.get(word), titles.get(word), titlesSeq.get(word),
                        contents.get(word), contentsSeq.get(word));
            } else if (!titles.containsKey(word) && contents.containsKey(word)) {//1.标题没有,正文出现
                container=new Container(word, contents.get(word), 0, contentsSeq.get(word),
                        contents.get(word), contentsSeq.get(word));
            }else{//3.标题出现,正文没有
                container=new Container(word, titles.get(word) * 3, titles.get(word), titlesSeq.get(word),
                        0, titlesSeq.get(word));
            }
            containerList.add(container);
            containerList.sort(new Comparator<Container>() {
                @Override
                public int compare(Container o1, Container o2) {
                    if(o1.getWordFrquences()!=o2.getWordFrquences()) return o2.getWordFrquences()-o1.getWordFrquences();
                    else if(o1.getTitles()!=o2.getTitles()) return o2.getTitles() - o1.getTitles();
                    else if(o1.getTitlesNum()!=o2.getTitlesNum()) return o1.getTitlesNum() - o2.getTitlesNum();
                    else if(o1.getContents()!=o2.getContents()) return o2.getContents() - o1.getContents();
                    else if(o1.getContentsNum()!=o2.getContentsNum()) return o1.getContentsNum() - o2.getContentsNum();
                    else return 1;
                }
            });
        }
        //调试信息
        for (int i = 0; i < containerList.size(); i++) {
            System.out.println(containerList.get(i));
        }
        //输出最终结果
        for (int i = 0; i < topN-1; i++) {
            System.out.print(containerList.get(i).getWord()+" ");
        }
        System.out.print(containerList.get(topN-1).getWord());
    }
}
//封装类
class Container{
    private String word;//单个词
    private int wordFrquences;//词频
    private int titles;//标题词频
    private int titlesNum;//标题词序
    private int contents;//正文词频
    private int contentsNum;//正文词序

    public Container(){
    }

    public Container(String word, int wordFrquences, int titles, int titlesNum, int contents, int contentsNum) {
        this.word = word;
        this.wordFrquences = wordFrquences;
        this.titles = titles;
        this.titlesNum = titlesNum;
        this.contents = contents;
        this.contentsNum = contentsNum;
    }

    public int getWordFrquences() {
        return wordFrquences;
    }

    public int getTitles() {
        return titles;
    }

    public int getTitlesNum() {
        return titlesNum;
    }

    public int getContents() {
        return contents;
    }

    public int getContentsNum() {
        return contentsNum;
    }

    public String getWord() {
        return word;
    }

    @Override
    public String toString() {
        return "Container{" +
                "word='" + word + '\'' +
                ", wordFrquences=" + wordFrquences +
                ", titles=" + titles +
                ", titlesNum=" + titlesNum +
                ", contents=" + contents +
                ", contentsNum=" + contentsNum +
                '}';
    }
}

python代码:


# If you need to import additional packages or classes, please import here.
from collections import defaultdict
from functools import cmp_to_key

def func():
    # please define the python3 input here. For example: a,b = map(int, input().strip().split())
    # please finish the function body here.
    # please define the python3 output here. For example: print().
    topN, m=list(map(int, input().split()))  #输入两个整数以空格隔开
    titles=defaultdict(int) #当key不存在时返回类型默认值,否则就是一个正常的字典    标题词频
    t_num=defaultdict(int) #   标题词顺序
    contents=defaultdict(int) #正文词频
    c_num=defaultdict(int) #正文词顺序
    words=set()
    for i in range(m):#读取文章标题和正文
        #1.读取标题内容
        line=input().split()#输入一行数据,默认以空格分割放入列表中
        for i, w in enumerate(line):#对每一行数据(此时在列表中)遍历
            titles[w]+=1
            if t_num[w]==0:
                t_num[w]=i #记录当前标题词第一次出现的次数
            words.add(w) #遍历完将词加入集合
        #2.读取正文内容
        line=input().split()
        for i, w in enumerate(line):
            contents[w]+=1
            if c_num[w]==0:
                c_num[w]=i
            words.add(w)
    l=[]
    for w in words:
        l.append((titles[w]*3+contents[w],titles[w],t_num[w], contents[w],c_num[w],w))
    def cmp(w1,w2):
        if w1[0]!=\
                w2[0]:
            return w2[0]-w1[0]
        elif w1[1]!=w2[1]:
            return w2[1]-w1[1]
        elif w1[2]!=w2[2]:
            return w1[2]-w2[2]
        elif w1[3]!=w2[3]:
            return w2[3]-w1[3]
        elif w1[4]!=w2[4]:
            return w1[4]-w2[4]
        return 1
    l.sort(key=cmp_to_key(cmp))
    for i in range(topN):
        print(l[i][-1],end=" ")
if __name__ == "__main__":
    func()

有问题留言,转载注明出处,谢谢!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/567572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存