Как создать карту ума из абзаца книги

Сегодня я попытался написать программу, которая бы взяла абзац текста и создала график, показывающий отношения между разными словами. Все прошло хорошо, за исключением того, что я не знаю, как лучше узнать связи. Лучший способ означает похожий на карту разума. Это простой ввод, но я хочу создать программу, которая может взять абзац из википедии и дать очень хорошую карту разума. График, который я получил из вывода программы в точечном формате для следующего ввода, был

roses are red line_end
sky is blue line_end
life is beautiful line_end
everything is going fine line_end file_end

вывод графика

Но для ввода, подобного этому, просто создайте очень большой график, который будет более неясным, чем сам текст.

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

второй вывод, очень неясный

Поэтому мой вопрос в том, какой алгоритм может отлично работать в этой ситуации. Что я должен учиться, чтобы сделать такую ​​программу. Ниже приведена моя программа на C ++. (Я также выполнял обработку текста с использованием ruby, чтобы получить абзац в текущей форме с помощью «line_end» и «file_end», но проблема не в этом)

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

Заранее спасибо :). И если у кого-то есть такой код, пожалуйста, дайте мне. Я хочу сделать это более продуктивным.

5

Решение

В то время как если бы это было несколько грубо, чтобы относиться к языку, как Интернет, я считаю, PageRank (используется поисковой системой Google) имеет некоторые важные сходства с тем, что вы пытаетесь сделать (создайте карту, которая демонстрирует относительную важность).

PageRank Google основан на придании каждому веб-сайту относительной «важности». Поэтому, когда веб-сайт A имеет ссылку на веб-сайт B, B получает «важность» относительно важности A. Например, когда неназванный веб-сайт ссылается на Википедию, Википедия получает небольшое повышение значимости, но если Википедия предоставляет ссылку на другой веб-сайт, этот веб-сайт приобретает гораздо большее значение из-за большой важности Википедии. В PageRank есть еще много нюансов, но это дает вкус.

Точно так же назначение «направления» для связывания слов было бы похоже на то, как один веб-сайт ссылается на другой: «А — это В» — это «связывание» с В. Можно сказать, что «розы — это красные», это как «розы», придающие значение «красным»). , Поскольку многие вещи «красные», слово «красный» приобретет большую значимость — так же, как общие описательные слова, такие как «красный», семантически важны для языка. Надеюсь, это даст вам представление о возможном направлении.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector