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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать файл)

ipl[i].a = sigmoid(sum - ipl[i].threshold);

}

}

 

//{Вычисление  суммы взвешенных сигналов для  скрытого слоя}

 

private void run_hidden_layer()

{

double sum;

for (int i = 0; i < MAX_HID; i++)

{

sum = 0;

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

{ sum = sum + hl[i].w[j] * ipl[j].a; }

hl[i].a = sigmoid(sum - hl[i].threshold);

}

}

//{Вычисление  суммы взвешенных сигналов для  выходного слоя}

private void run_output_layer()

{

double sum;

for (int i = 0; i < MAX_OUT; i++)

{

sum = 0;

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

{ sum = sum + ol[i].w[j] * hl[j].a; }

ol[i].a = sigmoid(sum - ol[i].threshold);

}

}

private void run_the_network()

{

run_input_layer();

run_hidden_layer();

run_output_layer();

}

//{Процедура  выводит на экран результаты  теста}

private void display_the_results(out string[] outp)

{

outp = new string[ol.Length];

for (int i = 0; i < MAX_OUT; i++)

{ outp[i] = ol[i].a.ToString() + " "; }

}

// {Процедуры  для тестирования сети до и  после обучения}

public void get_test_pattern(double[] tests)

{

test_pat = tests;

}

public string[] test_the_network(double[] test)

{

test_pat = test;

Console.WriteLine();

Console.WriteLine("Процедура  тестирования сети");

Console.WriteLine();

string[] str;

run_the_network();

display_the_results(out str);

return str;

}

// {Процедуры  обучения сети}

private void calculate_output_layer_errors()

{

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

{ ol[j].E = (desired[j] - ol[j].a) * ol[j].a * (1 - ol[j].a); }

}

private void calculate_hidden_layer_errors()

{

double sum;

for (int i = 0; i < MAX_HID; i++)

{

sum = 0; // {Сумма ошибок выходного слоя}

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

{ sum = sum + ol[j].E * ol[j].w[i]; }

hl[i].E = hl[i].a * (1 - hl[i].a) * sum;

}

}

private void calculate_input_layer_errors()

{

double sum;

for (int i = 0; i < MAX_INP; i++)

{

sum = 0; // {Сумма ошибок скрытого слоя}

for (int j = 1; j < MAX_HID; j++)

{ sum = sum + hl[j].E * hl[j].w[i]; }

ipl[i].E = ipl[i].a * (1 - ipl[i].a) * sum;

}

}

private void weight_change()

{

for (int j = 0; j < MAX_OUT; j++) //{выходной слой}

{

for (int i = 0; i < MAX_HID; i++) //{Подстройка}

{

ol[j].change[i] = BETA * ol[j].E * hl[i].a + M * ol[j].change[i];

ol[j].w[i] = ol[j].w[i] + ol[j].change[i];

}

// {Подстройка значения порога}

ol[j].t_change = BETA * ol[j].E * 1 + M * ol[j].t_change;

//--------------------

ol[j].threshold = ol[j].threshold + ol[j].t_change;

//----------------------------

}

// {Модифицируем веса между входным слоем и скрытым слоем}

// {i -нейрон входного слоя, j -скрытого}

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

{

for (int i = 0; i < MAX_INP; i++)

{

hl[j].change[i] = BETA * hl[j].E * ipl[i].a + M * hl[j].change[i];

hl[j].w[i] = hl[j].w[i] + hl[j].change[i];

}

hl[j].t_change = BETA * hl[j].E * 1 + M * hl[j].t_change;

//-------------------------------------

hl[j].threshold = hl[j].threshold + hl[j].t_change;

}

// {Модифицируем  веса между входами и входным  слоем }

// {i -входной  образ, j - нейроны входного слоя}

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

{

for (int i = 0; i < MAX_INP; i++)

{

ipl[j].change[i] = BETA * ipl[j].E * test_pat[i] + M * ipl[j].change[i];

ipl[j].w[i] = ipl[j].w[i] + ipl[j].change[i];

}

ipl[j].t_change = BETA * ipl[j].E * 1 + M * ipl[j].t_change;

ipl[j].threshold = ipl[j].threshold + ipl[j].t_change;

}

}

//{Выполнение алгоритма back propagation }

private void back_propagate()

{

calculate_output_layer_errors();

calculate_hidden_layer_errors();

calculate_input_layer_errors();

weight_change();

}

//{Инициализация  весовых коэффициентов и порогов}

public void random_weights()

{

Random rnd = new Random();

for (int i = 0; i < MAX_INP; i++)

{

ipl[i].w = new double[MAX_INP]; // {весовые коэффициенты}

ipl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_HID; i++)

{

hl[i].w = new double[MAX_INP]; // {весовые коэффициенты}

hl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_OUT; i++)

{

ol[i].w = new double[MAX_HID]; // {весовые коэффициенты}

ol[i].change = new double[MAX_HID];

}

for (int i = 0; i < MAX_INP; i++)

{

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

{ ipl[i].w[j] = (double)rnd.Next(1000) / 1000; }

ipl[i].threshold = (double)rnd.Next(1000) / 1000;

}

for (int i = 0; i < MAX_HID; i++)

{

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

{ hl[i].w[j] = (double)rnd.Next(1000) / 1000; }

hl[i].threshold = (double)rnd.Next(1000) / 1000;

}

for (int i = 0; i < MAX_OUT; i++)

{

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

{ ol[i].w[j] = (double)rnd.Next(1000) / 1000; }

ol[i].threshold = (double)rnd.Next(1000) / 1000;

}

}

private void ExtractWeights()

{

for (int i = 0; i < MAX_INP; i++)

{

ipl[i].w = new double[MAX_INP]; // {весовые коэффициенты}

ipl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_HID; i++)

{

hl[i].w = new double[MAX_INP]; // {весовые коэффициенты}

hl[i].change = new double[MAX_INP];

}

for (int i = 0; i < MAX_OUT; i++)

{

ol[i].w = new double[MAX_HID]; // {весовые коэффициенты}

ol[i].change = new double[MAX_HID];

}

if (File.Exists(filename + "ip.txt") == true && File.Exists(filename + "ol.txt") == true && File.Exists(filename + "hl.txt") == true)

{

StreamReader streamreader = new StreamReader(filename + "ip.txt");

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

{

ipl[i].a = double.Parse(streamreader.ReadLine());

ipl[i].threshold = double.Parse(streamreader.ReadLine());

for (int j = 0; j < ipl[i].w.Length; j++)

{

ipl[i].w[j] = double.Parse(streamreader.ReadLine());

}

}

streamreader.Close();

streamreader = new StreamReader(filename + "ol.txt");

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

{

ol[i].a = double.Parse(streamreader.ReadLine());

ol[i].threshold = double.Parse(streamreader.ReadLine());

for (int j = 0; j < ol[i].w.Length; j++)

{

ol[i].w[j] = double.Parse(streamreader.ReadLine());

}

}

streamreader.Close();

streamreader = new StreamReader(filename + "hl.txt");

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

{

hl[i].a = double.Parse(streamreader.ReadLine());

hl[i].threshold = double.Parse(streamreader.ReadLine());

for (int j = 0; j < hl[i].w.Length; j++)

{

hl[i].w[j] = double.Parse(streamreader.ReadLine());

}

}

streamreader.Close();

}

else

{

File.Create(filename + "ip.txt");

File.Create(filename + "ol.txt");

File.Create(filename + "hl.txt");

}

}

//-------------------------------------------------------------

private void AddWeightsToFile()

{

StreamWriter streamwriter = new StreamWriter(filename + "ip.txt");

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

{

streamwriter.WriteLine(ipl[i].a.ToString());

streamwriter.WriteLine(ipl[i].threshold.ToString());

for (int j = 0; j < ipl[i].w.Length; j++)

{

streamwriter.WriteLine(ipl[i].w[j].ToString());

streamwriter.Flush();

}

streamwriter.Flush();

}

streamwriter.Close();

streamwriter = new StreamWriter(filename + "hl.txt");

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

{

streamwriter.WriteLine(hl[i].a.ToString());

streamwriter.WriteLine(hl[i].threshold.ToString());

for (int j = 0; j < hl[i].w.Length; j++)

{

streamwriter.WriteLine(hl[i].w[j].ToString());

streamwriter.Flush();

}

streamwriter.Flush();

}

streamwriter.Close();

streamwriter = new StreamWriter(filename + "ol.txt");

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

{

streamwriter.WriteLine(ol[i].a.ToString());

streamwriter.WriteLine(ol[i].threshold.ToString());

for (int j = 0; j < ol[i].w.Length; j++)

{

streamwriter.WriteLine(ol[i].w[j].ToString());

streamwriter.Flush();

}

streamwriter.Flush();

}

streamwriter.Close();

}

 

private void blank_changes()

{

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

{

for (int i = 0; i < MAX_INP; i++)

{ ipl[j].change[i] = 0; }

ipl[j].t_change = 0;

}

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

{

for (int i = 0; i < MAX_INP; i++)

{ hl[j].change[i] = 0; }

hl[j].t_change = 0;

}

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

{

for (int i = 0; i < MAX_HID; i++)

{ ol[j].change[i] = 0; }

ol[j].t_change = 0;

}

}

public void train_the_network()

{

blank_changes(); // {Очистка предыдущих значений changes}

for (int loop = 0; loop < num_cycles; loop++)

{

for (int pat = 0; pat < MAX_PAT; pat++)

{

for (int i = 0; i < MAX_INP; i++) //{Копирование входного образа}

{ test_pat[i] = INP_PATTERNS[pat, i]; } //{в массив 'test_pat' }

for (int i = 0; i < MAX_OUT; i++) //{Копирование выходного образа}

{ desired[i] = OUT_PATTERNS[pat, i]; } //{ в массив'desired' }

run_the_network(); //{Определение выходов сети}

back_propagate();

}

}

AddWeightsToFile();

}

}

 

Приложение Б. Листинг  класса Analization

 

public class Analization

{

List<Results> results = new List<Results>();

 

public static void AddToFile(string sLetter, string sFile)

{

FileStream filestream = File.Open(sFile + ".txt", FileMode.Append, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

streamwriter.WriteLine(sLetter);

streamwriter.Close();

filestream.Close();

}

private void AddEtalonLetter()

{

string[] im = { "смотрим@", "носим@", "ходим@", "бродим@", "катим@", "синим#", "большим#", "тугим#", "крайним#" };

if (File.Exists("-им.txt") == false)

{

FileStream filestream = File.Open("-им.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

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

{

streamwriter.WriteLine(im[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] om = { "столом@", "стулом@", "ковром@", "городом@", "селом@", "красном#", "туманном#", "тяжелом#", "легком#" };

if (File.Exists("-ом.txt") == false)

{

FileStream filestream = File.Open("-ом.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

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

{

streamwriter.WriteLine(om[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] oy = { "ручкой@", "краской@", "бумагой@", "оградой@", "каймой@", "большой#", "небольшой#", "тугой#", "малой#" };

if (File.Exists("-ой.txt") == false)

{

FileStream filestream = File.Open("-ой.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

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

{

streamwriter.WriteLine(oy[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] em = { "кидаем@", "бросаем@", "стережем@", "бережем@", "блюдем@", "гребнем#", "камнем#", "ставнем#", "гравием#" };

if (File.Exists("-ем.txt") == false)

{

FileStream filestream = File.Open("-ем.txt", FileMode.CreateNew, FileAccess.Write);

StreamWriter streamwriter = new StreamWriter(filestream);

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

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