C ++ отображение названия темы на вектор строк - PullRequest
0 голосов
/ 29 октября 2018

Так что мне дали этот вопрос и 20 минут, чтобы решить

Вот начало тела функции

typedef map<string, vector<string>> TopicMap; 
typedef map<string, int> TopicCount; 

vector<string> split (const string& line, char delim =' ')
{
    vector<string> strs; 
    size_t pos = line.find(delim); 
    size_t initialPos = 0; 
    while (pos != string::npos) 
    {
        strs.push_back(line.substr(initialPos, pos-initialPos));
        initialPos = pos+1; 
        pos = line.find(delim, initialPos);
    }
    strs.push_back(line.substr(initialPos, pos - initialPos)); 
    return strs; 
}

TopicCount countTopicOccurences (const TopicMap& topicMap, const vector<string>& reviews)
{
   //TODO complete me 
   for (string reviewword:reviews) {
   }

}

В основном у меня есть входные данные вектора в виде списка обзоров и карты тем (строка) с ключевыми словами, составляющими тему (вектор). Я должен вывести количество раз, которое название темы отображается в каждом обзоре.

Я просто понятия не имею, как решить этот вопрос за 20 минут, так как понимание этого вопроса занимает около 5 минут. Дана функция разбиения строки c ++.

Я попытался разбить этот вопрос, используя цикл for_each для каждого обзора, а затем используя цикл for_each цикл for_each для отдельных тем. Поэтому, если тема сопоставляется с одним обзором, я увеличу отображение этой темы на 1. Но я считаю, что действительно сложно записать работоспособный код.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 29 октября 2018

Первое, что нужно сделать, это разделить рецензии на слова с помощью предоставленной функции.Затем вам нужно искать эти слова в карте темы.

Очень примитивный ответ просто повторяет карту темы снова и снова.Это не оптимизировано, но определенно что-то выполнимое за 20 минут:

TopicCount countTopicOccurences (const TopicMap& topicMap, const vector<string>& reviews)
{
    TopicCount c; 
    for (string reviewword:reviews) {
        auto words=split(reviewword);
        for (auto& word:words) {
            for (auto m:topicMap) {
                if (find(m.second.begin(), m.second.end(), word) != m.second.end() )
                   c[m.first]++;
            }
        }
    }
    return c; 
}

Конечно, предоставленный набор данных не дает ожидаемого ответа.Но это связано не с этой функцией подсчета, а с плохой функцией split (), которая использует только один разделитель.Таким образом, пунктуация обрабатывается так, как если бы она была буквой слова, что приводит к тому, что некоторые совпадающие слова не распознаются.Я даю вам в качестве упражнения это улучшение, а также оптимизацию.

Демоверсия .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...