Распознавание слов естественного языка с использованием нейросетей

Автор работы: Пользователь скрыл имя, 12 Мая 2012 в 21:54, курсовая работа

Краткое описание

В данном курсовом проекте была разработана программа-анализатор слов естественного языка с использованием нейросети.
В ходе выполнения данного курсового проекта была разработана библиотека, содержащая классы для лексического анализа слов естественного языка с использованием нейросети (для решения поставленной задачи была выбрана нейросеть обратного распространения ошибки), была написана тестирующая программа, подготовлены тесты. При тестировании, после соответствующей настройки, программа не допустила ни одной ошибки.

Содержание работы

Введение
1. Анализ нейронных сетей
1.1 Выбор разновидности сети
1.2 Модель многослойного персептрона с обучением по методу обратного распространения ошибки
1.3 Постановка задачи
2. Проектирование библиотеки классов для реализации нейросети и тестовой программы
2.1 Программная реализация нейросети обратного распространения ошибки
2.2 Класс перевода текста в двоичный вид
2.3 Класс хеш-таблицы и методов работы с ней
2.4 Класс разбиения текста на лексемы и распознавания
2.5 Описание тестирующей программы
2.6 Результаты тестирования
3. Руководство программисту
Заключение
Список используемой литературы
Приложения

Содержимое работы - 1 файл

ф1.docx

— 220.45 Кб (Скачать файл)

flag_ie = true;

return res;

}

else

if (String.Compare(okonchanie, "ми") == 0)

{

string ok_i_suff = sLetter[sLetter.Length - 4].ToString() + sLetter[sLetter.Length - 3].ToString() + okonchanie;

if (Array.IndexOf(prich, ok_i_suff)!= -1)

{

return "причастие";

}

string res = GetNeuroResult(sLetter, "-ми", N_HID, beta, m, Epoch, flag_mi);

flag_mi = true;

return res;

}

else

{

return "существительное";

}

}

}

 

Приложение В. Листинг класса Binaryzation

 

class Binarization

{

string[] sLetter;

int iLengthPattern;

public Binarization(string[] sLetter1)

{

sLetter = sLetter1;

}

private string DecToBin(string value)

{

value.Trim(); // очищаем строку от пробелов

char[] array = null; /* массив для хранения двоичных чисел ввиде символов */

int degree = Convert.ToInt32(value) / 255; /* получаем степень  возведения для отображения количества 0 в массиве */

if (degree <= 255 && Convert.ToInt32(value) <= 255) /* если степень  входит в стандартный диапазон 8 цифр */

array = new char[8];

else /* иначе  вычисляем наш диапазон цифр */

{

if (degree == 1) /* если оставить 1, то получится  первое условие, а нам надо  чтобы выполнилось второе */

degree++;

array = new char[8 * degree];

}

int position = array.Length - 1; /* двоичные цифры считаются  с конца в начало, соответственно  писать мы их будем, тоже  с конца в начало */

int nextValue = Convert.ToInt32(value); /* здесь будет хранится  наше значение, которое мы будем делить на 2 и проверять есть ли остаток от деления */

for (int i = 0; i < array.Length; i++) /* в этом цикле  мы будем заполнять наш массив  значениями */

{

if ((Convert.ToInt32(nextValue) % 2)!= 0) /* проверяем есть ли остаток от деления */

{

nextValue /= 2; /* в любом случае записываем  результат, для дальнейших расчетов */

array[position] = '1'; /* устанавливаем 1 если остаток есть */

}

else

{

nextValue /= 2; /* в любом случае записываем  результат, для дальнейших расчетов */

array[position] = '0'; /* устанавливаем 0 если остатка нет */

}

position--; /* уменьшаем итератор */

}

string ret = ""; // пустая строка для хранения  результата

for (int i = 0; i < array.Length; i++) /* в этом цикле  уже записываем в нашу строку, наше двоичное число, с начала и до конца */

ret += array[i].ToString();

return ret;

}

public double[] GetBinarizeWord(string sWord)

{

int iSum = 0; string sBuf = ""; int k = 0;

for (int j = 0; j < sWord.Length; j++)

{

iSum = iSum + (j + 5) * Char.ConvertToUtf32(sWord[j].ToString(), 0);

}

sBuf = DecToBin(iSum.ToString());

k = 0;

while (sBuf[k]!= '1')

{

k++;

}

sBuf = sBuf.Substring(k, sBuf.Length - 1 - k);

double[] test = new double[iLengthPattern];

for (int j = 0; j < iLengthPattern; j++)

{

if (sBuf.Length <= j)

{

test[j] = 0;

}

else

if (sBuf[j] == '1')

{

test[j] = 1;

}

}

return test;

}

public double[,] GetBinarizeText(out double[,] OUT_PATTERNS, out int max_pat, out int iLengthPattern1)

{

max_pat = sLetter.Length;

OUT_PATTERNS = new double[sLetter.Length, 3];

int iSum = 0; string sBuf; int k = 0; iLengthPattern1 = 0; string[] sBigBuf = new string[sLetter.Length];

for (int i = 0; i < sLetter.Length; i++)

{

iSum = 0;

for (int j = 0; j < sLetter[i].Length - 1; j++)

{

iSum = iSum + (j + 5) * Char.ConvertToUtf32(sLetter[i][j].ToString(), 0);

}

switch (sLetter[i][sLetter[i].Length - 1])

{

case '@': OUT_PATTERNS[i, 0] = 0; OUT_PATTERNS[i, 1] = 0;

OUT_PATTERNS[i, 2] = 0;

break;

case '#': OUT_PATTERNS[i, 0] = 0; OUT_PATTERNS[i, 1] = 0;

OUT_PATTERNS[i, 2] = 1;

break;

case '*': OUT_PATTERNS[i, 0] = 0; OUT_PATTERNS[i, 1] = 1;

OUT_PATTERNS[i, 2] = 0;

break;

case '(': OUT_PATTERNS[i, 0] = 0; OUT_PATTERNS[i, 1] = 1;

OUT_PATTERNS[i, 2] = 1;

break;

case '-': OUT_PATTERNS[i, 0] = 1; OUT_PATTERNS[i, 1] = 0;

OUT_PATTERNS[i, 2] = 0;

break;

case '/': OUT_PATTERNS[i, 0] = 1; OUT_PATTERNS[i, 1] = 0;

OUT_PATTERNS[i, 2] = 1;

break;

case '+': OUT_PATTERNS[i, 0] = 1; OUT_PATTERNS[i, 1] = 1;

OUT_PATTERNS[i, 2] = 0;

break;

}

sBuf = DecToBin(iSum.ToString());

k = 0;

while (sBuf[k]!= '1')

{

k++;

}

sBuf = sBuf.Substring(k, sBuf.Length - 1 - k);

if (sBuf.Length > iLengthPattern1)

{

iLengthPattern1 = sBuf.Length;

}

sBigBuf[i] = sBuf;

}

double[,] inp = new double[sLetter.Length, iLengthPattern1];

for (int i = 0; i < sLetter.Length; i++)

{

for (int j = 0; j < iLengthPattern1; j++)

{

if (sBigBuf[i].Length <= j)

{

inp[i, j] = 0;

}

else

if (sBigBuf[i][j] == '1')

{

inp[i, j] = 1;

}

}

}

iLengthPattern = iLengthPattern1;

return inp;

}

}


Информация о работе Распознавание слов естественного языка с использованием нейросетей