/// </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