Распознавание слов естественного языка с использованием нейросетей
Распознавание слов естественного языка с использованием нейросетей
Государственное образовательное учреждение высшего профессионального образования Кубанский государственный технологический университет Армавирский механико-технологический институт Кафедра внутризаводского электрооборудования и автоматики ПОЯСНИТЕЛЬНАЯ ЗАПИСКАк курсовому проектупо дисциплине: Теория языков программированияна тему:«Распознавание слов естественного языка с использованием нейросетей»ЗАДАНИЕна курсовой проектСтуденту специальности 230105(2204) «Программное обеспечение вычислительной техники и автоматизированных систем»Тема проекта: «Распознавание слов естественного языка с использованием нейросетей»Содержание задания: 1. Настройка и обучение нейросети. 2. Лексический анализ текста, формирование таблицы лексем. 3. Распознавание типа слов. Требования: язык программирования 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. Анализ нейронных сетей 1.1 Выбор разновидности сети 1.2 Модель многослойного персептрона с обучением по методу обратного распространения ошибки 1.3 Постановка задачи 2. Проектирование библиотеки классов для реализации нейросети и тестовой программы 2.1 Программная реализация нейросети обратного распространения ошибки 2.2 Класс перевода текста в двоичный вид 2.3 Класс хеш-таблицы и методов работы с ней 2.4 Класс разбиения текста на лексемы и распознавания 2.5 Описание тестирующей программы 2.6 Результаты тестирования 3. Руководство программисту Заключение Список используемой литературы Приложения Введение Цель данного проекта: применение нейронной сети в лексическом анализе слов естественного языка. Задачи: смоделировать, программно реализовать, настроить и обучить нейросеть для лексического анализа слов естественного языка. Входной информацией являются параметры нейросети, файлы с обучающей выборкой. Выходной информацией является таблица лексем. Результатом курсового проекта должна быть программа-анализатор слов естественного языка с использованием нейросети. 1. Анализ нейронных сетей 1.1 Выбор разновидности сети Искусственные нейронные сети -- математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей -- сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Первой такой попыткой были нейронные сети Маккалока и Питтса. Впоследствии, после разработки алгоритмов обучения, получаемые модели стали использовать в практических целях: в задачах прогнозирования, для распознавания образов, в задачах управления и др. Искусственные нейронные сети представляют собой систему соединённых и взаимодействующих между собой простых процессоров (искусственных нейронов). Такие процессоры обычно довольно просты, особенно в сравнении с процессорами, используемыми в персональных компьютерах. Каждый процессор подобной сети имеет дело только с сигналами, которые он периодически получает, и сигналами, которые он периодически посылает другим процессорам. И тем не менее, будучи соединёнными в достаточно большую сеть с управляемым взаимодействием, такие локально простые процессоры вместе способны выполнять довольно сложные задачи. Существует много разновидностей нейронных сетей, но наиболее распространенными являются сети Кохонена, Хопфилда, обратного распространения ошибки. Недостатками сети Кохонена является ее сложность и проблемы при классификации похожих образов. Сеть Хопфилда также может стать нестабильной, если обучающие примеры являются слишком похожими. Данные недостатки являются существенными, т.к. сходные по написанию слова естественного могут относиться к разным частям речи. Соответственно, для реализации лексического анализатора наиболее подходящей является сеть обратного распространения ошибки. Обратное распространение - первый эффективный алгоритм обучения многослойных нейронных сетей. Один из самых популярных алгоритмов обучения, с его помощью были решены и решаются многочисленные практические задачи. 1.2 Модель многослойного персептрона с обучением по методу обратного распространения ошибки Когда в сети только один слой, алгоритм ее обучения с учителем очевиден, так как правильные выходные состояния нейронов единственного слоя заведомо известны, и подстройка синаптических связей идет в направлении, минимизирующем ошибку на выходе сети. По этому принципу строится, например, алгоритм обучения однослойного персептрона. В многослойных же сетях оптимальные выходные значения нейронов всех слоев, кроме последнего, как правило, не известны, и двух или более слойный персептрон уже невозможно обучить, руководствуясь только величинами ошибок на выходах НС. Ф. Розенблаттом использовал в своем персептроне не дифференцируемую ступенчатую функцию активации. Возможно, именно это помешало ему найти эффективный алгоритм обучения, хотя сам термин Back Propagation восходит к его попыткам обобщить свое правило обучения одного нейрона на многослойную сеть. Разберем этот ключевой для нейрокомпьютинга метод несколько подробнее. Алгоритм обратного распространения - это итеративный градиентный алгоритм, который используется с целью минимизации среднеквадратичного отклонения текущего выхода многослойного персептрона и желаемого выхода. Алгоритм обратного распространения используется для обучения многослойных нейронных сетей с последовательными связями. Нейроны в таких сетях делятся на группы с общим входным сигналом - слои. На каждый нейрон первого слоя подаются все элементы внешнего входного сигнала. Все выходы нейронов m-го слоя подаются на каждый нейрон слоя m+1. Нейроны выполняют взвешенное суммирование элементов входных сигналов. К сумме элементов входных сигналов, помноженных на соответствующие синаптические веса, прибавляется смещение (порог) нейрона. Над результатом суммирования выполняется нелинейное преобразование - функция активации (передаточная функция). Значение функции активации есть выход нейрона. На рисунке 1 показана укрупненная схема многослойной сети (многослойного персептрона). Нейроны представлены кружками, связи между нейронами - линиями со стрелками. Рисунок 1 - Многослойный персептрон Обозначим входы n-го слоя нейронов , весовые коэффициенты wij. Нейроны этого слоя вычисляют соответствующие линейные комбинации ai: (1) и передают их на следующий слой, пропуская через нелинейную функцию активации: . (2) Нелинейная функция f называется активационной и может иметь различный вид, как показано на рисунке 2. Одной из наиболее распространенных является нелинейная функция с насыщением, так называемая логистическая функция или сигмоид (т.е. функция S-образного вида): (3) При уменьшении сигмоид становится более пологим, в пределе при =0 вырождаясь в горизонтальную линию на уровне 0.5, при увеличении сигмоид приближается по внешнему виду к функции единичного скачка с порогом T в точке x=0. Из выражения для сигмоида очевидно, что выходное значение нейрона лежит в диапазоне [0,1]. Одно из ценных свойств сигмоидной функции - простое выражение для ее производной. Рисунок 2 - а) функция единичного скачка; б) линейный порог (гистерезис); в) гиперболический тангенс; г) сигмоид Следует отметить, что сигмоидная функция дифференцируема на всей оси абсцисс, что используется в некоторых алгоритмах обучения. Кроме того она обладает свойством усиливать слабые сигналы лучше, чем большие, и предотвращает насыщение от больших сигналов, так как они соответствуют областям аргументов, где сигмоид имеет пологий наклон. Для построения алгоритма обучения необходимо знать производную ошибки по каждому из весов сети: . (4) Таким образом, вклад в общую ошибку каждого веса вычисляется локально, простым умножением невязки нейрона на значение соответствующего входа. (Из-за этого, в случае, когда веса изменяют по направлению скорейшего спуска , такое правило обучения называют дельта-правилом.) Входы каждого слоя вычисляются последовательно от первого слоя к последнему во время прямого распространения сигнала: , (5) а невязки каждого слоя вычисляются во время обратного распространения ошибки от последнего слоя (где они определяются по выходам сети) к первому: . (6) Области применения многослойных персептронов, с обучением по методу обратного распространения:- распознавание образов; - классификация; - прогнозирование;- экспертные системы.Рассмотрим алгоритм сети обратного распространения ошибки подробнее.Входной набор данных, на котором сеть должна быть обучена, подается на входной слой сети (рисунок3), и сеть функционирует в нормальном режиме (т.е. вычисляет выходные данные).Рисунок 3 - Прямое распространение сигналаПолученные данные сравниваются с известными выходными данными для рассматриваемого входного набора. Разница между полученными и известными (опытными) данными - вектор ошибки.Вектор ошибки используется для модифицирования весовых коэффициентов выходного слоя с тем, чтобы при повторной подаче (рисунок 4) того же набора входных данных вектор ошибки уменьшался.Рисунок 4 - Модифицирование весовых коэффициентов выходного слоя (обратное распространение ошибки)Затем таким же образом модифицируются весовые коэффициенты скрытого слоя, на этот раз сравниваются выходные сигналы нейронов скрытого слоя и входные сигналы нейронов выходного слоя (рисунок 5), целью данного сравнения является формирование вектора ошибки для скрытого слоя.Рисунок 5 - Модифицирование весовых коэффициентов скрытого слоя (обратное распространение ошибки)Если в сети существует входной слой (именно слой, а не ряд входных значений), то проводятся аналогичные действия и с ним.Следует заметить, что ошибка может быть распространена на любой желаемый уровень (т.е. в нейронной сети может быть неограниченное количество скрытых слоев, для которых рассчитывается вектор ошибки по одной и той же схеме). Сеть обучается путем предъявления каждого входного набора данных и последующего распространения ошибки. Этот цикл повторяется много раз. Например, для распознавания цифры от 0 до 9, сначала обрабатывается символ "0", символ "1" и так далее до "9", затем весь цикл повторяется много раз. Не следует поступать иначе, а именно, обучать сеть по отдельности сначала символу "0" (n-ое количество раз), потом "1", потом "2" и т.д., т.к. сеть вырабатывает очень "четкие" весовые коэффициенты для последнего входного набора (то есть для "9"), "забывая" предыдущие. Например, к тысячному повтору обучения символу "1" теряются весовые коэффициенты для распознавания символа "0". Повторяя весь цикл для всего набора входных данных, мы предполагаем, что каждый символ оказывает равноправное влияние на значения весовых коэффициентов.Таким образом, полный алгоритм обучения НС с помощью процедуры обратного распространения строится так:1. Инициализировать пороговые значения и весовые коэффициенты небольшими случайными величинами (не более 0.4). 2. Подать на входы сети один из возможных образов и в режиме обычного функционирования НС, когда сигналы распространяются от входов к выходам.3. Вычислить ошибки для выходного слоя. При этом используем следующую формулу для каждого i-ого значения выходного слоя: Ei = (ti - ai).ai.(1 - ai) (7)Здесь Ei - ошибка для i-ого узла выходного слоя, ai - активность данного узла, ti - требуемая активность для него же (т.е. требуемое выходное значение).Используем значения ошибок выходного слоя для определения ошибок в скрытом слое. Формула практически та же, но теперь не определены желаемые выходные значения. Вычислить взвешенную сумму значений ошибок выходного слоя по формуле:Ei = ai. (1 - ai). Уj Ej.wij (8)Смысл переменных по сравнению с формулой (9) изменился незначительно. индекс i используется для нейронов скрытого слоя (а не выходного), Ei, следовательно, значение ошибки для нейрона скрытого слоя, и ai - сигнал на выходе нейрона. Индекс j относится к нейронам выходного слоя: wij - вес (весовой коэффициент) связи между i-ым скрытым нейроном и j-ым выходным нейроном, а Ej - значение ошибки для выходного нейрона j. Суммирование проводится для всех весов связей между отдельно взятым i-ым нейроном и всеми нейронами выходного слоя.Обратим внимание, что сумма включает в себя взвешенные связи только между рассматриваемым в данный момент нейроном скрытого слоя и всеми нейронами выходного слоя.Полученные значения ошибок для выходного слоя будем использовать для изменения весовых коэффициентов между скрытым и выходным слоями. Вычислить все значения ошибок до модификации весовых коэффициентов, так как в формуле присутствуют и старые значения весов. Применяем уравнение:new wij = old wij + здj.xi (9)где wij - вес связи между нейроном i скрытого слоя и нейроном j выходного;дj - приращение ошибки для выходного нейрона j; xi - сигнал на выходе скрытого нейрона i; з - константа. Константа используется для того, чтобы обучение не проводилось слишком быстро, то есть весовые коэффициенты не изменялись слишком сильно за один шаг обучения (что является причиной прыжков сходимости при обучении сети).Пороговые уровни нейронов также инициализируются небольшими случайными числами и нуждаются в обучении. Пороговые уровни трактуются так же, как и весовые коэффициенты, за исключением того, что входные значения для них всегда равны -1 (знак минуса - т.к. уровни вычитаются во время функционирования сети):new threshold = old threshold + здj.(-1) (10)или (в более удобном виде):new threshold = old threshold - здj (11)1.3 Постановка задачиЗадачей данного курсового проекта является создание программы распознавания слов естественного языка с использованием нейросетей. Для ее выполнения была выбрана нейронная сеть обратного распространения ошибки, которая будет реализована на языке программирования C# в виде класса. Класс будет содержать конструктор, на который будут подаваться значения следующих параметров: - обучающая выборка; - тестовая выборка; - количество нейронов скрытого слоя; - коэффициент обучения; - момент; - количество эпох обучения. Для перевода обучающих и тестовых слов в двоичный вид, а также сохранения слов-исключений в хеш-таблице будут предусмотрены отдельные классы. Также будет создан класс, производящий разбиение текста на отдельные лексемы и их распознавание средствами нейросети и хеш-таблицы. Соответственно, для решения поставленной задачи необходимо создание четырех классов: - класс нейросети и средств ее обработки; - класс перевода текста в двоичный вид; - класс хеш-таблицы и методов работы с ней; - класс разбиения текста на лексемы и распознавания. Созданные классы будут оформлены в виде библиотечного компонента. Для тестирования созданного класса будет создано Windows-приложение с использованием визуальных компонентов. Тестирующая программа должна осуществлять ввод текстовой информации из файла и с клавиатуры, а также ввод параметров нейросети: количество эпох обучения, количество нейронов скрытого слоя, момент и коэффициент обучения. 2. Проектирование библиотеки классов для реализации нейросети и тестовой программы 2.1 Программная реализация нейросети обратного распространения ошибки Алгоритм был реализован в виде класса NeuroNetwork. UML диаграмма класса представленна на рисунке 6. |
Класс NeuroNetwork | | Закрытые поля | | string filename; | | 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; | | double M; | | int num_cycles; | | Закрытые методы | | private double sigmoid(double x) | | private void run_input_layer() | | private void run_hidden_layer() | | private void run_output_layer() | | private void run_the_network() | | private void display_the_results(out string[] outp) | | private void AddWeightsToFile() | | private void blank_changes() | | private void calculate_output_layer_errors() | | private void calculate_hidden_layer_errors() | | private void calculate_input_layer_errors() | | private void weight_change() | | private void back_propagate() | | private void ExtractWeights() | | Открытые методы | | public void random_weights() | | public void get_test_pattern(double[] tests) | | public void train_the_network() | | 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; - желаемый выход - OUT_PATTERNS; - момент - M; - коэффициент обучения - BETA; - количество нейронов скрытого слоя - N_HID; - количество нейронов входного слоя - Max_inp; - количество образцов, содержащихся в обучающей выборке - Max_par; - количество эпох обучения - Epoch; - имя файла с обучающей выборкой - name; - логическая пременная indicate, сигнализирующая о необходимости обучения сети. Ввод тестируемой выборки производится посредствам метода get_test_pattern(double[] tests). Для описания нейрона была создана структура neuron_type, содержащая следующие поля: - список весовых коэффициентов для связей между данным нейроном и всеми нейронами предыдущего слоя (или входными данными, если нейрон находится во входном слое). Каждый весовой коэффициент - действительное число (по 1 весовому коэффициенту на нейрон предыдущего слоя); - пороговый уровень; - значение ошибки, используется только на стадии обучения; - изменение ошибки, также используется только во время обучения. Описание нейрона привидено ниже: struct neuron_type { public double[] w; //весовые коэффициенты public double[] change;//модификация весовых коэффициентов используется в процессе обучения public double threshold, a; //а-сигнал на выходе нейрона,threshold-значение порога public double t_change; //модификация порога используется в процессе обучения public double E; //значение ошибки } Выходной сигнал нейрона хранится в поле a (так называемая активность нейрона). Нейрон должен отреагировать на входной сигнал, поступающий по взвешенным связям, вычислив при этом выходной сигнал. Для трансформации входных сигналов в выходные необходима функция. Ниже приведена декларация узлов с помощью закрытых переменных. Постоянные обозначают количество нейронов во входном, скрытом и выходном слое: int MAX_INP; //Количество нейронов в входном слое int MAX_HID; //Количество нейронов в скрытом слое int MAX_OUT; //Количество нейронов в выходном слое neuron_type[] ipl; //Входной слой neuron_type[] hl; //Скрытый слой neuron_type[] ol; //Выходной слой Функция активации (2) была реализована в открытом методе sigmoid. В данном метода используется формула (3). Код на С# для этого метода: private double sigmoid(double x) { return 1 / (1 + Math.Exp(-x)); } Однако функция Exp приводит к ошибке в программе, если входное значение выходит из промежутка -39..38. К счастью, эти значения настолько далеко отстоят от начала координат, что мы можем считать: при аргументе < -39 значение функции равно 0, при аргументе > 38, - значение функции равно 1. Для предотвращения ошибки добавим несколько строчек: 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; } } } Биологические нейроны не срабатывают (не выдают выходной сигнал) до тех пор, пока уровень входного сигнала не достигнет некоторого порогового значения, т.е. на вход нейрона поступает сумма взвешенных сигналов минус некоторая величина. Полученное значение проходит через активационную функцию. Каждая активность нейрона предыдущего слоя умножается на соответствующий весовой коэффициент, результаты умножения суммируются (1), вычитается пороговое значение, вычисляется значение сигмоидной функции (5). Вот пример на С#: Вычисление суммы взвешенных сигналов для входного набора данных 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];//(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() { 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; } } Используя формулы (9), (10), (11) получим функцию, обучающую весовые коэффициенты и пороговые уровни: private void weight_change() { //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(). В общем виде функция обучения сети будет выглядеть следующим образом: 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(); } Для очистки предыдущих значений используется функция blank_changes. Для упрощения временной сложности работы сети полученные весовые коэффициенты будем записывать в отдельные файлы (метод AddWeightsToFile()), имена которым даются программой автоматически Для считывания сохраненных параметров будет применяться метод ExtractWeights(). 2.2 Класс перевода текста в двоичный вид Данный класс предназначен для бинаризации исходных данных (слов), т.е. перевода слов с естественного языка в набор единиц и нулей. Данная процедура является необходимой, т.к. нейронная сеть обратного распространения ошибки работает только с двоичными данными. UML диаграмма класса Binarization представлена на рисунке 7. |
Класс Binarization | | Закрытые поля | | string[] sLetter; | | int iLengthPattern; | | Закрытые методы | | 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. |
Класс Hash | | Закрытые поля | | Dictionary<int, string> predlog = new Dictionary<int, string>(); | | Dictionary<int, string> narechie = new Dictionary<int, string>(); | | Dictionary<int, string> deepr = new Dictionary<int, string>(); | | Dictionary<int, string> soyuz = new Dictionary<int, string>(); | | Dictionary<int, string> mest = new Dictionary<int, string>(); | | Dictionary<int, string> iskl = new Dictionary<int, string>(); | | 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) | | public Hash() | | |
Рисунок 8 - UML диаграмма класса Hash
Полями данного класса являются хеш-таблицы - predlog (содержит предлоги), narechie (наречия), deepr (деепричастия), soyuz (союзы), mest (местоимения), iskl (существительные, глаголы, прилагательные сложные для распознавания). Класс также содержит методы: - HashFunction - значение хеш-функции для текущего слова; - CheckHash - проверка наличия записи в хеш-таблице; - AddLetterInHashAndFile - классификация и добавление нового слова в хеш-таблицу, а также запись в файл; - AddToHash - добавление слова в хеш-таблицу; - ReadFileInHash и WriteWordInHash - чтение слов из файла и запись слова в файл соответственно.
2.4 Класс разбиения текста на лексемы и распознавания Данный класс является главным. Его задача - вычленение лексем из текста и их дальнейшее распознавание. В нем используются объекты всех вышеописанных классов. UML-диаграмма класса Analization представлена на рисунке 9. |
Класс Analization | | Закрытые поля | | List<Results> results = new List<Results>(); | | bool flag_oy = false; | | bool flag_om = false; | | bool flag_im = false; | | bool flag_em = false; | | Bool flag_ie=false; | | bool flag_mi=false; | | Закрытые методы | | private void AddEtalonLetter() | | 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) | | public List<Results> GetResult() | | |
Страницы: 1, 2
|