Покинул форум
Сообщений всего: 8359
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 359
В этой версии появилось API глубокой обработки естественного языка.
Программу Кибор надо скачать заново. (для просмотра ссылки Вам необходимо авторизоваться)
vector vec, vec1, vec2;// Объект для операции с векторами, так же с помощтю нативной математики в виде простых формул vector M_vec[100];// массив векторов (не допускается более чем одномерные массивы)
Векторная логики if(vec){}// Проверка что в векторе есть смысл. что он не забит нулями. if(vec==0){}// Проверка что в векторе одни нули.
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 параметр - индекс слова который обрабатываем.
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 (слово)
Агрегирование (слияние) всех векторных представлений внутри структуры 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 при агрегирование вектора
*/
Будет создан вектор текста начиная с слова с индексом 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 параметры - индексы слов начального и конечного слова в тексте учавствующие в генерации вопрос - ответ.
#condition[0], 6 - Какие условия применять и на какую глубину массива condition[]
condition - правила в массиве string по которым генерируются тексты Вопрос - Ответ. Пример: string condition[6];
// 0. Подлежащее
condition[0] =
"A:DEP_SUBJ -> "
+ "[Q:DEP_PRED, A:DEP_OBJ|DEP_ATTR]";
Пояснение: 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): шел смотреть
Получение векторов с разными углами внимания на смысловые блоки текста согласно его графу
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";//В эти семантические категории попадают мусорные слова
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");
Пакетное нахождение топ сходства векторов по косинусу
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]);
Тестирование работы алгоритма 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";
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);
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.