2014-04-30 7 views
5

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 

graphviz output

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 

second output ,very obscure

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.

+1

Qual è il problema con il codice che hai postato? Non funziona? Segnala un errore? Produce risultati errati? È troppo lento? Manca qualche funzionalità? – CoryKramer

+0

@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

+1

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. –

risposta

0

Mentre se potrebbe essere un po 'rozzo trattare un linguaggio come Internet, credo che PageRank (utilizzato dal motore di ricerca di Google) abbia alcune importanti somiglianze con quello che si sta tentando di fare (creare una mappa che dimostri l'importanza relativa).

Il PageRank di Google si basa sul dare a ciascun sito Web una "importanza" relativa. Quindi, quando il sito A ha un link al sito B, B riceve "importanza" rispetto all'importanza di A. Ad esempio, quando un sito web senza nome si collega a Wikipedia, Wikipedia ottiene un piccolo incremento di importanza, ma se Wikipedia fornisce un collegamento a un altro sito Web, quel sito Web assume molta più importanza a causa della grande importanza di Wikipedia. Ci sono molte altre sfumature a PageRank, ma questo dà un assaggio. Allo stesso modo, assegnare "direzione" a parole di collegamento sarebbe come un sito web che si collega a un altro: "A is B" è A "linking" a B. Si potrebbe dire "rose sono rosse" è come "rose" che danno importanza a "rosso". Poiché molte cose "sono rosse", la parola "rosso" otterrebbe una grande quantità di "importanza" - proprio come le parole descrittive comuni come "rosso" sono semanticamente importanti per il linguaggio. Spero che questo ti dia un'idea di una possibile direzione.