在信息检索中,单词的文档频率(Document Frequency,简称DF)是评估单词重要性的重要参数。针对一组文档,某个单词w的DF定义为该单词出现的文档的个数。注意:不是单词在这组文档中出现的总次数,而是包含该单词的文档的个数。若一篇文档包含某个单词多次,DF不重复计数。例如:如果w在10篇文档中出现过,其DF的值为10。 此外,由于同一个单词可能会有不同的大小写形态,需要将单词都归一化为小写形态后再进行DF的统计。 请你设计一个简易的单词统计程序,输入D篇文档,统计文档频率DF最大的前k个归一化为小写后的单词。对于结果中DF相同的单词,按其字典序排序。 请使用string类和自定义的Stool工具类完成本题目。#注意#,你的代码中不必包含对下图所示头文件的引用,更不需要如此前任务要求的那样,去实现其中的成员函数。它已经实现,并将被自动添加到你提交的代码中。你只需按其功能接口说明,正确调用即可。 第一行为两个数字D和K,中间以空格分隔, 以下D行每行一个英文文档(字符长度小于1000),单词之间以空格分隔 共K行,每行先输出归一化的单词,再输出其文档频率,中间以空格分隔。请告诉我这道题目的main函数
时间: 2023-05-28 07:05:18 浏览: 41
首先,我们需要设计一个程序,能够接收D篇文档作为输入。可以使用一个vector<string>来存储每篇文档。
然后,我们需要对每篇文档进行处理,将单词都转换为小写形态,并统计每个单词出现的文档个数。可以使用一个unordered_map<string, int>来存储每个单词出现的文档个数。
最后,我们需要对所有单词按照文档频率进行排序,找出文档频率最大的前k个单词,并按照字典序进行排序。可以使用一个vector<pair<string, int>>来存储单词和对应的文档频率,然后使用sort函数进行排序。
下面是一个简单的示例代码:
```
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include "Stool.h"
using namespace std;
int main() {
int D, k;
cin >> D >> k;
vector<string> docs(D);
for (int i = 0; i < D; i++) {
cin >> docs[i];
}
unordered_map<string, int> df;
for (auto doc : docs) {
unordered_map<string, bool> appeared;
for (int i = 0; i < doc.size(); i++) {
if (isalpha(doc[i])) {
string word;
while (i < doc.size() && isalpha(doc[i])) {
word += tolower(doc[i]);
i++;
}
if (!appeared[word]) {
df[word]++;
appeared[word] = true;
}
}
}
}
vector<pair<string, int>> freqs(df.begin(), df.end());
sort(freqs.begin(), freqs.end(), [](const pair<string, int>& p1, const pair<string, int>& p2) {
if (p1.second != p2.second) {
return p1.second > p2.second;
}
return p1.first < p2.first;
});
for (int i = 0; i < k; i++) {
cout << freqs[i].first << " " << freqs[i].second << endl;
}
return 0;
}
```