2014-04-30 6 views
5

Heute habe ich versucht, ein Programm zu schreiben, das einen Textabsatz aufnehmen und ein Diagramm erstellen würde, das Beziehungen zwischen verschiedenen Wörtern zeigt. Alles ist gut gelaufen, außer dass ich nicht weiß, wie ich die Zusammenhänge besser herausfinden kann. Besserer Weg bedeutet ähnlich wie eine Mind Map. Dies ist eine einfache Eingabe, aber ich möchte ein Programm erstellen, das einen Absatz aus Wikipedia aufnehmen kann und eine sehr gute Mind Map gibt. Die Grafik, die ich für die folgende Eingabe aus dem Punktformat Ausgang meines Programms erhielt, warSo erstellen Sie eine Mind Map aus einem Absatz eines Buches

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

Aber für einen Eingang wie dieser Eingang, es ist nur ein sehr großes Diagramm zu erstellen, die dunkler ist als der Text selbst.

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

Also meine Frage ist, was Algorithmus kann hier in dieser Situation gut funktionieren. Was sollte ich studieren, um so ein Programm zu machen? Unten ist mein C++ Programm. (Ich habe auch Textverarbeitung Rubin mit dem Absatz in der aktuellen Form mit „ZEILE ENDE“ zu bekommen und „file_end“ aber das ist nicht, wo ich bin immer Problem)

#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; 
    } 

Vielen Dank im Voraus :) .und wenn jemand eine solche Art von Code hat, bitte geben Sie mir. Ich möchte mein Studium dadurch produktiver machen.

+1

Was ist das Problem mit dem von Ihnen geposteten Code? Funktioniert es nicht? Gibt es einen Fehler? Führt es zu falschen Ergebnissen? Ist es zu langsam? Fehlt etwas Funktionalität? – CoryKramer

+0

@Cyber ​​Bitte schauen Sie sich die "so ist die Frage ist" Teil direkt über dem Code ... Code funktioniert gut. Ich möchte über einen besseren Weg wissen, es zu tun. – kuroop

+1

Nur einige lose Ideen: Ihre Knoten und Kanten müssen mehr Daten tragen. Die Knoten sollten wahrscheinlich zählen, wie oft das Wort auftritt und wie oft das Wortpaar im selben Satz auftritt, so dass Sie nach der Verarbeitung "schwache" Knoten und Kanten aus dem Diagramm löschen können. Sie benötigen eine größere Stoppwortliste oder sogar eine, die während der Verarbeitung lernt. Schließlich wird das Stemmen (d. H. Das Reduzieren von Wörtern zu ihren Stämmen durch Abschneiden von Suffixen) weniger, aber hoffentlich ausdrucksstärkere Knoten ergeben. Und Sie werden wahrscheinlich ein ausreichend großes Sample benötigen, um eine anständige Mind Map zu erhalten. –

Antwort

0

Während wenn etwas grob sein könnte, um Sprache wie das Internet zu behandeln, glaube ich, dass PageRank (von der Google-Suchmaschine verwendet) einige wichtige Ähnlichkeiten zu dem, was Sie versuchen, zu tun (erstellen Sie eine Karte, die die relative Bedeutung zeigt).

Googles PageRank basiert darauf, jeder Website eine relative "Wichtigkeit" zu geben. Wenn also Website A einen Link zu Website B hat, erhält B "Wichtigkeit" in Bezug auf die Wichtigkeit von A. Zum Beispiel, wenn eine No-Name-Website auf Wikipedia verlinkt, bekommt Wikipedia einen kleinen Wertzuwachs, aber wenn Wikipedia einen Link zu einer anderen Website anbietet, wird diese Website wegen der großen Bedeutung von Wikipedia viel wichtiger. Es gibt viele weitere Nuancen zu PageRank, aber das gibt einen Geschmack.

Ähnlich wie die Zuordnung von "direction" zu verknüpfenden Wörtern wäre wie eine Website zu einer anderen: "A is B" ist A "linking" zu B. Man könnte sagen "Rosen sind rot" ist wie "Rosen" zu "rot". Da viele Dinge "rot" sind, würde das Wort "rot" eine große Menge an "Wichtigkeit" bekommen - genauso wie übliche beschreibende Wörter wie "rot" für die Sprache semantisch wichtig sind. Hoffentlich gibt Ihnen das eine Vorstellung von einer möglichen Richtung.