Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Без описания
Kibor
Отправлено: 26 Ноября, 2025 - 20:22:52
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8359
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 359




Один из примеров работы NLP к Кибор

(для просмотра ссылки Вам необходимо авторизоваться)


CODE:

//При первой обработке текста ставим 0. При этом текст будет оьбработан и сохранен.
//Затем при последующих запусках ставим 1 что бы обработанный текст считывался с данных файлов
int FILE=0;//С файлов обработанных - 1

//Текст в котором ищем (для начала берем файл не более 50 кб в ANSI)
string File_book="D:\Skript\10000000000\Белый Клык_2.txt";

#define WS_CHILD 0x40000000
#define WS_VISIBLE 0x10000000
#define WS_BORDER 0x00800000
#define WS_VSCROLL 0x00200000
#define ES_MULTILINE 0x0004
#define ES_AUTOVSCROLL 0x0040


external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
external(INT, "ShowWindow", "ShowWindow", "User32.dll" );
external(INT, "UpdateWindow", "UpdateWindow", "User32.dll" );
external(INT, "CreateFont", "CreateFontA", "Gdi32.dll");
external(INT, "SendMessage", "SendMessageA", "User32.dll");
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );



int edit_hwnd;
int button_hwnd;

int input_hwnd;
int send_button_hwnd;

int Zakrit=0;

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 структура и смысловые блоки текста

datasave(
#st[0], 35000,
#fin[0], 35000,
#kvt, 1,
F2); //- Границы смысловых блоков

datasave(
#vec[0], 35000,
F3); //- Вектора


}

else
{

dataload(
#TEXT,
#te[0],
F1); //- NLP структура и смысловые блоки текста

dataload(
#st[0],
#fin[0],
#kvt,
F2); //- Границы смысловых блоков

dataload(
#vec[0],
F3); //- Вектора


}

loop()
{

Vopros[0] = input();
if (Vopros[0]=="") break;
i=1;
PROD:;
string line="";
Find();
CreateDialog();
}









ex:;// Метка конца скрипта






function Find()// Поиск лучшего ответа
{

int write_pos;
int seen_blocks[50];
int seen_count;
int read_pos;
int current_block;
int s;

int Kol_Sbor=50;//Для одного вектора сколько искать топ лучших
int id_TOP[50];
double score_TOP[50];
int TOP_COUNT;




//Алгоритм поиска лучшего ответа
for (int E=0; E<i; E++)//Циклим вопросы
{

line=line+"Вопрос:^n "+Vopros[E];
User_Vector(Vopros[E]);// Векторизация текста пользователя и определение якорного вопроса если есть

TOP_COUNT=0;

TOP_COUNT=findtopcossim (Kol_Sbor, v, #vec[0], kvt, #id_TOP[0], #score_TOP[0]);


//////////////////////////////////////////////////////////////////////////////
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 getmessage(0, WM_CREATE)
{
// Основное окно вывода
edit_hwnd = CreateWindow(0, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, 995, 880, gethwnd(0), 0, 0, 0);
ShowWindow(edit_hwnd, 1);
UpdateWindow(edit_hwnd);

// Поле ввода текста (под edit)
input_hwnd = CreateWindow(0, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_BORDER,
0, 885, 800, 35, gethwnd(0), 0, 0, 0);
ShowWindow(input_hwnd, 1);
UpdateWindow(input_hwnd);

// Кнопка "Отправить" справа от поля
send_button_hwnd = CreateWindow(0, "BUTTON", "Отправить",
0x50010000, 810, 885, 173, 35, gethwnd(0), 0, 0, 0);
ShowWindow(send_button_hwnd, 1);
UpdateWindow(send_button_hwnd);

// Кнопка "Закрыть" внизу
button_hwnd = CreateWindow(0, "BUTTON", "Закрыть",
0x50010000, 0, 930, 1000, 35, gethwnd(0), 0, 0, 0);
ShowWindow(button_hwnd, 1);
UpdateWindow(button_hwnd);

// Шрифт
int h_font = CreateFont(-20, 0, 0, 0, 400, 0, 0, 0, 204, 0, 0, 0, 0, "Arial");
SendMessage(edit_hwnd, 0x30, h_font, 1); // WM_SETFONT
SendMessage(input_hwnd, 0x30, h_font, 1); // Тоже ставим шрифт

// Первичный текст
regexreplace(-1, #line, line, "^n", "^r^n");
SetWindowText(edit_hwnd, line);
}

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);

v=poolvectors(FLAG_VEC_SIM | FLAG_VEC_REL, #txt, 0, kt, #k,
POS_NOUN,_NOUN,
POS_VERB,_VERB,
POS_ADJ,_ADJ,
POS_GER,_GER,
POS_PRTCP,_PRTCP,
POS_ADV,_ADV,
POS_INF,_INF,
Y2, 0 //Множим мусорные слова на 0
);


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);

if (u)//Если выводим лог
{
nlplog(0, #TEXT, 0, kt);
messagebox("Продолжить");
}


kvt=graphvectext(FLAG_VEC_SIM | FLAG_VEC_REL, #TEXT, 0, kt, 0.0, #vec[0], #te[0], 2, #st[0], #fin[0], //
POS_NOUN,_NOUN,
POS_VERB,_VERB,
POS_ADJ,_ADJ,
POS_GER,_GER,
POS_PRTCP,_PRTCP,
POS_ADV,_ADV,
POS_INF,_INF,
Y2, 0, //Множим мусорные слова на 0
FLAG_COREFERENCE, 1,
#test);
return 1;
}



function Load_Baze(){
if(loadsyntaxbase(pathfolder()+"NlpBase\syntax.bin")<1) return 0; //Синтаксическая (часть предложения, род, число, падеж, время, число...)
if(loadsimbase(pathfolder()+"NlpBase\sim.bin")<1) return 0; //Векторная синомичная (молоток - кувалда)
if(loadrelbase(pathfolder()+"NlpBase\rel.bin")<1) return 0; //Векторная отношения (молоток - забить)
if(loadcatbase(pathfolder()+"NlpBase\cat.bin")<1) return 0; //Векторная категории (молоток - бытовой_и_малогабаритный_инструмент | профессиональный_инструмент)
return 1;
}




 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Учебник Кибор »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 




Powered by