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

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

Код данной функции представлен  ниже:

 

private string GetNeuroResult(string sLetter, string sFileName, int N_HID, double beta, double m, int Epoch, bool flag)

{ string[] techears = File.ReadAllLines(sFileName+".txt");

Binarization binar = new Binarization(techears);//проводим бинаризацию

double[,] inp = new double[1, 1], outp = new double[1, 1]; double[] test = new double[1]; //обучающая выборка, выходы, тестовая выборка

int max_inp, max_pat;//кол-во нейронов и выборок

inp = binar.GetBinarizeText(out outp, out max_pat, out max_inp);//получаем обучающую выборкув закодированном виде

test = binar.GetBinarizeWord(sLetter);//получаем тестовую выборку в закодированном виде

NeuroNetwork neuro = new NeuroNetwork(inp, outp, max_inp, N_HID, max_pat, beta, m, Epoch, sFileName, flag);//создаем объект нейросеть

if (flag == false)//если она не обучена

{ neuro.random_weights();//инициализируем весовые коэффициенты случайными числами

neuro.train_the_network(); //обучаем нейросеть }

string[] m_resultat = neuro.test_the_network(test);

string res1="",res2="";

switch (sFileName)

{ //в зависимости от имени файла с обучающей выборкой возможны определенные комбинации возвращаемых результатов

case "-ой":

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

res2 = "прилагательное";

break;

… }

//анализируем  полученные значения нейросети  и возвращаем результат

if (double.Parse(m_resultat[0]) < 0.5 && double.Parse(m_resultat[1]) < 0.5 && double.Parse(m_resultat[2]) < 0.5)

{ return res1; }

if (double.Parse(m_resultat[0]) < 0.5 && double.Parse(m_resultat[1]) < 0.5 && double.Parse(m_resultat[2]) > 0.5)

{ return res2; }

return "неизвестно"; }

Алгоритм данной функции  можно разделить на следующие  этапы:

  • извлечение обучающей выборки из файла,
  • ее бинаризация при помощи класса Binarization,
  • если flag==false – обучение нейронной сети,
  • получение результата,
  • определение по полученному результату типа лексемы.

 

2.5 Описание тестирующей программы

 

Программа выполнена в  виде Windows-приложения в среде Microsoft Visual Studio и имеет оконный интерфейс.

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

Приложение состоит  из трех окон:

  • окно ввода текста для анализа (рисунок 13);
  • окно анализа текста (рисунок 14);
  • окно добавления лексемы в хеш-таблицу или в обучающую выборку (рисунок 15).

Текст для  анализа загружается из файла  или вводится с клавиатуры в richTextBox. Результат анализа (лексема и  класс) выводится в dataGridView (рисунок 10)

 

Рисунок 10 – электронная таблица dataGridView

 

2.6 Результаты тестирования

 

Программа запускается  из файла KursP.exe. В интерфейсе окна ввода  текста (рисунок 11) присутствуют две  кнопки: “Загрузить из файла” – загрузка текста для анализа, «Далее» - перейти к анализу. Текст для анализа можно вводить и вручную.

 

Рисунок 11 – Окно ввода  текста

 

При нажатии кнопки «Далее»  на экране появится окно анализа текста (рисунок 12). В окне анализа текста имеются кнопки «Анализ» и «Обучение». Первая используется для анализа текста без обучения нейросети, вторая – соответственно с обучение. Кнопка «Анализ» становится активной только при наличии файлов с весовыми коэффициентами для всех нейросетей. Результаты анализа выводятся в таблицу лексем.

 

Рисунок 12 – Окно анализа  текста

 

При необходимости можно  добавить слово в хеш-таблицу  или в обучающую выборку при  нажатии на кнопки “Добавить слово  в хеш-таблицу” и «Добавить слово  на –ой, -им, -ем». После нажатия данных кнопок перед пользователем появится окно добавления слова (рисунок 13). Далее пользователю необходимо ввести слово и класс и нажать кнопку «Добавить».

 

Рисунок 13 – Окно добавления лексемы в хеш-таблицу или в  обучающую выборку

 

Для тестирования программы будем использовать отрывок  из произведения Л.Н. Толстого «Война и мир»:

«В штабе  Кутузова ожидали вестей от командующего австрийской армией Мака. В это время в штаб неожиданно прибыл незнакомый генерал, которого адъютанты не захотели пропустить к Кутузову. Главнокомандующий вышел в приемную и узнал в прибывшем генерала Мака, который подтвердил слухи о поражении австрийцев под Ульмом и о сдаче всей армии. Князь Андрей понимал, что русская армия оказалась в очень тяжелом положении, что ей предстоит трудное сражение с французами. С одной стороны, он был рад этому, так как представилась наконец возможность принять участие в бое, с другой стороны – опасался поражения русской армии, понимая, что в данной ситуации преимущество на стороне Бонапарта.»

При тестировании будем использовать нейросеть со следующими параметрами:

  • эпох – 6000;
  • нейронов в скрытом слое – 15;
  • момент – 0,7
  • коэффициент обучения – 0,7.

При анализе  полученного результата была выявлена ошибка (рисунок 14).

 

Рисунок 14 – Окно программы с результатом анализа с ошибкой

 

Данной ошибки можно  избежать, добавив слово «Французами» в файл с тестовой выборкой.

После внесения соответствующих  изменений в нейросеть был  получен следующий результат (рисунок 15):

 

Рисунок 15 – Окно программы с результатом анализа с без ошибки

 

3. Руководство программисту

 

Используемые  в тестирующей программе классы содержатся в библиотеке классов NeuroLibrary. Соответствующий библиотечный файл NeuroLibrary.dll содержится в одной директории с исполняемым файлом программы (файл KursP.exe).

Рассмотрим  процедуру создания библиотеки классов. Для этого необходимо создать  в VisualStudio проект типа ClassLibrary (рисунок 16).

 

 

Рисунок 16 – Создание проекта «Библиотека  классов» в VisualStudio

 

После создания всех необходимых классов в библиотеке, необхлодимо произвести компиляцию проекта. В случае отсутствия ошибок в коде в папке NeuroLibrary/Debug/bin будет создан библиотечный файл.

Далее подключаем библиотеку классов к тестирующей  программе. Для этого необходимо в окне «Обозреватель решений» (правый верхний угол) выбрать пункт «Ссылки», вызвать контекстное меню и выбрать пункт «Добавить ссылку». В появившемся окне (рисунок 17) необходимо открыть вкладку «Обзор» и указать путь к библиотечному файлу и нажать ОК. Выбранный файл будет автоматически добавлен в папку с испольняемым файлом программы.

 

 

Рисунок 17 – Окно добавления ссылки

 

Далее необходимо подключить соответсвующее пространство имен NeuroLibrary с помощью директивы using и классы данной библиотеки станут доступны.

В тестирующей  программе для получения результата достаточно создать объект класса Analization и вызвать свойство GetResult. Все необходимые действия будут произведены в конструкторе класса. GetResult необходим для получения результата в виде списка объектов типа string.

Для возможности  влиять на работу анализатора понадобится использование класса Hash. С помощью методов данного класса можно добавить слово-исключение в хеш-таблицу. Содержимое хеш-таблиц хранится в папке с исполняемым файлом программы в текстовых файлах: narechie, predlog, soyuz, deepr, iskl, mest.

Для возможности  добавления слова в обучающую  выборку нейросети предусмотрен статический метод AddToFile класса Analization. Обучающие выборки нейросети хранятся в текстовых файлах: -ом, -ем, -им, -ми, -ие, -ой.

Как было сказано в подразделе 2.1, нейросеть  производит запись весовых коэффициентов  в текстовые файлы, хранящиеся в одном каталоге с исполняемым файлом программы. Их имена формируются по следующему принципу: имя файла с обучающей выборкой + наименование слоя сети (ip – входной, hl – скрытый, ol – выходной. Пример омip – весовые коэффициенты входного слоя сети для слов с окончанием ом.

Системные требования:

  • Для корректной работы приложения необходимо наличие на компьютере программы Microsoft.NET Framework 2.0
  • Операционные системы: Windows 2000 Service Pack 3; Windows 98; Windows 98 Second Edition; Windows ME; Windows Server 2003; Windows XP Service Pack 2
  • Требуемое программное обеспечение: установщик Windows 3.0 (кроме ОС Windows 98/ME, для которых требуется Установщик Windows 2.0 или более поздней версии). Рекомендуется Установщик Windows 3.1 или более поздней версии. Обозреватель IE 5.01 или более поздней версии: Для установки.NET Framework требуется обозреватель Microsoft Internet Explorer 5.01 или более поздней версии.

 

Заключение

 

В данном курсовом проекте была разработана программа-анализатор слов естественного языка с использованием нейросети.

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

Данный  программный продукт может быть использован специалистами в  области филолигии.

 

Список используемой литературы

  1. Комарцова Л.Г., Максимов А.В.. Нейрокомпьютеры Учебное пособие для вузов. – М.: Изд-во МГТУ им. Н.Э.Баумана,2002.

  1. Осовский С. Нейронные сети для обработки информации.-М.:Финансы и статистика, 2004.
  2. Уоссермен Ф. Нейрокомпьютерная техника: теория и практика. — М.: Мир, 1992.
  3. Ключко В.И., Ермоленко В.В. Нейрокомпьютерные системы. Базы знаний. Учеб. пособие Изд-во КубГТУ,1999.-100с.

 

 

Приложение А. Листинг  класса NeuroNetwork

 

class NeuroNetwork

{

struct neuron_type

{

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

public double[] change;//=new double[MAX_INP];//{модификация весовых коэффициентов используется в процессе обучения}

public double threshold, a; // {а-сигнал на выходе нейрона,threshold-значение порога}

public double t_change; // {модификация порога используется в процессе обучения}

public double E; // {значение ошибки}

}

double[,] INP_PATTERNS;

double[,] OUT_PATTERNS;

int MAX_INP; //{Количество нейронов в входном слое}

int MAX_HID; //{Количество нейронов в скрытом слое}

int MAX_OUT; // {Количество нейронов в выходном слое

int MAX_PAT; // {Количество образов для обучения}

double[] test_pat;

double[] desired;

neuron_type[] ipl; // {Входной слой }

neuron_type[] hl; // {Скрытый слой }

neuron_type[] ol; // {Выходной слой }

double BETA = 0.8; // {Коэффициент обучения}

double M = 0.8; //{момент}

int num_cycles = 1000;

string filename;

public NeuroNetwork(double[,] INP_PATTERNS1/*выборка*/, double[,] OUT_PATTERNS1/*желаемый выход*/, int Max_inp/*кол-во символов в слове*/, int N_HID, int Max_pat/*максмальное кол-во выборок, double beta, double m, int Epoch, string name, bool indicate)

{

filename = name;

num_cycles = Epoch;

// elemKolvo = elemKol;

BETA = beta; M = m;

MAX_INP = Max_inp; //{Количество нейронов в входном слое}

MAX_HID = N_HID; //{Количество нейронов в скрытом слое}

MAX_OUT = 3; //int IPi;

MAX_PAT = Max_pat;

INP_PATTERNS = INP_PATTERNS1;

OUT_PATTERNS = OUT_PATTERNS1;

test_pat = new double[MAX_INP];

desired = new double[MAX_OUT];

ipl = new neuron_type[MAX_INP]; // {Входной слой }

hl = new neuron_type[MAX_HID]; // {Скрытый слой }

ol = new neuron_type[MAX_OUT];

if (indicate == true)

{

try { ExtractWeights(); }

catch { }

}

}

 

private double sigmoid(double x) // {функция активации}

{

if (Math.Abs(x) < 38) // {проверка условия нахождения функции в интервале -39..38}

{ return 1 / (1 + Math.Exp(-x)); }

else

{

if (x >= 38)

{ return 1; }

else { return 0; }

}

}

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

private void run_input_layer()

{

double sum = 0;

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

{

sum = 0;

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

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

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