Пример #1
0
        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("Ошибка обучения");
            }
        }
Пример #2
0
        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("Ошибка оценки близости текстов");
            }
        }
Пример #3
0
 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("Ошибка оценки близости текстов");
     }
 }