Advertisement
Alaricy

делаю TF IDF ранжиорвание

Oct 13th, 2022 (edited)
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.05 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <set>
  4. #include <string>
  5. #include <utility>
  6. #include <vector>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. const int MAX_RESULT_DOCUMENT_COUNT = 5;
  12.  
  13. string ReadLine() {
  14.     string s;
  15.     getline(cin, s);
  16.     return s;
  17. }
  18.  
  19. int ReadLineWithNumber() {
  20.     int result = 0;
  21.     cin >> result;
  22.     ReadLine();
  23.     return result;
  24. }
  25.  
  26. vector<string> SplitIntoWords(const string& text) {
  27.     vector<string> words;
  28.     string word;
  29.     for (const char c : text) {
  30.         if (c == ' ') {
  31.             if (!word.empty()) {
  32.                 words.push_back(word);
  33.                 word.clear();
  34.             }
  35.         } else {
  36.             word += c;
  37.         }
  38.     }
  39.     if (!word.empty()) {
  40.         words.push_back(word);
  41.     }
  42.  
  43.     return words;
  44. }
  45.  
  46. struct Document {
  47.     int id;
  48.     double relevance; //
  49. };
  50.  
  51. class SearchServer {
  52. public:
  53.     void SetStopWords(const string& text) {
  54.         for (const string& word : SplitIntoWords(text)) {
  55.             stop_words_.insert(word);
  56.         }
  57.     }
  58.  
  59.     void AddDocument(int document_id, const string& document) {
  60.         const vector<pair<string, double>> words = SplitIntoWordsNoStopWithTF(document);
  61.         for (auto wrd:words){
  62.            word_to_document_freqs_[wrd.first].insert({document_id, wrd.second});
  63.            
  64.         }        
  65.     //////////// отображаем че там попало /////
  66.       /*  for (auto word_key: word_to_document_freqs_)
  67.         {
  68.             cout << word_key.first<<":";
  69.             for (auto id_tf: word_to_document_freqs_[word_key.first])
  70.             {
  71.               cout << id_tf.first << "--" << id_tf.second<<endl;  
  72.             }
  73.         }*/
  74.     ///////////    
  75.    
  76.     }
  77.  
  78.     vector<Document> FindTopDocuments(const string& raw_query) const {
  79.         const QueryContent query_words = ParseQuery(raw_query);
  80.         auto matched_documents = FindAllDocuments(query_words);
  81.  
  82.         sort(matched_documents.begin(), matched_documents.end(),
  83.              [](const Document& lhs, const Document& rhs) {
  84.                  return lhs.relevance > rhs.relevance;
  85.              });
  86.         if (matched_documents.size() > MAX_RESULT_DOCUMENT_COUNT) {
  87.             matched_documents.resize(MAX_RESULT_DOCUMENT_COUNT);
  88.         }
  89.         return matched_documents;
  90.     }
  91.  
  92. private:
  93.     //map<string, set<int>>  word_to_documents_;
  94.     map<string, map<int, double>> word_to_document_freqs_;
  95.     int document_count_ = 0;
  96.    
  97.     struct QueryContent {
  98.         set<string> pluswords;
  99.         set<string> minuswords;
  100.     };
  101.  
  102.     set<string> stop_words_;
  103.  
  104.     bool IsStopWord(const string& word) const {
  105.         return stop_words_.count(word) > 0;
  106.     }
  107.  
  108.     vector<string> SplitIntoWordsNoStop(const string& text) const {
  109.         vector<string> words;
  110.         for (const string& word : SplitIntoWords(text)) {
  111.             if (!IsStopWord(word)) {
  112.                 words.push_back(word);
  113.             }
  114.         }
  115.         return words;
  116.     }
  117.     //////////вычисление числа одинаковых слов в векторе///
  118.     int WordsCountInvector(string word, vector<string> vctrwords)
  119.     {
  120.     int count=0;
  121.         for (string wrd:vctrwords)
  122.         {
  123.         if (word==wrd) ++count;    
  124.         }
  125.         return count;
  126.     }
  127.     /////////////////
  128.     ////// разбивка на слова с вычислением TF
  129.     vector <pair<string, double>> SplitIntoWordsNoStopWithTF(const string& text) /*const*/ {
  130.     vector <pair<string, double>> words_n_TF;
  131.     pair<string, double> temp;
  132.     vector<string> rawwords = SplitIntoWordsNoStop(text);    
  133.     int vsize = rawwords.size();    
  134.         for (string wrd:rawwords) {
  135.         temp.first=wrd;
  136.         temp.second=1.0*WordsCountInvector(wrd,rawwords)/vsize;
  137.         words_n_TF.push_back(temp);
  138.     }
  139.     return words_n_TF;
  140.     }
  141.     ///////////
  142.     QueryContent ParseQuery(const string& text) const {
  143.         QueryContent query_words;
  144.         for (const string& word : SplitIntoWordsNoStop(text)) {
  145.             if (word[0]!='-') query_words.pluswords.insert(word);
  146.             else {
  147.                 query_words.minuswords.insert(word.substr(1));
  148.              }
  149.         }
  150.         return query_words;
  151.     }
  152.  
  153.     vector<Document> FindAllDocuments(const QueryContent query_words) const {
  154.         map <int,double> document_to_relevance;  //
  155.         vector<Document> matched_documents;
  156.         for (const auto& qwr_wrd : query_words.pluswords)
  157.         {
  158.             if (word_to_document_freqs_.count(qwr_wrd))
  159.             {
  160.                 for (auto id_tf : word_to_document_freqs_.at(qwr_wrd))
  161.                 {
  162.                     document_to_relevance[id_tf.first]=id_tf.second;
  163.                 }
  164.             }
  165.         }
  166.         for (const auto& qwr_mwrd : query_words.minuswords)
  167.         {
  168.             if (word_to_document_freqs_.count(qwr_mwrd))
  169.             {
  170.                 for (auto id_tf:word_to_document_freqs_.at(qwr_mwrd))
  171.                 {
  172.                     document_to_relevance.erase(id_tf.first);
  173.                 }
  174.             }
  175.         }
  176.         for (const auto& dctorlv:document_to_relevance)
  177.         {
  178.            matched_documents.push_back({dctorlv.first,dctorlv.second});    
  179.         }
  180.         cout << "--==="<< matched_documents.size() << "===--" << endl;
  181.         return matched_documents;
  182.     }
  183.     };
  184.  
  185. SearchServer CreateSearchServer() {
  186.     SearchServer search_server;
  187.     search_server.SetStopWords(ReadLine());
  188.  
  189.     const int document_count = ReadLineWithNumber();
  190.     for (int document_id = 0; document_id < document_count; ++document_id) {
  191.         search_server.AddDocument(document_id, ReadLine());
  192.     }
  193.  
  194.     return search_server;
  195. }
  196.  
  197. int main() {
  198.     const SearchServer search_server = CreateSearchServer();
  199.  
  200.     const string query = ReadLine();
  201.     for (const auto& [document_id, relevance] : search_server.FindTopDocuments(query)) {
  202.         cout << "{ document_id = "s << document_id << ", "
  203.              << "relevance = "s << relevance << " }"s << endl;
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement