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

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

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

> Описание: NLP - глубокая обработка естественного языка
Kibor
Отправлено: 26 Ноября, 2025 - 20:19:10
Post Id



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


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




В этой версии появилось API глубокой обработки естественного языка.
Программу Кибор надо скачать заново.
(для просмотра ссылки Вам необходимо авторизоваться)




Тест работы семантического поиска на простом хостинге PHP

Краткое описание функционала


Структура NLP
Константы и флаги


Кратное описание функций


Структура всей морфологии, семантики и графа
nlp txt;

==================================================================


vector vec, vec1, vec2;// Объект для операции с векторами, так же с помощтю нативной математики в виде простых формул
vector M_vec[100];// массив векторов (не допускается более чем одномерные массивы)

Векторная логики
if(vec){}// Проверка что в векторе есть смысл. что он не забит нулями.
if(vec==0){}// Проверка что в векторе одни нули.

Векторная математика
vec=(vec1*0.9+vec2*0.5)/2;

==========================================================

loadsyntaxbase ("D:\syntax.bin");// Загрузка синтаксической базы
loadsimbase ("D:\sim.bin");// Загрузка векторной базы СИНОНИМИЧНОСТЬ
loadrelbase ("D:\rel.bin");// Загрузка векторной базы ОТНОШЕНИЯ
loadcatbase ("D:\cat.bin");// Загрузка векторной базы КАТЕГОРИИ

В виде параметра принимает путь к базе.
Возвращает число более 0 при успехе.

===========================================================

Синтаксичечкий разбор и построение графа с разрешением анафор местоимений
nlp txt;
syntaxanalys(#txt, "текст который разбираем");

1 параметр - структура nlp
2 параметр - текст в string для разбора

Возвращает количество слов.
Структура txt заполнена полностью (кроме .catcount .cat .catscore и .vcatidx, .vsimidx, .vrelidx, .vsim, .vrel, .vcat)
Они заполняются при вызове assigncats
Для семантического разрешения анафор неоходима загрузка всех векторных баз.


===========================================================

Семантический анализ

1)
assigncats(#txt, 3, 0, 20);
1 параметр - укзатель на структуру nlp, обработанную до этого syntaxanalys
2 параметр - количество семантических категорий (от 0 до 10)
3 4 параметры - стартовый и финишный индексы слов, участок который обрабатываем.

2)
assigncats(#txt, 3, 0);
1 параметр - укзатель на структуру nlp, обработанную до этого syntaxanalys
2 параметр - количество семантических категорий (от 0 до 10)
3 параметр - индекс слова который обрабатываем.

Возвращает 1 при успехе.

===========================================================

Получение топ близких слов по векторным базам

string Word_SIM[10];
int Id_SIM[10];
int Baze_SIM[10];
double score_SIM[10];
int ks_SIM;
ks_SIM = nearvector(FLAG_VEC_SIM, 10, #Id_SIM[0], #Baze_SIM[0], #score_SIM[0], #Word_SIM[0], "слово", FLAG_POS_VERB);// по слову
nearvector(FLAG_VEC_REL, 10, #Id_SIM[0], #Baze_SIM[0], #score_SIM[0], #Word_SIM[0], vec, FLAG_POS_VERB);// по вектору

1 параметр - комбинация флагов (FLAG_VEC_SIM, FLAG_VEC_REL, FLAG_VEC_CAT) по каким базам искать. Допускается FLAG_VEC_SIM | FLAG_VEC_REL | FLAG_VEC_CAT
2 параметр - количество топ слов получаемых.
3 параметр - массив int в который запишутся индексы с баз в которых нашли.
4 параметр - массив int в который запишутся с какой базы взяли этот интекс FLAG_VEC_SIM или FLAG_VEC_REL или FLAG_VEC_CAT
5 параметр - массив double в который запишутся оценки насколько слово близко.
6 параметр - массив string в который запишутся слова или категории.
7 параметр - слово или вектор, по которому будет произведен анализ.
8 параметр не обязательный (фильтры по каким признакам выбирать слова и категории):
FLAG_POS_NOUN - Только существительные (и их производные)
FLAG_POS_VERB - Только глаголы (и их производные)
FLAG_POS_ADJ - Только прилагательные (и их производные)
FLAG_POS_ADV - Только наречия (и их производные)
Допускается комбинация этих флагов через |

Возвращает количество полученных слов.

==================================================================================

Получение вектора по слову

1)
vector vec;
int id=findvectoridx(FLAG_VEC_SIM, #vec, "слово");

1 параметр - флаг FLAG_VEC_SIM или FLAG_VEC_REL. Комбинация не допускается
2 параметр - указатель на вектор куда запишется вектор.
3 параметр - string (слово)

Возвращает ID вектора в базе или -1 при отсутствие.

2)
int ID;
vector vec=findvector(FLAG_VEC_SIM, #ID, "слово");

1 параметр - флаг FLAG_VEC_SIM или FLAG_VEC_REL. Комбинация не допускается
2 параметр - указатель на int rуда запишется ID вектора в базе.
3 параметр - string (слово)

Возвращает вектора в базе.


==================================================================================

Нормализация вектора

vector vec=normalize(vec);


==================================================================================

Агрегирование (слияние) всех векторных представлений внутри структуры nlp для получения итогового смыслового вектора текста. В предела заны текста. Требует предварительной обработки syntaxanalys и assigncats

nlp txt;
/*
Особые условия
Допускается указывать любые константы полученные после обработки syntaxanalys
Так же можно указавать условия, проверяя все поля string структуры nlp:
txt.lemma[5]=="тумбочка"
txt.wh[0]=="когда"
и т.д.
*/
string Tagset="DEP_SUBJ CAT:мебель|емкость:3";//Если слово подлежащее и семантические категории его мебель или емкость, на глубине топ 3
/*
особые условия Tagset имеют приоритет над простыми параметрами указывающие какая часть речи будет иметь какое влияние. То есть если стоит
DEP_SUBJ, 2, Tagset, 3
то слово попавшее под описание Tagset будет иметь множитель влияния = 3 при агрегирование вектора
*/

1 краткая)
vector vec=poolvectors(FLAG_VEC_SIM | FLAG_VEC_REL, #txt, 0, 100, #k);

Будет создан вектор текста начиная с слова с индексом 0 до слова с индексом 100.
1 параметр - комбинация флагов с каких баз брать вектора для агрегирования.
2 параметр - указатель на структуру nlp которую уже заполнил syntaxanalys
3 4 параметры - старт и финиш зоны в пределах которой будет слияние их векторов в один.
5 параметр - указатель на int в который запишется реальное количество слов участвующих в векторизации


2 полная)
vector vec=poolvectors(FLAG_VEC_SIM | FLAG_VEC_REL, #txt, 0, 100, #k, POS_NOUN, 1, POS_VERB, 0.5, Tagset, 2, FLAG_COREFERENCE, 0.7);
Все дополнительные параметры не обязательны и могут комбинироваться в любой комбинации (соблюдая порядок)
POS_NOUN, 1, POS_VERB, 0.5 - означает что слова которые графом определены как Подлежащее будет иметь влияние 1, а Сказуемое 0.5.
Допускается использование всех POS_ констант.
В отличие от короткой функции, если мы указали хоть одну константу, остальные слова которые не попали под эти условия не учавствуют в слияние вообще.
Tagset, 2 - означает что слово попавшее под специальное описание Tagset имеет множитель влияния 3. Имеет приоритет над константами POS_.
FLAG_COREFERENCE, 0.7 - означает что при агрегирование вместо местоимений будут использоваться вектора слов которые заменяют его. С силой влияния 0.7.

Вектора рассчитываются от всех кандидатов согласно множителям оценки вероятности.
Пояснение:

string Text="В углу стояла тумбочка и висела картина. Она на ножках";

При получение вектора "Она на ножках" будет использована формула:
Вместо местоимения будет вектор (тумбочка*0.366*0.7+картина*0.207*0.7) согласно вероятности кандидатов - Она - ->->->- тумбочка [ 3 - ( 0.366 ) ], картина [ 6 - ( 0.207 ) ]

Данные вероятности рассчитываются отдельным алгоритмом в syntaxanalys при условие подключения всех четырех баз.

Возвращает вектор текста.

=============================================================

Обобщенный вектор сырого текста

1 краткая)
vector vec=texttovec(FLAG_VEC_SIM | FLAG_VEC_REL, "В углу стояла тумбочка и висела картина");//Обобщенный вектор текста
Будет создан вектор текста
1 параметр - комбинация флагов с каких баз брать вектора для агрегирования.
2 параметр - string в котором текст

2 полная)
string Tagset="DEP_SUBJ CAT:мебель|емкость:3";//Если слово подлежащее и семантические категории его мебель или емкость, на глубине топ 3
vector a=texttovec(FLAG_VEC_SIM | FLAG_VEC_REL, "В углу стояла тумбочка и висела картина", POS_NOUN,1, POS_VERB,0.7, Tagset, 2);//Обобщенный вектор текста
Все дополнительные параметры не обязательны и могут комбинироваться в любой комбинации (соблюдая порядок)
POS_NOUN, 1, POS_VERB, 0.7 - означает что слова которые графом определены как Подлежащее будет иметь влияние 1, а Сказуемое 0.5.
Допускается использование всех POS_ констант.
В отличие от короткой функции, если мы указали хоть одну константу, остальные слова которые не попали под эти условия не учавствуют в слияние вообще.
Tagset, 2 - означает что слово попавшее под специальное описание Tagset имеет множитель влияния 2. Имеет приоритет над константами POS_.

Возвращает вектор текста.

=============================================================

Получение пар “вопрос - ответ” из текста согласно обходу графа. Требуется предварительная обработка assigncats


nlp tex;
int k; // сколько пар получили
string kq[50]; // текст вопроса
string ka[50]; // текст ответа
int st[50]; // индекс первого слова входящего в вопрос или ответ
int fin[50]; // индекс последнего слова входящего в вопрос или ответ

1 краткая)
k=questionanswer(#tex, 0, 100, 0.1, #kqz[0], #kq[0], 2, #ka[0], 2, #st[0], #fin[0]);
1 параметр - указатель на структуру nlp
2 3 параметр - старт и финиш зоны в пределах которой будет генерирование "вопросно - ответных" пар.
4 параметр - графовые связи ниже этой оценки считать недействительными
5 параметр - массив string в который запишется значение вопроса . Например для вопроса КТО? - значение "субъект". Для КОГДА? - значение "время"
6 8 параметры - массив string в который запишется соответственно вопрос и ответ.
7 9 параметры - глубины обхода графа при генерации вопроса и ответа.
10 11 параметры - индексы слов начального и конечного слова в тексте учавствующие в генерации вопрос - ответ.

Возвращает количество полученных пар.


2 полная)
k=questionanswer(#tex, 0, kt, 0.0, #kqz[0], #kq[0], 2, #ka[0], 2, #st[0], #fin[0], #condition[0], 6, FLAG_COREFERENCE);// #kq[0], 2 (глубина сбора по графу), #ka[0], 3 - (глубина сбора по графу)

#condition[0], 6, FLAG_COREFERENCE не обязательные параметры

---------------------------------------------------------------


#condition[0], 6 - Какие условия применять и на какую глубину массива condition[]


condition - правила в массиве string по которым генерируются тексты Вопрос - Ответ. Пример:
string condition[6];
// 0. Подлежащее
condition[0] =
"A:DEP_SUBJ -> "
+ "[Q:DEP_PRED, A:DEP_OBJ|DEP_ATTR]";

// 1. Сказуемое
condition[1] =
"A:DEP_PRED -> "
+ "[Q:DEP_SUBJ|DEP_ATTR, A:DEP_PRED]";

// 2 Дополнение
condition[2] = "A:DEP_OBJ -> [Q:DEP_PRED|DEP_SUBJ, A:DEP_ATTR|DEP_PART] ";

// 3. Прилагательное, причастие
condition[3] =
"A:DEP_ATTR -> "
+ "[Q:DEP_SUBJ|DEP_OBJ|DEP_PRED|DEP_ATTR, A:DEP_SUBJ|DEP_OBJ]";

// 4. Обстоятельство
condition[4] =
"A:DEP_ADV -> "
+ "[Q:DEP_PRED|DEP_SUBJ|DEP_ATTR, A:DEP_ADV|DEP_GER]";

// 5. Деепричастие
condition[5] =
"A:DEP_GER -> "
+ "[Q:DEP_SUBJ|DEP_PRED|DEP_ATTR|DEP_ADV, A:DEP_GER|DEP_PRED]";
}

Пояснение:
string text="Вася шел с женой в театр смотреть оперу";

condition[0] =
"A:DEP_SUBJ -> "//Если ответное слово Подлежащее - Вася
+ "[Q:DEP_PRED, A:DEP_OBJ|DEP_ATTR]";
//В вопросе собираем Вопрос (кто) + Q:DEP_PRED - Сказуемое (шел смотреть)
//В ответе собираем Ответное слово (Вася) + A:DEP_OBJ|DEP_ATTR - Дополнение и Определение(театр оперу)
Значение (kqz): субъект
Вопрос (kq): кто шел смотреть?
Ответ (ka): Вася в театр оперу
st[0]=0;//Индекс первого слова вошедшего в текст Вопрос - Ответ
fin[0]=7;//Индекс последнего слова вошедшего в текст Вопрос - Ответ


condition[1] =
"A:DEP_PRED -> "//Если ответное слово Сказуемое - шел
+ "[Q:DEP_SUBJ|DEP_ATTR, A:DEP_PRED]";
//В вопросе собираем Вопрос (что делал) + Q:DEP_SUBJ|DEP_ATTR - Подлежащее (Вася) .. DEP_ATTR отсутствует и собран не был
//В ответе собираем Ответное слово (шел) + A:DEP_PRED - Сказуемое(смотреть)
Значение (kqz): действие_прошлое
Вопрос (kq): что делал Вася?
Ответ (ka): шел смотреть

---------------------------------------------------------------

FLAG_COREFERENCE - Вместо местоимений подставлять кандидатов на него.

==============================================================================================


Получение векторов с разными углами внимания на смысловые блоки текста согласно его графу

int kvt=0;//Количество полученных векторов
string te[3500];//Массив на блоки текста играющего роль ответа для вектора
vector vec[3500];//Массив векторов смысловых блоков текста
int st[3500]; // индекс первого слова входящего в смысловой блок
int fin[3500]; // индекс последнего слова входящего в смысловой блок +1
string test;// Тут будет визуализация как агрегируются смысловые вектора блоков текста с учетом важности слов для кажого вектора


1 краткая)
kvt=graphvectext(FLAG_VEC_SIM | FLAG_VEC_REL, #tex, 0, 1000, 0.0, #vec[0], #te[0], 2, #st[0], #fin[0]);
1 параметр - комбинация флагов с каких баз брать вектора для агрегирования.
2 параметр - указатель на структуру nlp которую уже заполнил syntaxanalys
3 4 параметры - старт и финиш зоны в пределах которой будет слияние их векторов в один.
5 параметр - графовые связи ниже этой оценки считать недействительными
6 параметр - указатель на массив векторов в который запишутся вектора смысловых блоков текста
7 параметр - указатель на массив string в который запишутся тексты играющие роль ответа для вектора
8 параметр - глубина обхода графа при агрегирование смысла
9 10 параметр - индекс первого и последнего + 1 слова входящего в смысловой блок

Возвращает количество полученных векторов.


2 полная)
string Tagset = "CAT:служебное_слово|предлог|местоимение|местоимение_указывающее_на_себя|союз:3";//В эти семантические категории попадают мусорные слова

kvt=graphvectext(FLAG_VEC_SIM | FLAG_VEC_REL, #tex, 0, 1000, 0.0, #vec[0], #te[0], 2, #st[0], #fin[0],
POS_NOUN, 1, POS_VERB, 0.7,
Tagset, 0, //Множим мусорные слова на 0
#condition[0], 6,
FLAG_COREFERENCE, 0.5, #test);

POS_NOUN, 1, POS_VERB, 0.7 - означает что слова которые графом определены как Подлежащее будет иметь влияние 1, а Сказуемое 0.7.
Tagset, 0 - означает что слово попавшее под специальное описание Tagset имеет множитель влияния 0. при 0 мы получаем его игнор и оно не вносит смысл в вектор. Имеет приоритет над константами POS_.
#condition[0], 6, - Какие условия применять и на какую глубину массива condition[]


condition - правила в массиве string по которым состоится обход графа. Пример:
string condition[6];
// 0. Подлежащее
condition[0] =
"DEP_SUBJ -> [DEP_OBJ|DEP_ATTR]";//Если сбор идет от DEP_SUBJ - собрать к нему DEP_OBJ и DEP_ATTR

FLAG_COREFERENCE, 0.5 - означает что при агрегирование вместо местоимений будут использоваться вектора слов которые заменяют его. С силой влияния 0.5.

Вектора расчитываются от всех кандидатов согласно множетелям оценки вероятности.
Пояснение:
string Text="В углу стояла тумбочка и висела картина. Она на ножках";
При получение вектора "Она на ножках" будет использована формула:
Вместо местоименя будет вектор (тумбочка*0.366*0.5+картина*0.207*0.5) согласно вероятности кандидатов - Она - ->->->- тумбочка [ 3 - ( 0.366 ) ], картина [ 6 - ( 0.207 ) ]

#test - В данный string будет записана визуализация создания вектиоров с силой влияния отдельных слов (их векторов):

0 В [0.000000] углу [1.300000] стояла [0.660000] тумбочка [0.660000]
1 В [0.000000] углу [2.000000] стояла [0.660000] тумбочка [1.300000]
2 В [0.000000] углу [0.660000] стояла [2.000000] тумбочка [1.300000]
3 В [0.000000] углу [0.660000] стояла [1.300000] тумбочка [2.000000]
4 висела [2.000000] картина [1.300000]
5 висела [1.300000] картина [2.000000]
6 { Она -> тумбочка [0.365857] картина [0.206963] } на [0.000000] ножках [0.660000]
7 { Она -> тумбочка [0.237807] картина [0.134526] } на [0.000000] ножках [0.660000]
8 { Она -> тумбочка [0.120733] картина [0.068298] } на [0.000000] ножках [2.000000]

===============================================================================================================================

Создание данных для запуска семантического поиска на PHP

Для создания необходимо иметь расчитанные вектора и смысловые блоки текста.

string te[1000];//Тексовые блоки в которых ответы
vector vec[1000];//Вектора блоков для этогго ответа
int kvt=1000;//Количество пар текст-вектор
string s_redkii[50];//Не распознанные слова (отсутствующие в базе) распознание произошло по контенту
vector s_redkii[50];//Вектора не распознанных слов (отсутствующие в базе) распознание произошло по контенту
int kvt=1000;//Количество пар слово-вектор
//"D:\Chat\1" путь где сохранятся нужные файлы для php скрипта что бы работал семантический поиск на нем
int e=phpsemantic (#te[0], #vec[0], kvt, #s_redkii[0], #s_redkii[0], kml_redkii, "D:\Chat\1");



Возвращает 1 при успехе.


========================================================================

Пакетное нахождение топ сходства векторов по косинусу

int Kol_Sbor=10;//Топ в каком количестве собираем
vector v;//Вектор который сравниваем с массивом векторов
vector vec[100];//Массив векторов с которым сравниваем
int kvt=100;// Сколько сравниваем с массива vec
int id_TOP[10];//Номера векторов с массива vec в топе от большего по убыванию
double score_TOP[10];//Сравнительные оценки сходства векторов с массива vec в топе от большего по убыванию


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

Возвращает количество найденного топ.

===================================================================



Вычисление сходства векторов по косинусу


vector vec1;//Вектор 1
vector vec2];//Вектор 1


double score=cossim(vec1, vec2 );

Возвращает косинус между векторами

===================================================================





Тестирование работы алгоритма NLP в реальном времени

Выводит диалог с полным разбором текста в 4 полях. Не следует выводить большой текст во избежание тормозов.
1 - показывает разбивку на смысловые блоки
2 - синтаксис и морфологию
2 - граф
4 - семантика слов и решение кандидатов к местоимениям всем.
nlplog(1, #tex[2], 0, 100);//Открыть лог
1 параметр - номер окна лога (можно выводить одновременно несколько)
2 параметр - указатель на структуру nlp
3 4 параметры - первый и последний индекс слов выводимых в лог

nlplog(1, 0);//Закрыть лог
1 параметр - номер окна лога

===================================================================
(Добавление)
Пример кода семантического поиска


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