Распознавание слов естественного языка с использованием нейросетей - Программирование, компьютеры и кибернетика курсовая работа

Распознавание слов естественного языка с использованием нейросетей - Программирование, компьютеры и кибернетика курсовая работа




































Главная

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

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


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Государственное образовательное учреждение
высшего профессионального образования
Кубанский государственный технологический университет
Армавирский механико-технологический институт
Кафедра внутризаводского электрооборудования и авт о матики
2. Лексический анализ текста, формирование таблицы лексем.
Требования: язык программирования C#, объектный метод проектирования, класс выполняющий распознавание, офо р мить в виде библиотечного компонента, составить тесты и нап и сать программу для тестирование своих библиотечных кла с сов.
Пояснительная записка 30 - 35 листов
Графическая часть 2-3 листа формата А3
Комарцова Л.Г. , Максимов А.В.. Нейрокомпьютеры Учебное пособие для в у зов. - М.: Изд-во МГТУ им. Н.Э.Баумана,2002.
Осовский С. Нейронные сети для обработки информации.-М.:Финансы и статистика, 2004.
Уоссермен Ф. Нейрокомпьютерная техника: теория и практика. -- М.: Мир, 1992.
Ключко В.И., Ермоленко В.В. Нейрокомпьютерные системы. Базы знаний. Учеб. пособие Изд-во КубГТУ,1999.-100с.
ГОСТ Р ИСО 9001-2001 Системы менеджмента качества. Требования.
ГОСТ 7.1-2003 СИБИД. Библиографическая запись. Библиографическое описание. Общие требования и правила составления.
ГОСТ 19.101-77 ЕСПД. Виды программ и программных документов.
ГОСТ 19.102-77 ЕСПД. Стадии разработки.
ГОСТ 19.103-77 ЕСПД. Обозначение программ и программных документов.
ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам
ГОСТ 19.202-78 ЕСПД. Спецификация. Требования к содержанию и оформлению.
ГОСТ 19.404-79 ЕСПД. Пояснительная записка Требования к содержанию и оформлению.
ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения.
Пояснительная записка к курсовому проекту содержит 17 рисунков, 4 литературных источников, 3 приложения. К пояснительной записке прилагается 1 диск с готовой программой и материалами к ней, а также графическая часть, состоящая из трех листов.
ЛЕКСЕМА, НЕЙРОННАЯ СЕТЬ, ВХОДНОЙ СЛОЙ, СКРЫТЫЙ СЛОЙ, ВЫХОДНОЙ СЛОЙ, ОБУЧАЮЩАЯ ВЫБОРКА, ТЕСТОВАЯ ВЫБОРКА, ХЕШ-ТАБЛИЦА, ТАБЛИЦА ЛЕКСЕМ
Объект: лексический анализатор слов естественного языка с использованием нейросети.
Цель: закрепление теоретических знаний по дисциплине «Теория языков программирование и методов трансляции», получить практические навыки проектирования и разработки элементов транслятора.
Произведен выбор нейросети, рассмотрен ее алгоритм, представлена программная реализация на языке C# в библиотеке классов и написана тестирующая программа.
1.2 Модель многослойного персептрона с обучением по методу обратного распространения ошибки
2. Проектирование библиотеки классов для реализации нейросети и тестовой программы
2.1 Программная реализация нейросети обратного распространения ошибки
2.2 Класс перевода текста в двоичный вид
2.3 Класс хеш-таблицы и методов работы с ней
2.4 Класс разбиения текста на лексемы и распознавания
Цель данного проекта: применение нейронной сети в лексическом анализе слов естественного языка.
Задачи: смоделировать, программно реализовать, настроить и обучить нейросеть для лексического анализа слов естественного языка.
Входной информацией являются параметры нейросети, файлы с обучающей выборкой.
Выходной информацией является таблица лексем.
Результатом курсового проекта должна быть программа-анализатор слов естественного языка с использованием нейросети.
Искусственные нейронные сети -- математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей -- сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Первой такой попыткой были нейронные сети Маккалока и Питтса. Впоследствии, после разработки алгоритмов обучения, получаемые модели стали использовать в практических целях: в задачах прогнозирования, для распознавания образов, в задачах управления и др.
Искусственные нейронные сети представляют собой систему соединённых и взаимодействующих между собой простых процессоров (искусственных нейронов). Такие процессоры обычно довольно просты, особенно в сравнении с процессорами, используемыми в персональных компьютерах. Каждый процессор подобной сети имеет дело только с сигналами, которые он периодически получает, и сигналами, которые он периодически посылает другим процессорам. И тем не менее, будучи соединёнными в достаточно большую сеть с управляемым взаимодействием, такие локально простые процессоры вместе способны выполнять довольно сложные задачи.
Существует много разновидностей нейронных сетей, но наиболее распространенными являются сети Кохонена, Хопфилда, обратного распространения ошибки.
Недостатками сети Кохонена является ее сложность и проблемы при классификации похожих образов. Сеть Хопфилда также может стать нестабильной, если обучающие примеры являются слишком похожими. Данные недостатки являются существенными, т.к. сходные по написанию слова естественного могут относиться к разным частям речи. Соответственно, для реализации лексического анализатора наиболее подходящей является сеть обратного распространения ошибки. Обратное распространение - первый эффективный алгоритм обучения многослойных нейронных сетей. Один из самых популярных алгоритмов обучения, с его помощью были решены и решаются многочисленные практические задачи.
1.2 Модель многослойного персептрона с обучением по методу обратного распространения ошибки
Когда в сети только один слой, алгоритм ее обучения с уч и телем очевиден, так как правильные выходные состояния нейр о нов единственного слоя заведомо известны, и подстройка с и наптических связей идет в направлении, минимизирующем ошибку на выходе с е ти. По этому принципу строится, например, алгоритм обучения однослойного персептрона. В многослойных же сетях оптимальные выходные значения нейронов всех слоев, кроме после д него, как правило, не известны, и двух или более слойный персептрон уже невозможно обучить, руководствуясь только величинами ошибок на в ы ходах НС.
Ф. Розенблаттом использовал в своем персептроне не дифференцируемую ступенчатую функцию активации. Во зможно, именно это помешало ему найти эффективный алгоритм обучения, хотя сам термин Back Propagation восходит к его попыткам обобщить свое правило обучения одного нейрона на многослойную сеть.
Разберем этот ключевой для нейрокомпьютинга метод несколько подробнее.
Алгоритм обратного распространения - это итеративный градиентный алгоритм, который используется с целью минимизации среднеквадратичного отклонения текущего выхода многослойного персептрона и желаемого выхода.
Алгоритм обратного распространения используется для обучения многослойных нейронных сетей с последовательными связями. Нейроны в таких сетях делятся на группы с общим входным сигналом - слои. На каждый нейрон первого слоя подаются все элементы внешнего входного сигнала. Все выходы нейронов m-го слоя подаются на каждый нейрон слоя m+1. Нейроны выполняют взвешенное суммирование элементов входных сигналов. К сумме элементов входных сигналов, помноженных на соответствующие синаптические веса, прибавляется смещение (порог) нейрона. Над результатом суммирования выполняется нелинейное преобразование - функция активации (передаточная функция). Значение функции активации есть выход нейрона.
На рисунке 1 показана укрупненная схема многослойной сети (многослойного персептрона). Нейроны представлены кружками, связи между нейронами - линиями со стрелками.
Рисунок 1 - Многослойный персептрон
Обозначим входы n-го слоя нейронов , весовые коэффициенты w ij . Нейроны этого слоя вычисляют соответствующие линейные комбинации a i :
и передают их на следующий слой, пропуская через нелинейную функцию активации:
Нелинейная функция f называется активационной и может иметь различный вид, как показано на рисунке 2. Одной из наиболее распространенных является нелинейная функция с насыщением, так называемая логистическая функция или сигмоид (т.е. функция S-образного вида):
При уменьшении сигмоид становится более пологим, в пределе при =0 вырождаясь в горизонтальную линию на уровне 0.5, при увеличении сигмоид приближается по внешнему виду к функции единичного скачка с порогом T в точке x=0. Из выражения для сигмоида очевидно, что выходное значение нейрона лежит в диапазоне [0,1]. Одно из ценных свойств сигмоидной функции - простое выражение для ее производной.
Рисунок 2 - а) функция единичного скачка; б) линейный порог (гистерезис); в) гиперболический тангенс; г) сигмоид
Следует отметить, что сигмоидная функция дифференцируема на всей оси абсцисс, что используется в некоторых алгоритмах обучения. Кроме того она обладает свойством усиливать слабые сигналы лучше, чем большие, и предотвращает насыщение от больших сигналов, так как они соответствуют областям аргументов, где сигмоид имеет пологий наклон.
Для построения алгоритма обучения необходимо знать производную ошибки по каждому из весов сети:
Таким образом, вклад в общую ошибку каждого веса вычисляется локально, простым умножением невязки нейрона на значение соответствующего входа. (Из-за этого, в случае, когда веса изменяют по направлению скорейшего спуска , такое правило обучения называют дельта-правилом.)
Входы каждого слоя вычисляются последовательно от первого слоя к последнему во время прямого распространения сигнала:
а невязки каждого слоя вычисляются во время обратного распространения ошибки от последнего слоя (где они определяются по выходам сети) к первому:
Задачей данного курсового проекта является создание программы распознавания слов естественного языка с использованием нейросетей. Для ее выполнения была выбрана нейронная сеть обратного распространения ошибки, которая будет реализована на языке программирования C# в виде класса. Класс будет содержать конструктор, на который будут подаваться значения следующих параметров:
- количество нейронов скрытого слоя;
Для перевода обучающих и тестовых слов в двоичный вид, а также сохранения слов-исключений в хеш-таблице будут предусмотрены отдельные классы.
Также будет создан класс, производящий разбиение текста на отдельные лексемы и их распознавание средствами нейросети и хеш-таблицы.
Соответственно, для решения поставленной задачи необходимо создание четырех классов:
- класс нейросети и средств ее обработки;
- класс перевода текста в двоичный вид;
- класс хеш-таблицы и методов работы с ней;
- класс разбиения текста на лексемы и распознавания.
Созданные классы будут оформлены в виде библиотечного компонента.
Для тестирования созданного класса будет создано Windows-приложение с использованием визуальных компонентов. Тестирующая программа должна осуществлять ввод текстовой информации из файла и с клавиатуры, а также ввод параметров нейросети: количество эпох обучения, количество нейронов скрытого слоя, момент и коэффициент обучения.
2. Проектирование библиотеки классов для реализации нейросети и тестовой программы
2.1 Программная реализация нейросети обратного распространения ошибки
Алгоритм был реализован в виде класса NeuroNetwork. UML диаграмма класса представленна на рисунке 6.
private void display_the_results(out string[] outp)
private void calculate_output_layer_errors()
private void calculate_hidden_layer_errors()
private void calculate_input_layer_errors()
public void get_test_pattern(double[] tests)
public string[] test_the_network(double[] test)
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)
Рисунок 6 - UML-диаграмма класса NeuroNetwork
- обучающая выборка - INP_PATTERNS;
- количество нейронов скрытого слоя - N_HID;
- количество нейронов входного слоя - Max_inp;
- количество образцов, содержащихся в обучающей выборке - Max_par;
- количество эпох обучения - Epoch;
- имя файла с обучающей выборкой - name;
- логическая пременная indicate, сигнализирующая о необходимости обучения сети.
Ввод тестируемой выборки производится посредствам метода get_test_pattern(double[] tests).
Для описания нейрона была создана структура neuron_type, содержащая следующие поля:
- список весовых коэффициентов для связей между данным нейроном и всеми нейронами предыдущего слоя (или входными данными, если нейрон находится во входном слое). Каждый весовой коэффициент - действительное число (по 1 весовому коэффициенту на нейрон предыдущего слоя);
- значение ошибки, используется только на стадии обучения;
- изменение ошибки, также используется только во время обучения.
public double[] w; //весовые коэффициенты
public double[] change;//модификация весовых коэффициентов используется в процессе обучения
public double threshold, a; //а-сигнал на выходе нейрона,threshold-значение порога
public double t_change; //модификация порога используется в процессе обучения
Выходной сигнал нейрона хранится в поле a (так называемая активность нейрона). Нейрон должен отреагировать на входной сигнал, поступающий по взвешенным связям, вычислив при этом выходной сигнал. Для трансформации входных сигналов в выходные необходима функция.
Ниже приведена декларация узлов с помощью закрытых переменных. Постоянные обозначают количество нейронов во входном, скрытом и выходном слое:
int MAX_INP; //Количество нейронов в входном слое
int MAX_HID; //Количество нейронов в скрытом слое
int MAX_OUT; //Количество нейронов в выходном слое
Функция активации (2) была реализована в открытом методе sigmoid. В данном метода используется формула (3). Код на С# для этого метода:
Однако функция Exp приводит к ошибке в программе, если входное значение выходит из промежутка -39..38. К счастью, эти значения настолько далеко отстоят от начала координат, что мы можем считать: при аргументе < -39 значение функции равно 0, при аргументе > 38, - значение функции равно 1. Для предотвращения ошибки добавим несколько строчек:
{ if (Math.Abs(x) < 38) //проверка условия нахождения функции в интервале -39..38
Биологические нейроны не срабатывают (не выдают выходной сигнал) до тех пор, пока уровень входного сигнала не достигнет некоторого порогового значения, т.е. на вход нейрона поступает сумма взвешенных сигналов минус некоторая величина. Полученное значение проходит через активационную функцию.
Каждая активность нейрона предыдущего слоя умножается на соответствующий весовой коэффициент, результаты умножения суммируются (1), вычитается пороговое значение, вычисляется значение сигмоидной функции (5). Вот пример на С#:
Вычисление суммы взвешенных сигналов для входного набора данных
{ sum = sum + ipl[i].w[j] * test_pat[j];//(1) }
ipl[i].a = sigmoid(sum - ipl[i].threshold);//(5) } }
Вычисление суммы взвешенных сигналов для скрытого и выходного слоев (методы run_hidden_layer и run_output_layer) производится аналогично.
Каждый слой нейронов базируется на выходе предыдущего слоя (за исключением входного слоя, базирующегося непосредственно на предъявляемых сети входных данных (в коде - массив test_pat). Это значит, что значения входного слоя должны быть полностью рассчитаны до вычисления значений скрытого слоя, которые в свою очередь, должны быть рассчитаны до вычисления значений выходного слоя.
Выходы нейронной сети - значения активностей (поле a) нейронов выходного слоя. Программа, симулирующая работу нейронной сети, в процессе обучения будет сравнивать их со значениями, которые должны быть на выходе сети.
Полный алгоритм обучения НС с помощью процедуры обратного распространения строится так:
1. Инициализировать пороговые значения и весовые коэффициенты небольшими случайными величинами (не более 0.4). Инициализация весовых коэффициентов случайными вещественными значениями с помощью класса Random производится в функции random_weights.
2. Подать на входы сети один из возможных образов и в режиме обычного функционирования НС, когда сигналы распространяются от входов к выходам, рассчитать значения последних. Метод run_the_networ.
3. Вычислить ошибки для выходного слоя (calculate_output_layer_errors). При этом используем формулу (7) для каждого i-ого значения выходного слоя. Ниже представлена соответствующая функция:
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); } }
Вычисление ошибки для скрытого и входного слоев производится методами calculate_input_layer_errors и calculate_hidden_layer_errors по формуле (8). Код соответствеющей функции для входного слоя предтсавлен ниже:
private void calculate_input_layer_errors()
sum = 0; // {Сумма ошибок скрытого слоя}
{ sum = sum + hl[j].E * hl[j].w[i]; }
ipl[i].E = ipl[i].a * (1 - ipl[i].a) * sum;
Используя формулы (9), (10), (11) получим функцию, обучающую весовые коэффициенты и пороговые уровни:
{ //i обозначает нейрон скрытого слоя, j - выходного
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; // }
//Модифицируем веса между входным слоем и скрытым слоем
//Модифицируем веса между входами и входным слоем
Далее объединим вышеуказанные функции в одном методе back_propogate().
В общем виде функция обучения сети будет выглядеть следующим образом:
{ 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();//Определение выходов сети
Для очистки предыдущих значений используется функция blank_changes.
Для упрощения временной сложности работы сети полученные весовые коэффициенты будем записывать в отдельные файлы (метод AddWeightsToFile()), имена которым даются программой автоматически Для считывания сохраненных параметров будет применяться метод ExtractWeights().
2.2 Класс перевода текста в двоичный вид
Данный класс предназначен для бинаризации исходных данных (слов), т.е. перевода слов с естественного языка в набор единиц и нулей. Данная процедура является необходимой, т.к. нейронная сеть обратного распространения ошибки работает только с двоичными данными. UM L диаграмма класса Binarization представлена на р и сунке 7.
private string DecToBin(string value)
public double[] GetBinarizeWord(string sWord)
public double[,] GetBinarizeText(out double[,] OUT_PATTERNS, out int max_pat, out int iLengthPattern1)
public Binarization(string[] sLetter1)
Рисунок 7 -UML-диаграмма класса Binarization
Параметром конструктора является массив строк для п е ревода в двоичный вид.
Алгоритм работы методов GetBinarizeWord и GetBinarizeText данного класса в общем состоит из следующих этапов:
- кодировка слова: суммирование произведений ASCII-кодов букв на i+4, где i - номер буквы в слове;
- перевод полученного десятичного числа в двоичный вид при помощи метода DecToBin ;
2 .3 Класс хеш-таблицы и методов работы с ней
Некоторые слова невозможно четко классиф ицировать , т.к. они относятся либо к неизменяемым частям речи (наречия, де е причастия и.т.д), либо схожи по некоторым признакам со сл о вами других частей речи. (существительное кровать оканчивае т ся как глагол на ать). Слова определенных классов имеются в достаточно ограниченных количествах (союзы и.т.д) и создание для их распознавания нейросети является неоправданным. Для работы с такого рода словами и предназначен данный класс. UML диаграмма класса Hash представле н на на рисунке 8 .
Dictionary predlog = new Dictionary();
Dictionary narechie = new Dictionary();
Dictionary deepr = new Dictionary();
Dictionary soyuz = new Dictionary();
Dictionary mest = new Dictionary();
Dictionary iskl = new Dictionary();
string[] sConstant = { "predlog", "narechie", "deepr", "soyuz", "mest", "iskl" };
private int HashFunction(string sInfo)
public bool CheckHash(string sInfo, string sHash_name)
public void AddLetterInHashAndFile(string sLetter, string sClass,bool Flag)
public void AddToHash(string sInfo, string sHash_name)
public void ReadFileInHash(string sNamefile)
public void WriteWordInFile(string sInfo, string sNamefile)
Рисунок 8 - UML диаграмма класса Hash
Полями данного класса являются хеш-таблицы - predlog (содержит предлоги), nar e chie (наречия), deepr (деепричастия), soyuz (союзы), mest (местоимения), iskl (существительные, глаг о лы, прилагательные сложные для распознавания).
- HashFunction - значение хеш-функции для текущего слова;
- CheckHash - проверка наличия записи в хеш-таблице;
- AddLetterInHashAndFile - классификация и добавление нового слова в хеш-таблицу, а также запись в файл;
- AddToHash - добавление слова в хеш-таблицу;
- ReadFileInHash и WriteWordInHash - чтение слов из файла и запись слова в файл соответственно.
2.4 Класс разбиения текста на лексемы и распознавания
Данный класс является главным. Его задача - вычленение лексем из текста и их дальнейшее распознавание. В нем и с пользуются объекты всех вышеописанных классов. UML-диаграмма класса Analization представлена на рисунке 9.
List results = new List();
private string GetNeuroResult(string sLetter, string sFileName, int N_HID, double beta, double m, int Epoch, bool flag)
private string Scaning(string sLetter, int N_HID, double beta, double m, int Epoch, bool flag)
public static void AddToFile(string sLetter, string sFile)
public string BigToSmall(string letter)
public Analization(string sText, int N_HID, double beta, double m, int Epoch, bool flag)
Рисунок 9 - UML-диаграмма класса Analization
- параметры нейросети N_HID, beta, m, Epoch;
- индикатор необходимости обучения нейросети - flag.
Из всех вышеперечисленных методов наиболее важными являются: конструктор, Sca n ing и GetNeuroResult.
Анализируемый текст сначала подается в конструктор. Там он разбивается на отдельные лексемы, тип которых либо опр е деляется сразу (если это знак препинания или имя собстве н ное), либо посредством метода Scaning. Код данного метода представлен ниже :
private string Scaning(string sLetter, int N_HID, double beta, double m, int Epoch, bool flag)
string result = "существительное";//результат
string[] znaks = { "с", "п", "г" };
for (int i = 0; i < znaks.Length; i++)//поиск существительных, прилагательных и глаголов-исключений, сохраненных в хеш-таблице
{ if (hash.CheckHash(sLetter + znaks[i].ToString(), "iskl") == true)
{ case "с": result = "существительное";//если в конце слова буква с - возвращаем результат
case "п": result = "прилагательное";
if (hash.CheckHash(sLetter, "predlog") == true)//проверяем, является ли слово предлогом (ищем в соответствующей хеш-таблице
{ result = "предлог";//если слово есть в хеш-таблице - возвращаем результат
//Для местоимений, союзов, деепричастий и наречий аналогично
if (String.Compare(sLetter, "не") == 0 || String.Compare(sLetter, "бы") == 0)
//--------------------------------------------------------------------
string[] pril = {"ий","ый","ая","яя","го","ую","ое","их","ых","ым"};//массив окончаний прилагательных
string[] glagol = {"ит","ат","ят","ут","ют","ул","ял","ал","ли","ла","ег","ел","сь","ыл","ил"};//глаголов
string[] prich = {"вший","шими","вшая","вшем","вшие","ящий","ящая","ящие","щими","ющий","ющая","ющие","ущий","ущая","ущие","ащий","ащая","ащие","шего","щего"};//окончаний и суффиксов причастий
string okonchanie= (sLetter[sLetter.Length - 2].ToString() + sLetter[sLetter.Length - 1].ToString());
if (Array.IndexOf(pril,okonchanie)!=-1)//если окончание слова содержится в массиве окончаний прилагательных переходим к проверке суффикса
{string ok_i_suff = sLetter[sLetter.Length - 4].ToString() + sLetter[sLetter.Length - 3].ToString() + okonchanie;
if (Array.IndexOf(prich,ok_i_suff)!= -1)//ищем в массиве суффиксов и окончаний причастий
{ return "причастие"; //если есть - результат причастие }
return "прилагательное"; //если нет - прилагательное }
if (String.Compare(okonchanie, "ом") == 0)//если окончание -ом
{ string res= GetNeuroResult(sLetter,"-ом",N_HID,beta,m,Epoch,flag_om);//распознаем слово нейросетью
flag_om = true;//при повторном поступлении слова на -ом нейросеть повторно обкчаться не будет
//Аналогично для -ем, -им, -ой, -ие, -ми.
Метод Scaning логически можно разделить на 3 блока:
- идентификация слова по окончанию и определение его типа;
- идентификация слова по окончанию и проведение углубленного анализа с п о мощью нейронной сети.
Во втором блоке подразумевается определение типа слова по окончанию (последние две буквы) при помощи условных операторов:
- при помощи метода IndexOf класса Array определ я ется наличие в соответствующем массиве (массиве окончаний глаголов - glagol, прилагательных - pril) да н ного окончания;
- если это окончание прилагательного или -ся то крит е рий поиска изменяется до идентификации по паре суффикс-окончание: определяется наличие данной пары в массиве prich (причастие);
- после проведения вышеуказанных операций функция возвращает тип лексемы: глагол, прилагательное или причастие;
- в случае, если окончание не найдено ни в одном из массивов, то тип лексемы определяется как существ и тельное;
- если слово оканчивается на -ие, -ми, -ем, -им, -ом то переходим к третьему блоку.
В третьем блоке в зависимости от окончания слова прои з водится вызов функции private string GetNeuroResult(string sLetter, string sFileName, int N_HID, double beta, double m, int Epoch, bool flag) параметрами:
- sFileName - имя файла с обучающей выборкой,
- N_HID - количество скрытых нейронов,
- Epoch - количество эпох обучения,
- flag - логическая переменная, в значении «истина» означающая, что анализ будет производиться без об у чения;
Код данной функции представлен ниже:
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);
{ //в зависимости от имени файла с обучающей выборкой возможны определенные комбинации возвращаемых результатов
//анализируем полученные значения нейросети и возвращаем результат
if (double.Parse(m_resultat[0]) < 0.5 && double.Parse(m_resultat[1]) < 0.5 && double.Parse(m_resultat[2]) < 0.5)
if (double.Parse(m_resultat[0]) < 0.5 && double.Parse(m_resultat[1]) < 0.5 && double.Parse(m_resultat[2]) > 0.5)
Алгоритм данной функции можно разделить на следующие этапы:
- извлечение обучающей выборки из файла,
- ее бинаризация при помощи класса Binarization,
- если flag==false - обучение нейронной сети,
- определение по полученному результату типа лекс е мы.
Программа выполнена в виде Windows- приложения в среде Microsoft Visual Studio и имеет оконный интерфейс .
Принцип работы программы заключается в совеместном использовании для распознавания слов хеш-таблицы и нейрос е ти. В зависимости от сложности, тип слова определяе т ся либо с помощью сравнения окончания с использованием простых условных операторов, либо поиском слова в хеш-таблице, либо при помощи нейросети (для случая с одинаковыми око н чаниями в разных частях речи).
- окно вво да текста для анализа (рисунок 13 );
- окно анализа текста (рисунок 14 );
- окно добавления лексемы в хеш-таблицу ил и в обуч а ющую выборку (рисунок 15 ).
Текст для анализа загружается из файла или вводится с клавиатуры в richTextBox. Результат анализа (лексема и класс) выв одится в dataGridView (рисунок 10)
Рисунок 10 - электронная таблица dataGridView
Программа запускается из файла KursP.exe. В интерфейсе окна ввода текста (рисунок 11) присутствуют две кнопки: “Загр у зить из файла” - загрузка текста для анализа, «Далее» - перейти к анализу. Текст для анализа можно вводить и вручную.
При нажатии кнопки «Далее» на экране появится окно ан а лиза текста (рисунок 12). В окне анализа текста имеются кнопки «Анализ» и «Обучение». Первая используется для ан а лиза текста без обучения нейросети, вторая - соответственно с обучение. Кнопка «Анализ» становится активной только при наличии фа й лов с весовыми коэффициентами для всех нейросетей. Резул ь таты анализа выводятся в таблицу лексем.
При необходимости можно добавить слово в хеш-таблицу или в обучающую выборку при нажатии на кнопки “Добавить слово в хеш-таблицу” и «Добавить слово на -ой, -им, -ем». После нажатия данных кнопок перед пользователем появится окно доба в ления слова (рисунок 13). Далее пользователю необходимо ввести слово и класс и нажать кнопку «Доб а вить».
Рисунок 13 - Окно добавления лексемы в хеш-таблицу или в обучающую выборку
Для тестирования программы будем использовать отрывок из произведения Л.Н. Толстого «Война и мир»:
«В штабе Кутузова ожидали вестей от командующего австрийской армией Мака. В это время в ш
Распознавание слов естественного языка с использованием нейросетей курсовая работа. Программирование, компьютеры и кибернетика.
Реферат На Тему Электромонтажные Инструменты И Приспособления
Дипломная работа по теме Методы и приемы психологического консультирования на "Телефоне доверия" и социально-психол...
Дипломная работа по теме Специфика копинг-стратегий женщин, прибегающих к услугам косметолога
Контрольная работа: Деятельность энергетического хозяйства
Курсовая работа по теме Организационно-экономическая деятельность ЗАО 'Портоп'
Реферат: Gender Equality Essay Research Paper Tyrone CloydBaltimore
Курсовая работа по теме Сравнительный анализ антимонопольного законодательства России и зарубежных стран
Творческая Работа На Тему Путешествие По Стране Чисел
Острая И Хроническая Почечная Недостаточность Реферат
Сочинение На Тему Кто Где Когда Зачем
Топик: Canada
Что Должно Быть В Эссе
Реферат: Режим содержания под стражей
Курсовая работа по теме Повышение эффективности деятельности на основе внедрения инновационных технологий
Контрольная работа по теме Застосування програмного продукту Power Point у процесі автоматизації роботи менеджера
Реферат по теме Создание брэнда компании
Курсовая работа по теме Нанотехнологии в науке и технике
Курсовая работа: Организация и ведение спасательных работ при пожарах
Реферат Аденовирусная Инфекция
Лабораторная Работа Микроскопическое Строение
Роль одорологии в раскрытии и расследовании преступлений - Государство и право курсовая работа
Получение внеклеточных полисахаридов - Биология и естествознание реферат
Проблеми мотивації у підприємствах (за матеріалами ТОВ "УКТ") - Менеджмент и трудовые отношения курсовая работа


Report Page