p align="left">{ switch (znaks[i]) { case "с": result = "существительное";//если в конце слова буква с - возвращаем результат return result; case "п": result = "прилагательное"; return result; case "г": result = "глагол"; return result; } } } if (hash.CheckHash(sLetter, "predlog") == true)//проверяем, является ли слово предлогом (ищем в соответствующей хеш-таблице { result = "предлог";//если слово есть в хеш-таблице - возвращаем результат return result; } //Для местоимений, союзов, деепричастий и наречий аналогично … if (String.Compare(sLetter, "не") == 0 || String.Compare(sLetter, "бы") == 0) { result = "частица"; return result; } if (sLetter.Length < 2) { return "предлог"; } //-------------------------------------------------------------------- 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 "прилагательное"; //если нет - прилагательное } else … if (String.Compare(okonchanie, "ом") == 0)//если окончание -ом { string res= GetNeuroResult(sLetter,"-ом",N_HID,beta,m,Epoch,flag_om);//распознаем слово нейросетью flag_om = true;//при повторном поступлении слова на -ом нейросеть повторно обкчаться не будет return res; } else //Аналогично для -ем, -им, -ой, -ие, -ми. ….} Метод 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) параметрами: - sLetter - лексема, - sFileName - имя файла с обучающей выборкой, - N_HID - количество скрытых нейронов, - beta - коэффициент обучения, - m - момент, - 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); 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. Обучающие выборки нейросети хранятся в текстовых файлах: -ом, -ем, -им, -ми, -ие, -ой.
Страницы: 1, 2, 3, 4, 5, 6, 7
|