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

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

{

streamwriter.WriteLine(em[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] ie = { "большие@", "синие@", "маленькие@", "хорошие@", "плохие@", "хождение#", "мероприятие#", "становление#", "украшение#" };

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

{

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

StreamWriter streamwriter = new StreamWriter(filestream);

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

{

streamwriter.WriteLine(ie[i]);

}

streamwriter.Close();

filestream.Close();

}

string[] mi = { "красными@", "зелеными@", "хорошими@", "плохими@", "трудными@", "стульями#", "столами#", "ставнями#", "карандашами#" };

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

{

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

StreamWriter streamwriter = new StreamWriter(filestream);

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

{

streamwriter.WriteLine(mi[i]);

}

streamwriter.Close();

filestream.Close();

}

}

public string BigToSmall(string letter)

{

switch (letter)

{

case "А": return "а";

case "Б": return "б";

case "В": return "в";

case "Г": return "г";

case "Д": return "д";

case "Е": return "е";

case "Ё": return "ё";

case "Ж": return "ж";

case "З": return "з";

case "И": return "и";

case "Й": return "й";

case "К": return "к";

case "Л": return "л";

case "М": return "м";

case "Н": return "н";

case "О": return "о";

case "П": return "п";

case "Р": return "р";

case "С": return "с";

case "Т": return "т";

case "У": return "у";

case "Ф": return "ф";

case "Х": return "х";

case "Ц": return "ц";

case "Ч": return "ч";

case "Ш": return "ш";

case "Щ": return "щ";

case "Ъ": return "ъ";

case "Ы": return "ы";

case "Ь": return "ь";

case "Э": return "э";

case "Ю": return "ю";

case "Я": return "я";

}

return "ё";

}

public Analization(string sText, int N_HID, double beta, double m, int Epoch, bool flag)

{

AddEtalonLetter();

Results res;

string sLetter = "";

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

{

if (sText[i] == ' ' || sText[i] == '.' || sText[i] == ',' || sText[i] == '!' || sText[i] == '?' || sText[i] == '-' || sText[i] == ':' || sText[i] == ';')

{

if (sLetter == "")

{

goto k;

}

if ((Char.ConvertToUtf32(sLetter, 0) >= 1040 && Char.ConvertToUtf32(sLetter, 0) <= 1071))

{

if (i - sLetter.Length + 1 == 1)

{

string ch = BigToSmall(sLetter[0].ToString());

sLetter = ch + sLetter.Substring(1, sLetter.Length - 1);

goto m;

}

else

if (sText[i - sLetter.Length - 1] == ' ' && sText[i - sLetter.Length - 2] == '.')

{

string ch = BigToSmall(sLetter[0].ToString());

sLetter = ch + sLetter.Substring(1, sLetter.Length - 1);

goto m;

}

res.Class = "существительное";

res.letter = sLetter;

results.Add(res);

sLetter = "";

goto k;

}

m:

res.letter = sLetter;

res.Class = Scaning(sLetter, N_HID, beta, m, Epoch, flag);

results.Add(res);

if (sText[i] == '.')

{

res.Class = "точка";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

if (sText[i] == ',')

{

res.Class = "запятая";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

if (sText[i] == '!')

{

res.Class = "восклицательный знак";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

if (sText[i] == '?')

{

res.Class = "вопросительный знак";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

if (sText[i] == '-')

{

res.Class = "тире";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

if (sText[i] == ':')

{

res.Class = "двоеточие";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

if (sText[i] == ';')

{

res.Class = "точка  с запятой";

res.letter = sText[i].ToString();

results.Add(res);

goto k;

}

k: sLetter = "";

}

else

{

sLetter = sLetter + sText[i].ToString();

}

}

}

public List<Results> GetResult()

{

return results;

}

bool flag_oy = false, flag_om = false, flag_im = false, flag_em = false, flag_ie = false, flag_mi = false;

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;

case "-им":

res1 = "глагол";

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

break;

case "-ем":

res1 = "глагол";

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

break;

case "-ом":

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

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

break;

case "-ие":

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

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

break;

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 "неизвестно";

}

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

{

Hash hash = new Hash();

string result = "существительное";//результат

string[] znaks = { "с", "п", "г" };

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

{

if (hash.CheckHash(sLetter + znaks[i].ToString(), "iskl") == true)

{

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 (hash.CheckHash(sLetter, "mest") == true)

{

result = "местоимение";

return result;

}

if (hash.CheckHash(sLetter, "narechie") == true)

{

result = "наречие";

return result;

}

if (hash.CheckHash(sLetter, "deepr") == true)

{

result = "деепричастие";

return result;

}

if (hash.CheckHash(sLetter, "soyuz") == 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 (Array.IndexOf(glagol, okonchanie)!= -1)

{

return "глагол";

}

else

if (Array.IndexOf(glagol, okonchanie)!= -1)

{

return "глагол";

}

else

if (String.Compare(okonchanie, "ся") == 0)

{

string ok_i_suff = sLetter[sLetter.Length - 4].ToString() + sLetter[sLetter.Length - 3].ToString();

if (Array.IndexOf(pril, ok_i_suff)!= -1)

{

return "причастие";

}

else

{

return "глагол";

}

}

else

if (String.Compare(okonchanie, "ть") == 0)

{

char ok_i_suff = sLetter[sLetter.Length - 3];

if (ok_i_suff == 'а' || ok_i_suff == 'я' || ok_i_suff == 'ю' || ok_i_suff == 'у' || ok_i_suff == 'е' || ok_i_suff == 'и')

{

return "глагол";

}

else

{

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

}

}

else

if (String.Compare(okonchanie, "ом") == 0)

{

string res = GetNeuroResult(sLetter, "-ом", N_HID, beta, m, Epoch, flag_om);

flag_om = true;

return res;

}

else

if (String.Compare(okonchanie, "ем") == 0)

{

string ok_i_suff = sLetter[sLetter.Length - 4].ToString() + sLetter[sLetter.Length - 3].ToString() + okonchanie;

if (Array.IndexOf(prich, ok_i_suff)!= -1)

{

return "причастие";

}

string res = GetNeuroResult(sLetter, "-ем", N_HID, beta, m, Epoch, flag_em);

flag_em = true;

return res;

}

else

if (String.Compare(okonchanie, "им") == 0)

{

 

string res = GetNeuroResult(sLetter, "-им", N_HID, beta, m, Epoch, flag_im);

flag_im = true;

return res;

}

else

if (String.Compare(okonchanie, "ой") == 0)

{

string res = GetNeuroResult(sLetter, "-ой", N_HID, beta, m, Epoch, flag_oy);

flag_oy = true;

return res;

}

else

if (String.Compare(okonchanie, "ие") == 0)

{

string ok_i_suff = sLetter[sLetter.Length - 4].ToString() + sLetter[sLetter.Length - 3].ToString() + okonchanie;

if (Array.IndexOf(prich, ok_i_suff)!= -1)

{

return "причастие";

}

string res = GetNeuroResult(sLetter, "-ие", N_HID, beta, m, Epoch, flag_ie);

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