private void начатьОбучениеToolStripMenuItem_Click(object sender, EventArgs e) { try { TeachForm tf = new TeachForm(); if (tf.ShowDialog() != DialogResult.OK) { return; } string[] arrFile = tf.openFileDialog1.FileNames; SortedDictionary <string, double> sdW = new SortedDictionary <string, double>(); for (int i = 0; i < tf.dataGridView1.Rows.Count; i++) { sdW.Add(tf.dataGridView1[0, i].Value.ToString(), double.Parse(tf.dataGridView1[1, i].Value.ToString())); } string regRep = ""; TInput.C_EAnswer[] arrAns = new TInput.C_EAnswer[arrFile.Length]; double[] arrTutMark = new double[arrFile.Length]; double[] arrIMark = new double[arrFile.Length]; double[] arrIW2Mark = new double[arrFile.Length]; double[] arrCos = new double[arrFile.Length]; double[][] mI = new double[Compare.lPosFiltered.Count + 1][]; // матрица инф. по ч.р. и ответам for (int i = 0; i < mI.Length; i++) { mI[i] = new double[arrFile.Length]; } int tut = int.Parse(tf.textBox1.Text) - 1; for (int i = 0; i < arrFile.Length; i++) { arrAns[i] = new TInput.C_EAnswer(arrFile[i]); arrTutMark[i] = arrAns[i].GetTutor(tut).Mark; } for (int i = 0; i < arrAns.Length; i++) { List <Word> lwx = Compare.Parse(arrAns[i].p_etalon_answer), lwy = Compare.Parse(arrAns[i].p_student_answer); string s, syn; SortedDictionary <Word, double>[] arrSDx = Compare.POSFilter(lwx), arrSDy = Compare.POSFilter(lwy); if (Properties.Settings.Default.Syn) { Compare.Syn(arrSDx, arrSDy, out syn); } if (tf.checkBox1.Checked || tf.checkBox2.Checked || tf.checkBox3.Checked) { double[] arrI; double hx, hy, hxy; arrIMark[i] = Compare.KuznetsovCompare(arrSDx, arrSDy, out hx, out hy, out hxy, out arrI, out s); double iw = 0; for (int j = 0; j < arrI.Length; j++) { mI[j][i] = arrI[j]; double w; if (j < Compare.lPosFiltered.Count) { if (sdW.TryGetValue(Compare.lPosFiltered[j], out w)) { iw += arrI[j] * w; } } else if (sdW.TryGetValue("Неопределенная_часть_речи", out w)) // неопределенная часть речи соответствует null { iw += arrI[j] * w; } } arrIW2Mark[i] = iw; } if (tf.checkBox4.Checked) { arrCos[i] = Compare.CosCompare(arrSDx, arrSDy, out s); } } Sample sY = new Sample("Q", "Q", arrTutMark); Regression[] arrReg = new Regression[4]; if (tf.checkBox1.Checked) { arrReg[0] = new Regression(sY, new Sample[] { new Sample("I", "I", arrIMark) }); } if (tf.checkBox2.Checked) { List <Sample> lsX = new List <Sample>(); for (int i = 0; i < Compare.lPosFiltered.Count + 1; i++) { int j; for (j = 0; j < mI[i].Length; j++) { if (mI[i][j] != 0) { break; } } if (j == mI[i].Length) { continue; } if (i < Compare.lPosFiltered.Count) { lsX.Add(new Sample(Compare.lPosFiltered[i], Compare.lPosFiltered[i], mI[i])); } else { lsX.Add(new Sample("Неопределенная_часть_речи", "Неопределенная_часть_речи", mI[i])); } } arrReg[1] = new Regression(sY, lsX.ToArray()); } if (tf.checkBox3.Checked) { arrReg[2] = new Regression(sY, new Sample[] { new Sample("IW2", "IW2", arrIW2Mark) }); } if (tf.checkBox4.Checked) { arrReg[3] = new Regression(sY, new Sample[] { new Sample("cos", "cos", arrCos) }); } string tbl = "<table border=1 cellspacing=0><tr><td>№<td>Оценка преподавателя<td>Число слов в эталоне" + "<td>Число слов в ответе"; if (tf.checkBox1.Checked) { tbl += "<td>Количество информации по ВСММ<td>Тарированная оценка по ВСММ"; } if (tf.checkBox2.Checked) { tbl += "<td>Тарированная оценка по ВСММ с опт. весами"; } if (tf.checkBox3.Checked) { tbl += "<td>Количество информации по ВСММ с зад. весами<td>Тарированная оценка по ВСММ с зад. весами"; } if (tf.checkBox4.Checked) { tbl += "<td>Критерий косинуса угла<td>Тарированная оценка критерия косинуса"; } for (int i = 0; i < arrTutMark.Length; i++) { tbl += string.Format("<tr><td>{0}<td>{1:g3}<td>{2}<td>{3}", i + 1, arrTutMark[i], Compare.Parse(arrAns[i].p_etalon_answer).Count, Compare.Parse(arrAns[i].p_student_answer).Count); if (tf.checkBox1.Checked) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrIMark[i], arrReg[0].arrYMod[i]); } if (tf.checkBox2.Checked) { tbl += string.Format("<td>{0:g4}", arrReg[1].arrYMod[i]); } if (tf.checkBox3.Checked) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrIW2Mark[i], arrReg[2].arrYMod[i]); } if (tf.checkBox4.Checked) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrCos[i], arrReg[3].arrYMod[i]); } } tbl += "</table>"; regRep = "<table border=1 cellspacing=0><tr><td>Метод<td>Регрессия"; if (tf.checkBox1.Checked) { regRep += string.Format("<tr><td>{0}<td>{1}", "Критерий совместной информации по ВСММ", arrReg[0].RegReport()); } if (tf.checkBox2.Checked) { regRep += string.Format("<tr><td>{0}<td>{1}", "Критерий совместной информации по ВСММ с опт. весами", arrReg[1].RegReport()); } if (tf.checkBox3.Checked) { regRep += string.Format("<tr><td>{0}<td>{1}", "Критерий совместной информации по ВСММ с зад. весами", arrReg[2].RegReport()); } if (tf.checkBox4.Checked) { regRep += string.Format("<tr><td>{0}<td>{1}", "Критерий косинуса", arrReg[3].RegReport()); } regRep += "</table>"; regRep = "<br><big>Результаты</big>" + tbl + "<big><br><br>Сравнение методов</big>" + regRep; SortedDictionary <string, double> sdWOpt = null; if (tf.checkBox2.Checked) { sdWOpt = new SortedDictionary <string, double>(); for (int i = 0; i < arrReg[1].arrSX.Length; i++) { sdWOpt.Add(arrReg[1].arrSX[i].name, arrReg[1].arrB[1 + i]); } } cp = new CmpParams() { useI = tf.checkBox1.Checked, useIWOpt = tf.checkBox2.Checked, useIW = tf.checkBox3.Checked, useCos = tf.checkBox4.Checked, sdW = sdW, sdWOpt = sdWOpt, regI = arrReg[0], regIWOpt = arrReg[1], regIW = arrReg[2], regCos = arrReg[3] }; RepForm rf = new RepForm(regRep); rf.Text = "Результаты обучения"; rf.ShowDialog(); } catch { MessageBox.Show("Ошибка обучения"); } }
private void ввестиСравниваемыеТекстыToolStripMenuItem_Click(object sender, EventArgs e) { try { CmpForm cf = new CmpForm(); if (cf.ShowDialog() != DialogResult.OK) { return; } string rep = ""; TInput.C_EAnswer[] arrAns = new TInput.C_EAnswer[1]; double[] arrIMark = new double[1]; double[] arrIWMark = new double[1]; double[] arrIW2Mark = new double[1]; double[] arrCos = new double[1]; arrAns[0] = new TInput.C_EAnswer("", "", "", cf.textBox1.Text, cf.textBox2.Text, new TInput.Tutor[] { new TInput.Tutor() }); string htbl = "<table border=1 cellspacing=0><tr><td>№<td>Hx<td>Hy<td>Hxy"; for (int i = 0; i < arrAns.Length; i++) { List <Word> lwx = Compare.Parse(arrAns[i].p_etalon_answer), lwy = Compare.Parse(arrAns[i].p_student_answer); string s, syn; SortedDictionary <Word, double>[] arrSDx = Compare.POSFilter(lwx), arrSDy = Compare.POSFilter(lwy); rep += string.Format("<big>Пара текстов №{0}</big>", i + 1); if (Properties.Settings.Default.Syn) { Compare.Syn(arrSDx, arrSDy, out syn); rep += "<br>Нормализация по синонимам" + syn + "<br><br>"; } if (cp.useI || cp.useIWOpt || cp.useIW) { double[] arrI; double hx, hy, hxy; arrIMark[i] = Compare.KuznetsovCompare(arrSDx, arrSDy, out hx, out hy, out hxy, out arrI, out s); rep += "<br>Расчет информационных характеристик текстов<br>" + s + "<br><br>"; htbl += string.Format("<tr><td>{0}<td>{1:g4}<td>{2:g4}<td>{3:g4}", i + 1, hx, hy, hxy); double hw = 0, hwOpt = 0; for (int j = 0; j < Compare.lPosFiltered.Count + 1; j++) { double w; if (j < Compare.lPosFiltered.Count) { if (cp.sdWOpt.TryGetValue(Compare.lPosFiltered[j], out w)) { hwOpt += arrI[j] * w; } } else if (cp.sdWOpt.TryGetValue("Неопределенная_часть_речи", out w)) { hwOpt += arrI[j] * w; } if (j < Compare.lPosFiltered.Count) { if (cp.sdW.TryGetValue(Compare.lPosFiltered[j], out w)) { hw += arrI[j] * w; } } else if (cp.sdW.TryGetValue("Неопределенная_часть_речи", out w)) { hw += arrI[j] * w; } } if (cp.useIWOpt) { arrIWMark[i] = hwOpt + cp.regIWOpt.arrB[0]; } if (cp.useIW) { arrIW2Mark[i] = hw; } } if (cp.useCos) { arrCos[i] = Compare.CosCompare(arrSDx, arrSDy, out s); rep += "Расчет критерия косинуса<br>" + s + "<br><br>"; } } htbl += "</table>"; string tbl = "<table border=1 cellspacing=0><tr><td>№<td>Число слов в эталоне<td>Число слов в ответе"; if (cp.useI) { tbl += "<td>Количество информации по ВСММ<td>Тарированная оценка по ВСММ"; } if (cp.useIWOpt) { tbl += "<td>Тарированная оценка по ВСММ с опт. весами"; } if (cp.useIW) { tbl += "<td>Количество информации по ВСММ с зад. весами<td>Тарированная оценка по ВСММ с зад. весами"; } if (cp.useCos) { tbl += "<td>Критерий косинуса угла<td>Тарированная оценка критерия косинуса"; } for (int i = 0; i < arrAns.Length; i++) { tbl += string.Format("<tr><td>{0}<td>{1}<td>{2}", i + 1, Compare.Parse(arrAns[i].p_etalon_answer).Count, Compare.Parse(arrAns[i].p_student_answer).Count); if (cp.useI) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrIMark[i], cp.regI.RegValue(new double[] { arrIMark[i] })); } if (cp.useIWOpt) { tbl += string.Format("<td>{0:g4}", arrIWMark[i]); } if (cp.useIW) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrIW2Mark[i], cp.regIW.RegValue(new double[] { arrIW2Mark[i] })); } if (cp.useCos) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrCos[i], cp.regCos.RegValue(new double[] { arrCos[i] })); } } tbl += "</table>"; rep += "<br><big>Результаты</big>" + tbl + "<br><br>"; if (cp.useI || cp.useIWOpt || cp.useIW) { rep += "<br><big>Таблица энтропий информационных объектов</big>" + htbl + "<br><br>"; } RepForm rf = new RepForm(rep); rf.Text = "Результаты оценки"; rf.ShowDialog(); } catch { MessageBox.Show("Ошибка оценки близости текстов"); } }
private void оценкаОтветовАОСToolStripMenuItem_Click(object sender, EventArgs e) { try { if (openFileDialog1.ShowDialog() != DialogResult.OK) { return; } string[] arrFile = openFileDialog1.FileNames; string rep = ""; TInput.C_EAnswer[] arrAns = new TInput.C_EAnswer[arrFile.Length]; double[] arrIMark = new double[arrFile.Length]; double[] arrIWMark = new double[arrFile.Length]; double[] arrIW2Mark = new double[arrFile.Length]; double[] arrCos = new double[arrFile.Length]; double[][] mH = new double[Compare.lPosFiltered.Count][]; for (int i = 0; i < mH.Length; i++) { mH[i] = new double[arrFile.Length]; } for (int i = 0; i < arrFile.Length; i++) { arrAns[i] = new TInput.C_EAnswer(arrFile[i]); } string htbl = "<table border=1 cellspacing=0><tr><td>№<td>Hx<td>Hy<td>Hxy"; for (int i = 0; i < arrAns.Length; i++) { List <Word> lwx = Compare.Parse(arrAns[i].p_etalon_answer), lwy = Compare.Parse(arrAns[i].p_student_answer); string s, syn; SortedDictionary <Word, double>[] arrSDx = Compare.POSFilter(lwx), arrSDy = Compare.POSFilter(lwy); rep += string.Format("<big>Пара текстов №{0}</big>", i + 1); if (Properties.Settings.Default.Syn) { Compare.Syn(arrSDx, arrSDy, out syn); rep += "<br>Нормализация по синонимам" + syn + "<br><br>"; } if (cp.useI || cp.useIW || cp.useIW2) { double[] arrPx, arrPy, arrPxy; double hx, hy, hxy; arrIMark[i] = Compare.KuznetsovCompare(arrSDx, arrSDy, out arrPx, out arrPy, out arrPxy, out hx, out hy, out hxy, out s); rep += "Расчет информационных характеристик текстов<br>" + s + "<br><br>"; htbl += string.Format("<tr><td>{0}<td>{1:g4}<td>{2:g4}<td>{3:g4}", i + 1, hx, hy, hxy); double hw = 0, hwOpt = 0; for (int j = 0; j < Compare.lPosFiltered.Count; j++) { double h = 0; if (arrPx[j] > 0) { h -= arrPx[j] * Math.Log(arrPx[j]); } if (arrPy[j] > 0) { h -= arrPy[j] * Math.Log(arrPy[j]); } if (arrPxy[j] > 0) { h += arrPxy[j] * Math.Log(arrPxy[j]); } mH[j][i] = h; double w; if (cp.sdWOpt.TryGetValue(Compare.lPosFiltered[j], out w)) { hwOpt += h * w; } if (cp.sdW.TryGetValue(Compare.lPosFiltered[j], out w)) { hw += h * w; } } arrIWMark[i] = hwOpt + cp.regIW.arrB[0]; arrIW2Mark[i] = hw; } if (cp.useCos) { arrCos[i] = Compare.CosCompare(arrSDx, arrSDy, out s); rep += "Расчет критерия косинуса<br>" + s + "<br><br>"; } } htbl += "</table>"; string tbl = "<table border=1 cellspacing=0><tr><td>№<td>Число слов в эталоне<td>Число слов в ответе"; if (cp.useI) { tbl += "<td>Количество информации по ВСММ<td>Тарированная оценка по ВСММ"; } if (cp.useIW) { tbl += "<td>Тарированная оценка по ВСММ с опт. весами"; } if (cp.useIW2) { tbl += "<td>Количество информации по ВСММ с зад. весами<td>Тарированная оценка по ВСММ с зад. весами"; } if (cp.useCos) { tbl += "<td>Критерий косинуса угла<td>Тарированная оценка критерия косинуса"; } for (int i = 0; i < arrFile.Length; i++) { tbl += string.Format("<tr><td>{0}<td>{1}<td>{2}", i + 1, Compare.Parse(arrAns[i].p_etalon_answer).Count, Compare.Parse(arrAns[i].p_student_answer).Count); if (cp.useI) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrIMark[i], cp.regI.RegValue(new double[] { arrIMark[i] })); } if (cp.useIW) { tbl += string.Format("<td>{0:g4}", arrIWMark[i]); } if (cp.useIW2) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrIW2Mark[i], cp.regIW2.RegValue(new double[] { arrIW2Mark[i] })); } if (cp.useCos) { tbl += string.Format("<td>{0:g6}<td>{1:g4}", arrCos[i], cp.regCos.RegValue(new double[] { arrCos[i] })); } } tbl += "</table>"; rep += "<br><big>Результаты</big>" + tbl + "<br><br>"; if (cp.useI || cp.useIW || cp.useIW2) { rep += "<br><big>Таблица энтропий информационных объектов</big>" + htbl + "<br><br>"; } RepForm rf = new RepForm(rep); rf.Text = "Результаты оценки"; rf.ShowDialog(); } catch { MessageBox.Show("Ошибка оценки близости текстов"); } }