Покинул форум
Сообщений всего: 8359
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 359
Один из примеров работы NLP к Кибор
(для просмотра ссылки Вам необходимо авторизоваться)
CODE:
//При первой обработке текста ставим 0. При этом текст будет оьбработан и сохранен.
//Затем при последующих запусках ставим 1 что бы обработанный текст считывался с данных файлов
int FILE=0;//С файлов обработанных - 1
//Текст в котором ищем (для начала берем файл не более 50 кб в ANSI)
string File_book="D:\Skript\10000000000\Белый Клык_2.txt";
int kvt=0;
string te[35000];
vector vec[35000];
int st[35000]; // индекс первого слова входящего в вопрос или ответ
int fin[35000]; // индекс последнего слова входящего в вопрос или ответ +1
string test;
if (Load_Baze()==-1){messagebox ("Отсутствуют базы. Возможно надо переустановить Кибор."); goto ex;}
//Текст в котором ищем (для начала берем файл не более 50 кб в ANSI)
string Text;
if (FILE==0)
{
if(fopen(File_book,"r")!=0)//Путь к файлу текста в ANSI
{
freadall(#Text);
fclose();
}
}
//Список вопросов юзера
string Vopros[10];
int i=0;
//Особые правила для векторизации
string Y2 = "CAT:служебное_слово|предлог|местоимение|местоимение_указывающее_на_себя|союз:3";//В эти семантические категории попадают мусорные слова
int k;// В нем реальное количество слов участвующих в векторизации
int kt;// Количество слов
nlp txt;//Структура nlp для общего пользования
nlp TEXT;//Структура nlp для самого текста
vector v;//Вектор текста пользователя
double _NOUN = 2, _VERB = 2, _ADJ = 2, _GER = 1.5, _PRTCP = 1, _ADV = 1, _INF = 2; //Веса по умолчанию (если не указаны особо другие условия в правилах, только эти части речи будут учавствовать с такими весами)
int ksp;//Количество сгенерированных QA c кореференции местоимений
//Пути к сохранению.
string F1=pathfolder()+"тест5_1.txt";
string F2=pathfolder()+"тест5_2.txt";
string F3=pathfolder()+"тест5_3.txt";
if (FILE==0)
{
///////////
if (Text_Vector(0)==-1) goto ex; //Синтаксически семантический разбор текста и Получение QA пар текста. 0 не выводить лог. 1 выводить
if (fopen (pathfolder()+"5тест.txt", "w")!=0) {
fwrite(test);//записываем в файл перевод строки
fclose();
start(pathfolder()+"5тест.txt");
}
///////////
//Вот что сохраняем
datasave(
#TEXT, 1,
#te[0], 35000,
F1); //- NLP структура и смысловые блоки текста
//////////////////////////////////////////////////////////////////////////////
write_pos = 0;
seen_count = 0;
for (read_pos = 0; read_pos < TOP_COUNT; read_pos++)
{
current_block = st[id_TOP[read_pos]];
for (s = 0; s < seen_count; s++)
{
if (seen_blocks[s] == current_block) goto ss;
}
seen_blocks[seen_count] = current_block;
seen_count++;
if (write_pos != read_pos)
{
id_TOP[write_pos] = id_TOP[read_pos];
score_TOP[write_pos] = score_TOP[read_pos];
}
write_pos++;
ss:;
}
TOP_COUNT = write_pos;
/////////////////////////////////////////////////////////////
if (TOP_COUNT>10) TOP_COUNT=10;
line=line+"^n^nОтвет:^n";//Формируем ответ
for (int n=0; n<TOP_COUNT; n++)
{
line=line+te[id_TOP[n]]+" "+format(score_TOP[n])+"^n^n";//Формируем ответ
//line=line+format(n)+") "+te[id_TOP[n]]+" "+"^n^n";//Формируем ответ
}
line=line+"^n====================^n";
}
}
function getmessage(0, WM_COMMAND)
{
if (message.lparam == button_hwnd) // Если нажали "Закрыть"
{
Zakrit = 1;
}
if (message.lparam == send_button_hwnd) // Если нажали "Отправить"
{
char с_user_input[2000];
string user_input;
GetWindowText(input_hwnd, address(#с_user_input[0]), sizearray(с_user_input));
user_input=format(#с_user_input[0]);
if (user_input != "")
{
Vopros[0]=user_input;
i=1;
destroydialog(0);
goto global PROD;
}
}
}
function CreateDialog()
{
createdialog(0);
showdialog(0, "Окно с EDIT", 10, 10, 1000, 1000, 1, 0);
Zakrit = 0;
loop()
{
if (Zakrit == 1) break;
sleep(10);
}
destroydialog(0);
}
// Векторизация текста пользователя и определение якорного вопроса если есть
function User_Vector(string user_text)
{
//Производим полный синтаксический разбор текста пользователя и строим граф. Так же разрешаем синтаксическою и семантическое разрешение местоимений (с указанием вероятности). Семантика работает независимо от assigncats точечно.
kt=syntaxanalys(#txt, user_text);
//Определение полной семантики всех слов текста пользователя на указанную глубину ТОП (тут указаваем 1)
assigncats(#txt, 5, 0, kt);
int t;
for (int n=0; n<kt; n++)
{
//Если лема совпадает с вопросным словом - это есть вопрос пользователя ()
//0 [ПОДЛ] кто -> [ кто (субъект) - что делал на себя (действие_прошлое) ] -> [СКАЗ] плыл = ( 0.750 ) - 0 - 1
//Согласно графовому закону оно связано с словами целями что хочет узнать
if (txt.lemma[n]==txt.wh[n])
{
//Находим прямые слова связанные с вопросным словом в графе и усиливаем их.
for (int n1=0; n1<txt.count[n][DEP_SUBJ]; n1++)//Если прямые слова в графе полежащее
{
t=txt.connect[n][DEP_SUBJ][n1];
v=v+txt.vsim[t]+txt.vrel[t];
}
for (n1=0; n1<txt.count[n][DEP_PRED]; n1++)//Если прямые слова в графе сказуемое
{
t=txt.connect[n][DEP_PRED][n1];
v=v+txt.vsim[t]+txt.vrel[t];
}
for (n1=0; n1<txt.count[n][DEP_OBJ]; n1++)//Если прямые слова в графе дополнение
{
t=txt.connect[n][DEP_OBJ][n1];
v=v+txt.vsim[t]+txt.vrel[t];
}
for (n1=0; n1<txt.count[n][DEP_ATTR]; n1++)//Если прямые слова в графе определение
{
t=txt.connect[n][DEP_ATTR][n1];
v=v+txt.vsim[t]+txt.vrel[t];
}
for (n1=0; n1<txt.count[n][DEP_ADV]; n1++)//Если прямые слова в графе обстоятельство
{
t=txt.connect[n][DEP_ADV][n1];
v=v+txt.vsim[t]+txt.vrel[t];
}
for (n1=0; n1<txt.count[n][DEP_GER]; n1++)//Если прямые слова в графе деепричастие
{
t=txt.connect[n][DEP_GER][n1];
v=v+txt.vsim[t]+txt.vrel[t];
}
}
}
}
//Синтаксически семантический разбор текста и Получение QA пар текста
function Text_Vector(int u)
{
//Производим полный синтаксический разбор текста и строим граф. Так же разрешаем синтаксическою и семантическое разрешение местоимений (с указанием вероятности). Семантика работает независимо от assigncats точечно.
kt=syntaxanalys(#TEXT, Text);
if (kt==0) return -1;//Если Текста нет
//Определение полной семантики всех слов текста на указанную глубину ТОП (тут нет необходимости, поэтому указавваем 0. Берем только индексы с баз веторов синомичная, отношения)
assigncats(#TEXT, 0, 0, kt);
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.