Oggi ho provato a scrivere un programma che avrebbe preso in un paragrafo del testo e creare un grafico che mostra le relazioni tra parole diverse. Tutto è andato bene, tranne che non so come scoprire le connessioni in un modo migliore. Un modo migliore significa simile a una mappa mentale. Si tratta di un semplice input, ma voglio creare un programma che possa prendere un paragrafo da wikipedia e dare una mappa mentale molto carina. Il grafico che ho ottenuto fuori del formato di output di punti del mio programma per il seguente input eraCome creare una mappa mentale dal paragrafo di un libro
roses are red line_end
sky is blue line_end
life is beautiful line_end
everything is going fine line_end file_end
Ma per un ingresso come questo input, basta creare un grande grafico che è più oscura rispetto al testo stesso.
Probability is a measure of the likeliness that an event will occur line_end
Probability is used to quantify an attitude of mind towards some proposition of whose truth we are not certain line_end
file_end
Quindi la mia domanda è, cosa algoritmo può lavorare bene qui in questa situazione. Cosa dovrei studiare per fare questo tipo di programma. Qui di seguito è il mio programma C++. (Ho fatto anche l'elaborazione del testo utilizzando rubino per ottenere il punto in forma corrente con "line_end" e "file_end", ma questo non è dove sto ottenendo problema)
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<string>
#define MP(X,Y) (make_pair<string,string>(X,Y))
using namespace std;
map<string, vector<string> > mind_map;
set<string> ignore_these_words;
set<pair<string,string> > already_discovered;
string black_list[] = {"and","is","are","was","for","the","a","an","or","under","up","over","beside","below",
"across","to","from","by","have","had","has","been","be","it","me","you"};
vector<string> current_sentence;
int main()
{
for(int i =0; i<(sizeof(black_list)/sizeof(black_list[0])) ; i++)
ignore_these_words.insert(black_list[i]);
while(1)
{
string input_word;
cin >> input_word;
if(ignore_these_words.find(input_word) != ignore_these_words.end())
continue;
/* if the sentence end has been reached, then insert all pairs of combinations of words in the graph
for example if the sentence is "roses are red and beautiful", then it will try to insert the following pairs of edges
after ignoring "are" and "and" from the ignore list
(roses,red)
(roses,beautiful)
(red,beautiful)
*/
if(input_word == "line_end")
{
for(int i =0; i< current_sentence.size() ; i++)
for(int j = i+1; j < current_sentence.size(); j++)
/* if we have not discovered this connection earlier */
if(already_discovered.find(MP(current_sentence[i],current_sentence[j])) == already_discovered.end())
{
mind_map[current_sentence[i]].push_back(current_sentence[j]);
already_discovered.insert(MP(current_sentence[i],current_sentence[j]));
already_discovered.insert(MP(current_sentence[j],current_sentence[i]));
}
current_sentence.clear();
continue;
}
/* if the file end has been reached, then output the graph in dot format */
if(input_word == "file_end")
{
cout << "graph {"<<endl;
for(map<string,vector<string> >::iterator it = mind_map.begin(); it != mind_map.end(); ++it)
for(int i =0; i< (*it).second.size(); i++)
cout<<"\""<<(*it).first<<"\""<<" -- "<<"\""<<(*it).second[i]<<"\""<<endl;
cout<< "}"<<endl;
break;
}
current_sentence.push_back(input_word);
}
return 0;
}
Grazie in anticipo :) . E se qualcuno ha un tale tipo di codice, per favore dammi. Voglio rendere il mio studio più produttivo da questo.
Qual è il problema con il codice che hai postato? Non funziona? Segnala un errore? Produce risultati errati? È troppo lento? Manca qualche funzionalità? – CoryKramer
@Cyber Si prega di guardare la parte "così la domanda è" appena sopra il codice ... il codice sta funzionando bene. Voglio sapere il modo migliore per farlo. – kuroop
Solo alcune idee allentate: i tuoi nodi e bordi devono contenere più dati. I nodi dovrebbero probabilmente contare la frequenza con cui si verifica la parola e i bordi con quale frequenza si verifica la coppia di parole nella stessa frase in modo da poter eliminare i nodi "deboli" e i bordi dal grafico dopo l'elaborazione. Hai bisogno di un elenco di parole d'arresto più grandi o anche di uno che impari durante l'elaborazione. Infine, la derivazione (cioè riducendo le parole ai loro steli tagliando i suffissi) ti darà meno, ma spero nodi più espressivi. E probabilmente avrai bisogno di un campione sufficientemente grande per ottenere una mappa mentale decente. –