Автор работы: Пользователь скрыл имя, 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. Руководство программисту
Заключение
Список используемой литературы
Приложения
{
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].
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].
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);
Информация о работе Распознавание слов естественного языка с использованием нейросетей