/// </summary>
/// <param name="arrayOfSet"></param>
static void RandomSort(TextInfo[] arrayOfSet)
{
Random rand = new Random();
for (int i = 0; i < arrayOfSet. Length; i++)
{
int index1 = rand. Next(0, arrayOfSet. Length - 1);
int index2 = rand. Next(0, arrayOfSet. Length - 1);
TextInfo temp = arrayOfSet[index1];
arrayOfSet[index1] = arrayOfSet[index2];
arrayOfSet[index2] = temp;
}
}
/// <summary>
/// Нормализация исходных текстов
/// </summary>
static void NormText()
{
// Нормализуем положительные тексты
TextNormalizer srcText = new TextNormalizer();
srcText. Normalize("SourceTexts\\PlusSamples", "NormalizedTexts\\PlusSamples");
// Нормализуем отрицательные тексты
srcText. Normalize("SourceTexts\\MinusSamples", "NormalizedTexts\\MinusSamples");
// Нормализуем тау-тексты
srcText. Normalize("SourceTexts\\TauSamples", "NormalizedTexts\\TauSamples");
}
/// <summary>
/// Построение массива из множеств слов, содержащихся в каждом тексте
/// </summary>
/// <param name="dict"></param>
/// <param name="dirName"></param>
/// <param name="samples"></param>
static void BuildHashSet(Dictionary<string, int> dict, string dirName,
out TextInfo[] samples, char type)
{
DirectoryInfo diNormText = new DirectoryInfo(dirName);
FileInfo[] fiNormText = diNormText. GetFiles();
samples = new TextInfo[fiNormText. Length];
for (int i = 0; i < fiNormText. Length; i++)
samples[i].setValues = new HashSet<int>();
for (int i = 0; i < fiNormText. Length; i++)
{
StreamReader sr = new StreamReader(dirName + "\\" + fiNormText[i].Name,
Encoding.GetEncoding(1251));
samples[i].name = fiNormText[i].Name;
while (!sr. EndOfStream)
{
string str = sr. ReadLine();
string[] masStr = str. Split('=', ',');
if (dict. ContainsKey(masStr[0]))
samples[i].setValues. Add(dict[masStr[0]]);
}
samples[i].type = type;
sr. Close();
}
}
static void PrintResultCrossValidation(string description, EffectMeasure koeff, long time)
{
StreamWriter sw = new StreamWriter("ResultsCrossValidation. txt", false, Encoding.GetEncoding(1251));
sw. WriteLine(description);
sw. WriteLine("Preccision = {0:d3}", koeff. precission. ToString());
sw. WriteLine("Recall = {0:d3}", koeff. recall. ToString());
sw. WriteLine("F1-measure = {0:d3}", koeff. f1_measure. ToString());
sw. WriteLine("Accuracy = {0:d3}", koeff. accuracy. ToString());
sw. WriteLine("Time processing = {0}", time. ToString());
sw. Close();
}
static void PrintResultClassification(char[] resClassification, TextInfo[] tauSamples, long time)
{
StreamWriter sw = new StreamWriter("ResultsClassification. txt", false, Encoding.GetEncoding(1251));
for (int i = 0; i < tauSamples. Length; i++)
sw. WriteLine("{0} {1}", tauSamples[i].name, resClassification[i]);
sw. WriteLine("Time processing = {0}", time. ToString());
sw. Close();
}
static void Main(string[] args)
{
bool error = false;
double imbalance;
int typeFuncResolution;
int index = 0;
if (args. Length > 0 && args. Length <= 5)
{
// Вызов справки
if (index < args. Length && args[index] == "-help")
{
error = true;
}
// Проверка необходимости нормализации текстов
if (!error && index < args. Length && args[index] == "-n")
{
NormText();
index++;
}
// Тип функции разрешения конфликтов
try
{
typeFuncResolution = int.Parse(args[index]);
if (typeFuncResolution < 1 && typeFuncResolution > 6)
{
error = true;
Console.WriteLine("Ошибка! Неверно задан номер функции разрешения конфликтов");
}
index++;
}
catch
{
typeFuncResolution = 1;
}
// Коэффициент дисбаланса
try
{
imbalance = double.Parse(args[index]);
index++;
}
catch
{
imbalance = 1;
}
Stopwatch timer = new Stopwatch();
Dictionary<string, int> dict = new Dictionary<string, int>();
LoadDictionary(dict);
// Массив множеств, содержащий в i-той ячейке номера слов из словаря, входящих в i-тый текст
TextInfo[] plusSamples, minusSamples, tauSamples;
BuildHashSet(dict, "NormalizedTexts\\PlusSamples", out plusSamples, '+');
BuildHashSet(dict, "NormalizedTexts\\MinusSamples", out minusSamples, '-');
BuildHashSet(dict, "NormalizedTexts\\TauSamples", out tauSamples, 't');
// Проверка необходимости проведения процедуры кросс-валидации
if (!error && index < args. Length && args[index][0] == '-' && args[index][1] == 'c')
{
// Запускаем таймер
timer. Start();
string[] str = args[index].Split('/');
int numBlocks = 5;
if (str. Length > 2)
{
error = true;
Console.WriteLine("Ошибка! Неверно задан параметр перекресной проверки");
}
else if (str. Length == 2)
{
try
{
numBlocks = int.Parse(str[1]);
if (numBlocks < 2 || numBlocks > Math.Min(plusSamples. Length, minusSamples. Length))
{
error = true;
Console.WriteLine("Ошибка! Количество блоков должно быть в диапазоне от {0} до {1}", "2",
Math.Min(plusSamples. Length, minusSamples. Length));
}
}
catch
{
error = true;
Console.WriteLine("Ошибка! Неверно задано количество блоков");
}
}
if (!error)
{
// Средние показатели эффективности
EffectMeasure averAffectMeasure = new EffectMeasure();
RandomSort(plusSamples);
RandomSort(minusSamples);
CrossValidator cv = new CrossValidator();
cv. ProcessTexts(plusSamples, minusSamples, ref averAffectMeasure, numBlocks,
imbalance, typeFuncResolution);
timer. Stop();
PrintResultCrossValidation("Average value on " + numBlocks. ToString() + " tests:",
averAffectMeasure, timer. ElapsedMilliseconds);
timer. Reset();
index++;
}
}
// Проверка необходимости классификации тау-текстов
if (!error && index < args. Length && args[index] == "-t")
{
timer. Start();
JsmProcessor jp = new JsmProcessor();
// Список гипотез
List<Hypothesis> plusHypotheses = new List<Hypothesis>();
List<Hypothesis> minusHypotheses = new List<Hypothesis>();
// Индукция
jp. Induction(plusHypotheses, plusSamples);
jp. Induction(minusHypotheses, minusSamples);
List<Hypothesis>[] coincidedHyp;
// Аналогия
jp. Analogy(plusHypotheses, minusHypotheses, tauSamples, out coincidedHyp);
char[] resClassification = new char[tauSamples. Length];
// Классификация тау-текстов
jp. Classification(resClassification, coincidedHyp, imbalance, typeFuncResolution);
timer. Stop();
PrintResultClassification(resClassification, tauSamples, timer. ElapsedMilliseconds);
index++;
}
if (!error && index < args. Length)
{
Console.WriteLine("Ошибка! Команда содержит неизвестные параметры или последовательность параметров задана неверно");
error = true;
}
}
else
{
Console.WriteLine("Ошибка! Неверное количество параметров");
error = true;
}
if (error)
{
Console.WriteLine("Синтаксис команды:");
Console.WriteLine("JSM_VS [-n] [f] [k] [-c/b] [-t] [-help]");
Console.WriteLine("\t-n\tвыполнить нормализацию текстов");
Console.WriteLine("\tf\tтип функции разрешения конфликтов (по умолчанию 1)");
Console.WriteLine("\t\t1\tна основе суммарного кол-ва гипотез");
Console.WriteLine("\t\t2\tна основе суммарного кол-ва характеристик");
Console.WriteLine("\t\t3\tна основе суммарного кол-ва родителей");
Console.WriteLine("\t\t4\tпроизведение кол-ва характеристик на кол-во родителей");
Console.WriteLine("\t\t5\tвзвешенное среднее арифметическое числа характеристик");
Console.WriteLine("\t\t6\tвзвешенное среднее арифметическое числа родителей");
Console.WriteLine("\tk\tкоэффициент дисбаланса (+) и (-) текстов (по умолчанию 1)");
Console.WriteLine("\t-с\tвыполнить перекрестную проверку");
Console.WriteLine("\t\tb\tколичество блоков (по умолчанию 5)");
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 |


