Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8

Шаблонная функция которая будет вычислять TF-IDF

14.11.2021, 00:09. Показов 4209. Ответов 16

Студворк — интернет-сервис помощи студентам
Всем добрый вечер!
Нужно сделать шаблонную функцию, которая будет вычислять TF-IDF. Однако не проходит решение, судя по всему из-за map<vector<Term>, double> TF. Чем его можно заменить или как исправить? Заранее спасибо.
Код получился следующий:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
 
 
 
using namespace std;
 
template <typename Documents, typename Term>
vector <double> ComputeTfIdfs(const  Documents& documents, const  Term& term_query) {
    map<vector<Term>, double> TF;
    vector <double> tf_idf;
   for (const auto& document : documents) {
        if (count(document.begin(), document.end(), term_query) != 0) {
                TF[document] += 1.0 / static_cast<double>(document.size());
        }
    }
    double IDF = log(static_cast<double>(documents.size()) / static_cast<double>(TF.size()));
    for (const auto& document : documents) {
        tf_idf.push_back(IDF * TF[document]);
    }
        
    return tf_idf;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.11.2021, 00:09
Ответы с готовыми решениями:

Нужно создать функцию которая будет вычислять центры этих фигур,а потом создать еще одну функцию которая уже будет рисовать эти точки(центры)в фигурах
#include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; //---------------------------------------------------------------------------...

Составьте функцию, которая будет вычислять модуль вектора
Используя MS Excel создать на языке VBA модуль вычисления функции в соответствии с выбранным вариантом. Проверить работу функции на рабочем...

Составить программу которая будет вычислять произведение двух матриц...
Составить программу которая будет вычислять произведение двух матриц(двумерные массивы)

16
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
14.11.2021, 02:04
Цитата Сообщение от TONRU Посмотреть сообщение
Однако не проходит решение,
Что значит "не проходит решение"?

Цитата Сообщение от TONRU Посмотреть сообщение
судя по всему из-за map<vector<Term>, double> TF.
Так а откуда вдруг взялся vector<Term>? Почему vector<Term>?
0
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 16:16  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что значит "не проходит решение"?



Так а откуда вдруг взялся vector<Term>? Почему vector<Term>?
Что значит "не проходит решение"?
Тренажер не пропускает дальше потому, что функция получается не шаблонной из-за этого map.

Так а откуда вдруг взялся vector<Term>? Почему vector<Term>?
По условию задачи нужно использовать template Term и template Document.

Суть в том, что нужно на что-то заменить этот map. Как подсказали, нужно использовать алгоритм count, чтобы подсчитать число вхождений term_query в документ. Но пока не могу понять, куда его поместить. Если в цикл, то получается совсем неправильное решение.
0
Заблокирован
14.11.2021, 16:36
TONRU, слабо написать задание ?
Почему map, в задании нужно отсортировать индекс вхождений query ?

Цитата Сообщение от TONRU Посмотреть сообщение
Суть в том, что нужно на что-то заменить этот map.
на vector<double> TF(documents.size());

Добавлено через 1 минуту
Цитата Сообщение от TONRU Посмотреть сообщение
TF[document] += 1.0 / static_cast<double>(document.size());
что это за бред ?

TF-IDF
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
14.11.2021, 16:47
Цитата Сообщение от TONRU Посмотреть сообщение
По условию задачи нужно использовать template Term и template Document.
Я не знаю, что означает "нужно использовать template Term и template Document".

Я еще раз повторяю вопрос: почему в коде объявляется map<vector<Term>, double>? Что такое vector<Term>? Почему в качестве ключа в map указан некий vector<Term>? Откуда взялся vector<Term>?
0
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 16:54  [ТС]
TONRU, слабо написать задание ?
Задание

Реализуйте шаблонную функцию ComputeTfIdfs, которая вычисляет TF-IDF заданного слова для каждого документа из набора.

Первый параметр documents — контейнер документов. Циклом for (const auto& document : documents) можно перебрать все документы в нём, а в каждом документе — все слова. Тип слова, документа и набора документов может быть произвольным — ваша функция должна быть готова к любым, если есть возможность итерирования. Гарантируется, что и набор документов, и каждый отдельный документ имеют методы begin, end и size. Например, документом может быть строка, а словом — символ.

Второй параметр term — слово, у которого нужно вычислить TF-IDF. Его тип совпадает с типом слов, которые получаются при итерировании по документу.

Функция должна вернуть вектор вещественных чисел, который совпадает по длине с количеством документов. В первом элементе должен лежать TF-IDF слова term для первого документа, в последнем элементе — TF-IDF слова term для последнего документа.

Напоминаем, что TF-IDF — это произведение TF и IDF. TF слова term в документе — доля слов документа, совпадающих с term. IDF вычисляется для слова независимо от конкретного документа и равен логарифму (функция log из <cmath>) от documents.size() / document_freq, где знаменатель — это количество документов, содержащих term.

Пример из тренажёра должен вывести 0.081093 0.101366 0.
0
Заблокирован
14.11.2021, 16:57
не тестировал, но куда ближе к реальности...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename Documents, typename Term>
vector <double> ComputeTfIdfs(const  Documents& documents, const  Term& term_query) {
    vector<double> tf(documents.size()) , tf_idf(documents.size());
    unsigned query_in_doc_c{}, query_count{};
    for (auto it = documents.begin(); it!=documents.end(); ++it ) {
        query_count = count(document.begin(), document.end(), term_query);
        docs_have_query += bool(query_count);
        *tf= query_count  / static_cast<double>(document.size());
    }
    double IDF = log(documents.size() / static_cast<double>(docs_have_query);
    for (auto i = 0; i<=documents.size(); ++i ) {
        tf_idf[i] = IDF * tf[i];
    }
    return tf_idf;
}
0
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 16:58  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я не знаю, что означает "нужно использовать template Term и template Document".

Я еще раз повторяю вопрос: почему в коде объявляется map<vector<Term>, double>? Что такое vector<Term>? Почему в качестве ключа в map указан некий vector<Term>? Откуда взялся vector<Term>?
Написал полный текст задания.

Vector<Term> - вектор определенных слов, число вхождений которых/ого и нужно проверить в ряде документов.

Вот так выглядит main

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    const vector<vector<string>> documents = {
        {"белый"s, "кот"s, "и"s, "модный"s, "ошейник"s},
        {"пушистый"s, "кот"s, "пушистый"s, "хвост"s},
        {"ухоженный"s, "пёс"s, "выразительные"s, "глаза"s},
    };
    const auto& tf_idfs = ComputeTfIdfs(documents, "кот"s);
    for (const double tf_idf : tf_idfs) {
        cout << tf_idf << " "s;
    }
    cout << endl;
}
0
Заблокирован
14.11.2021, 17:06
Поправил грубые ошибки.

Добавлено через 2 минуты
for (auto i = 0; i<=documents.size(); ++i )
убрать равно, по естественным причинам

Добавлено через 4 минуты
из вики не понял значения знаменателя для IDF.
Он будет равен нулю если нет вхождения ни в один документ.
То есть нужно добавить условие, либо есть вхождение либо 1 ?
0
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 17:14  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Поправил грубые ошибки.

Добавлено через 2 минуты
for (auto i = 0; i<=documents.size(); ++i )
убрать равно, по естественным причинам

Добавлено через 4 минуты
из вики не понял значения знаменателя для IDF.
Он будет равен нулю если нет вхождения ни в один документ.
То есть нужно добавить условие, либо есть вхождение либо 1 ?
Этого условия не требуется, подразумевается, что мы ищем слово/число/символ, который есть хотя бы в одном из документов.

По изначальному коду как раз и вычисляется, что в третьем документе слова "кот" нет, потому и tf-idf=0
0
Заблокирован
14.11.2021, 17:23
Цитата Сообщение от TONRU Посмотреть сообщение
Этого условия не требуется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename Documents, typename Term>
vector <double> ComputeTfIdfs(const  Documents& documents, const  Term& term_query) {
    vector<double> tf(documents.size()) , tf_idf(documents.size());
    unsigned query_in_doc_c{}, query_count{};
    for (auto i = 0; i<documents.size(); ++i ) {
        query_count = count(documents[i].begin(), documents[i].end(), term_query);
        query_in_doc_c += bool(query_count);
        tf[i] = query_count  / static_cast<double>(documents[i].size());
    }
    double IDF = log(documents.size() / static_cast<double>(query_in_doc_c ? query_in_doc_c : 1));
    for (auto i = 0; i<documents.size(); ++i )
        tf_idf[i] = IDF * tf[i];
    return tf_idf;
}
исправил до работоспособного состояния, результат : 0.081093 0.101366 0
0
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 17:28  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename Documents, typename Term>
vector <double> ComputeTfIdfs(const  Documents& documents, const  Term& term_query) {
    vector<double> tf(documents.size()) , tf_idf(documents.size());
    unsigned query_in_doc_c{}, query_count{};
    for (auto i = 0; i<documents.size(); ++i ) {
        query_count = count(documents[i].begin(), documents[i].end(), term_query);
        query_in_doc_c += bool(query_count);
        tf[i] = query_count  / static_cast<double>(documents[i].size());
    }
    double IDF = log(documents.size() / static_cast<double>(query_in_doc_c ? query_in_doc_c : 1));
    for (auto i = 0; i<documents.size(); ++i )
        tf_idf[i] = IDF * tf[i];
    return tf_idf;
}
исправил до работоспособного состояния, результат : 0.081093 0.101366 0
Все равно не проходит проверку, выдавая следуюущее:
Ошибка компиляции:
/tmp/tmpx1eo3t1h/submission.cpp: In instantiation of ‘std::vector<double> ComputeTfIdfs(const Documents&, const Term&) [with Documents = std::set<std::__cxx11::basic_string<char > >; Term = char]’:
/tmp/tmpx1eo3t1h/submission.cpp:159:59: required from here
/tmp/tmpx1eo3t1h/submission.cpp:15:38: error: no match for ‘operator[]’ (operand types are ‘const std::set<std::__cxx11::basic_string<char > >’ and ‘int’)
15 | query_count = count(documents[i].begin(), documents[i].end(), term_query);
| ~~~~~~~~~^
compilation terminated due to -Wfatal-errors.
0
Заблокирован
14.11.2021, 17:43
Там Documents - std::set<string>
Хотел как лучше, итерирования только begin, end.
Сразу бы задание написали, обошлись бы без этого.
Исправляйте сами.
0
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 17:46  [ТС]
Ну ладно, в любом случае спасибо
0
Заблокирован
14.11.2021, 17:52
Лучший ответ Сообщение было отмечено TONRU как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename Documents, typename Term>
vector <double> ComputeTfIdfs(const  Documents& documents, const  Term& term_query) {
    vector<double> tf, tf_idf;
    unsigned query_in_doc_c{}, query_count{};
    for (auto document : documents ) {
        query_count = count(document.begin(), document.end(), term_query);
        query_in_doc_c += bool(query_count);
        tf.push_back(query_count  / static_cast<double>(document.size()));
    }
    double IDF = log(documents.size() / static_cast<double>(query_in_doc_c ? query_in_doc_c : 1));
    for (auto tf_i : tf)
        tf_idf.push_back(IDF * tf_i);
    return tf_idf;
}
1
0 / 0 / 0
Регистрация: 14.11.2021
Сообщений: 8
14.11.2021, 18:50  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename Documents, typename Term>
vector <double> ComputeTfIdfs(const  Documents& documents, const  Term& term_query) {
    vector<double> tf, tf_idf;
    unsigned query_in_doc_c{}, query_count{};
    for (auto document : documents ) {
        query_count = count(document.begin(), document.end(), term_query);
        query_in_doc_c += bool(query_count);
        tf.push_back(query_count  / static_cast<double>(document.size()));
    }
    double IDF = log(documents.size() / static_cast<double>(query_in_doc_c ? query_in_doc_c : 1));
    for (auto tf_i : tf)
        tf_idf.push_back(IDF * tf_i);
    return tf_idf;
}
Большое спасибо, сработало!
0
Заблокирован
14.11.2021, 18:52
Цитата Сообщение от TONRU Посмотреть сообщение
Большое спасибо, сработало!
Оно сработало потому что используются только Forward итераторы, и было внятное описание задачи.
Но сколько нафлудили ....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2021, 18:52
Помогаю со студенческими работами здесь

Написать программу, которая будет вычислять преступника по известным данным
Представьте, что в полицейском участке проводится расследование. Было совершено несколько преступлений. У полицейских есть другие более...

Написать программу, которая будет вычислять среднюю температуру за 4 дня
Всем привет. Нужно написать программу которая будет вычислять среднюю температуру за 4 дня. Вроде простая задача но туплю.Думаю вот...

Построить программу машины Тьюринга, которая будет вычислять функцию
Необходимо построить программу машины Тьюринга, которая будет вычислять функцию f(x,y) = x + y - 1. Алфавит состоит из 1 и пустого символа....

Написать программу,которая будет вычислять меньшее из всех чисел
Человек вводит с клавиатуры по одному целому числу. Когда ввод закончен,то вводится строка &quot;end&quot;. Надо программу вычисляющую...

Написать функцию, которая будет вычислять интеграл методом Симпсона вручную
Известно,что функция задана таблицей .Последний индекс - четный.Табличная функ. состоит из y. Переменная постоянного шага - h. Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru