Рекомендуемая категория для самостоятельной подготовки:
Дипломная работа*
Код |
272179 |
Дата создания |
20 марта 2015 |
Страниц |
95
|
Мы сможем обработать ваш заказ (!) 20 декабря в 12:00 [мск] Файлы будут доступны для скачивания только после обработки заказа.
|
Описание
Данная дипломная работа посвящена разработке программы для статистического анализа текстов и сравнения двух текстов. На основе полученных пересечений слов из двух текстов, а также значений расчетных показателей делается вывод о степени их схожести. В приложении -исходный (рабочий) код программы на С#
Защищалась в 2012 г в Волгодонском институте сервиса, специалист, оценка-отлично. ...
Содержание
Введение 3
1 ОБРАБОТКА ТЕКСТОВЫХ ДОКУМЕНТОВ 4
1.1 Обработка текстовых документов, цели, задачи и область применения 4
1.2 Классификация и категоризация текстовых документов 5
1.3 Поиск по запросу, по ключевым словам, поиск по образцу, парсинг 12
1.4 Информационная модель базы документов 18
2 ОБЗОР ПРОГРАММНЫХ СРЕДСТВ 21
2.1 Среда разработки Visual Studio .Net 21
2.2 Язык программирования С# 25
2.3 Переменные типа String 29
2.4 Массивы и коллекции 36
3 РЕАЛИЗАЦИЯ ПРОГРАММЫ ДЛЯ СТАТИСТИЧЕСКОЙ ОБРАБОТКИ ТЕКСТА 45
3.1 Анализ задачи дипломного проектирования 45
3.2 Разработка алгоритма программы для статистической обработки текста 45
3.3 Первичная обработка текста: загрузка текста из файла, разбиение на слова и подсчет частот 47
3.4 Создание классов и массивов объектов пользовательских классов50
3.5 Удаление одинаковых элементов из массива объектов пользовательского класса 52
3.6 Внешний вид программы 54
3.7 Тестирование программы 56
4 ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ 57
4.1 Понятие информационной безопасности 57
4.2 Системный подход к информационной безопасности 59
4.3 Требования к безопасности программного обеспечения 64
4.4 Программно-технические способы и средства обеспечения информационной безопасности 65
4.5 Основные принципы контроля доступа к средствам вычислительной техники (СВТ) 70
4.6 Пассивные и активные системы обнаружения вторжений 74
5 Экономическая часть 78
5.1 Расход трудоемкости разработки программного продукта 78
5.2 Расход на оплату труда разработчика программы 80
5.3 Расчет полных затрат на эксплуатацию 81
5.4 Общие затраты на создание программного продукта 84
5.5 Целесообразность создания продукта 84
Заключение 86
Библиографический список 87
Приложение А 90
При вычислении весов термов учитывается их частота встречаемости в тексте документа. Порядок термов, как правило, не учитывается. Наиболее распространенный общий подход к вычислению веса терма реализует формула:
Mij =TFij ∙ IDFi (1.4)
где:
TF – относительная частота встречаемости терма в данном документе;
IDF– величина, обратная частоте встречаемости терма в остальных документах.
В дипломной работе рассчитывается также показатель относительной частоты, который более нагляден, чем просто частота.
В данной случае, под частотой понимается относительная доля слова i в тексте j, то есть отношение частоты терма к общему количеству слов в тексте, в отличие от абсолютной частоты – количества вхождений. В векторной модели термин «частота терма» аналогичен вероятности () в законах Зипфа [6].
Основывается вычисление этой величины, прежде всего на законах Зипфа, благодаря которым рассчитывается вероятность встретить слово в тексте. В размеченных текстах может также учитываться наличие терма в заголовке, выделение терма цветом и т.п.
Поскольку количество слов, выделенных из текстов документов, очень велико, то применяют различные способы уменьшения размерности пространства признаков: как неинформативные исключаются из рассмотрения слова с наибольшими и наименьшими частотами встречаемости; все словоформы и некоторые однокоренные слова заменяются одним словом; используется словарь синонимов. Таким образом, в общем случае терм представляет собой не слово (термин), а класс слов, объединенных по общему признаку (корню, значению).
1.4 Информационная модель базы документов
Хотя в дипломной работе напрямую не используются матрицы «документ-термин», строится подобная таблица для найденных пересечений между двумя текстами, за основу сравнения текстов берется показатель в матрице М.
Существуют разные способы сравнения текстов, однако часто используется именно относительный вес термина в документе.
Введение
важными задачами являются поиск подобных документов, документов по образцу, автозаполнение контента и т.п. Выделение значимых терминов в тексте помогает определить его тему, быстрое сравнение текстов помогает установить, относится ли текст к теме, сравнивая его с образцом. Также статистический анализ используется для выделения наиболее часто исполь-зуемых терминов в тексте, что применяется для классификации.
Также статистика текста используется пользователями-переводчиками, и теми, кто изучает иностранный язык, с целью пополнения словарного запаса и составления собственных словарей и шаблонов.
Помимо частотного анализа, хорошо характеризует значимость терминов и относительная частота, показывающая значимость более наглядно, а общий показатель на основе относительной частоты и обратной ин версной частоты в выборке является популярной и часто используемой мерой.
Фрагмент работы для ознакомления
Такой подход позволяет не беспокоиться о том, сколько элементов содержится в массиве, и быть уверенным, что каждый из них будет использован в цикле. Главное отличие между применением цикла foreach и стандартного цикла for состоит в том, что foreach предоставляет к содержимому массива доступ только для чтения, что не позволяет изменять значения элементов. Попытка сделать подобное приведет к невозможности компиляции. В случае использования простого цикла for, однако, присваивание значений элементам массива является возможным.Массивы, так же как и классы, постоянно использовались при реализации разработанного проекта статистической обработки текста.Коллекции. Выше говорилось о том, что для хранения нескольких переменных одинакового типа можно использовать массивы. То же самое можно делать и для объектов (напоминаем, что типы переменных, которые приводились в этой книге, на самом деле тоже являлись объектами, так что ничего особо удивительного в этом быть не должно). Ниже приведен пример: Animal[] animals = new Animal[5]; Коллекция представляет собой, по сути, массив, но с дополнительными возможностями. Коллекции реализуются в виде классов во многом точно так же, как и другие объекты. Их имена часто совпадают с именами объектов, которые они хранят, но только во множественном числе: например, класс с именем Animals может содержать коллекцию объектов Animal. Главное отличие от массивов состоит в том, что коллекции обычно реализуют дополнительные функции, вроде методов Add () и Remove () для добавления и удаления элементов из коллекции. У них также обычно имеется свойство Item, которое возвращает объект по его индексу. Массивы в С# реализуются в виде экземпляров класса System. Array и являются всего лишь одним из типов, которые называются классами коллекций. Классы коллекции в целом применяются для обслуживания списков объектов и могут предоставлять больше функциональных возможностей, чем простые массивы. Большая часть из этих функциональных возможностей обеспечивается реализацией интерфейсов из пространства имен System.Collections, что стандартизирует синтаксис коллекций. В этом пространстве имен также содержатся и другие интересные вещи, вроде классов, которые реализуют эти интерфейсы другими, отличными от System. Array способами. Поскольку функциональные возможности коллекций (включая базовые функции, вроде получения доступа к элементам коллекции путем применения синтаксиса [индекс]) доступны через интерфейсы, допускается не только использовать базовые классы коллекций вроде System.Array, но и создавать свои собственные специализированные классы коллекций и настраивать их под потребности объектов, которые должны поставляться в виде коллекции. Одним из преимуществ такого подхода, как будет показано позже, является то, что специальные классы коллекций могут быть строго типизированными. То есть при извлечении элементов из такой коллекции, их не нужно приводить к правильному типу. Другое преимущество связано с возможностью предоставлять специализированные методы, например, какой-то быстрый способ для получения подмножеств элементов. Скажем, в примере с колодой карт это мог быть метод для быстрого получения всех элементов Card определенной масти [19]. Базовые функциональные возможности для коллекций в пространстве имен System.Collections предоставляют несколько интерфейсов: IEnumerable – предоставляет возможность прогонять элементы в коллекции по циклу. ICollection – предоставляет возможность получать информацию о количестве элементов в коллекции и копировать элементы в простой тип-массив (унаследован от IEnumerable) . iList – предоставляет для коллекции список элементов вместе с возможностями для получения доступа к этим элементам и другими базовыми возможностями, имеющими отношение к спискам элементов (унаследован от IEnumerable и ICollection). IDictionary – похож на IList, но предоставляет список элементов, доступных по значению ключа, а не по индексу (унаследован от IEnumerable и ICollection). Класс System.Array реализует интерфейсы IList, ICollection и IEnumerable. Однако он не поддерживает некоторые из более совершенных функциональных возможностей IList и предоставляет список элементов с использованием фиксированного размера. Использование коллекций. Один из классов в пространстве имен Systems.Collections, а именно – System. Collections .ArrayList, тоже реализует интерфейсы IList, ICollection и IEnumerable, но делает это более совершенным образом, чем класс System.Array.Если массивы являются фиксированными по размеру (т.е. ни добавлять в них, ни удалять из них элементы нельзя), то этот класс может применяться для представления списков элементов разной длины.Определение свойств. Свойства определяются сходным с полями образом, но имеют больше особенностей. В частности, как уже упоминалось ранее, свойства являются более сложными, чем поля, поскольку могут выполнять дополнительную обработку перед изменением состояния – и, на самом деле, могут вообще не изменять состояния. Это получается благодаря тому, что они обладают двумя подобными функциям блоками, один из которых отвечает за получение значения свойства, а второй – за установку значения свойства. Эти блоки, также называемые средствами доступа (accessors), определяются с помощью, соответственно, ключевого слова get и ключевого слова set и могут применяться для управления уровнем доступа к свойству. Можно опускать тот или иной из них и тем самым создавать свойства, доступные только для записи или только для чтения (в частности, пропуск блока get позволяет обеспечивать доступ только для записи, а пропуск блока set – доступ только для чтения). Разумеется, это касается только внешнего кода, поскольку у кода внутри класса будет доступ к тем же данным, что и у этих блоков кода. Еще можно использовать со средствами доступа модификаторы доступности, т.е. делать, например, блок get общедоступным (public), а блок set – защищенным (protected). Для получения действительного свойства нужно обязательно включать хотя бы один из этих блоков (очевидно, что от свойства, которое нельзя ни считывать, не изменять, было бы мало толку). Базовая структура свойства состоит из стандартного ключевого слова, указывающего на уровень доступа (такого как public, private и т.д.), за которым идет имя типа, имя свойства и один или оба блока get и set, содержащие код обработки свойства.В реализации использовались классы объектов и массивы из них. Для создания массивов из объектов пользовательского класса нужно вначале создать пользовательский класс, после чего объявить массив, где в качестве типа переменных указать созданный класс.2.4.1 Сравнение пользовательских классовПри работе с ArrayList-массивом иногда нужно получить обычный массив, который бы содержал элементы динамического. Это можно сделать с помощью метода ТоАггау. Существует ряд причин для преобразования коллекции в массив. Во-первых, для определенных операций иногда важно сократить время обработки. Во-вторых, возможны ситуации, когда необходимо передать массив методу, который не перегружен для приема коллекции, В любом случае преобразование ArrayList-коллекции в массив не представляет сложности Класс Hashtable предназначен для создания коллекции, в которой для хранения объектов используется хеш-таблица. Возможно, многим известно, что в хеш-таблице для хранения информации используется механизм, именуемый хешированием (hashing). Суть хеширования состоит в том, что для определения уникального значения, которое называется хеш-кодом, используется информационное содержимое соответствующего ему ключа. Хеш-код затем используется в качестве индекса, по которому в таблице отыскиваются данные, соответствующие этому ключу. Преобразование ключа в хеш-код выполняется автоматически, т.е. сам хеш-код вы даже не увидите. Но преимущество хеширования – в том, что оно позволяет сохранять постоянным время выполнения таких операций, как поиск, считывание и запись данных, даже для больших объемов информации. Класс Hashtable реализует интерфейсы IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback и ICloneable.В классе Hashtable помимо методов, определенных в реализованных им интерфейсах, также определены собственные методы.. Чтобы определить, содержит ли Hashtable-коллекция заданный ключ, достаточно вызвать метод ContainsKey (). А чтобы узнать, хранится ли в интересующей вас хеш-таблице заданное значение, вызовите метод ContainsValue ().Для опроса элементов Hashtable-коллекции необходимо получить нумератор типа IDictionaryEnumerator, вызвав метод GetEnumerator ().Метод Еnumerable.Distinct<TSource> метод(IEnumerable <TSource> ) Возвращает различающиеся элементы последовательности, используя для сравнения значений компаратор проверки на равенство по умолчанию. TSource – это тип элементов последовательности source.В Visual Basic и C# этот метод можно вызывать как метод экземпляра для любого объекта типа IEnumerable<TSource>. При вызове метода для экземпляра следует опускать первый параметр. Данный метод реализуется с использованием отложенного выполнения. Немедленно возвращаемое значение – это объект, в котором хранится вся информация, необходимая для выполнения операции. Запрос, представленный данным методом, не выполняется до тех пор, пока не будет произведено перечисление объекта путем непосредственного вызова его метода GetEnumerator или с помощью оператора foreach в Visual C# либо For Each в Visual Basic.Метод Distinct<TSource>(IEnumerable<TSource>) возвращает неупорядоченную последовательность, в которой нет повторяющихся значений. Для сравнения значений им используется компаратор проверки на равенство по умолчанию Default.В синтаксисе выражения запроса Visual Basic предложение Distinct транслируется в вызов Distinct. Компаратор проверки на равенство по умолчанию Default используется для сравнения значений типов, которые реализуют универсальный интерфейс IEqualityComparer<T>. Чтобы сравнить пользовательский тип данных, необходимо реализовать этот интерфейс и предоставить собственные методы GetHashCode и Equals для типа.Для возврата различающихся элементов последовательностей объектов пользовательского типа данных, необходимо реализовывать в классе универсальный интерфейс IEqualityComparer<T>. В следующем примере кода показано, как реализовать этот интерфейс в пользовательском типе данных и предоставлять методы GetHashCode и Equals [22].public class Product : IEquatable<Product>{ public string Name { get; set; } public int Code { get; set; } public bool Equals(Product other) { //Check whether the compared object is null. if (Object.ReferenceEquals(other, null)) return false; //Check whether the compared object references the same data. if (Object.ReferenceEquals(this, other)) return true; //Check whether the products' properties are equal. return Code.Equals(other.Code) && Name.Equals(other.Name); } // If Equals() returns true for a pair of objects // then GetHashCode() must return the same value for these objects. public override int GetHashCode() { //Get hash code for the Name field if it is not null. int hashProductName = Name == null ? 0 : Name.GetHashCode(); //Get hash code for the Code field. int hashProductCode = Code.GetHashCode(); //Calculate the hash code for the product. return hashProductName ^ hashProductCode; }}3 РЕАЛИЗАЦИЯ ПРОГРАММЫ ДЛЯ СТАТИСТИЧЕСКОЙ ОБРАБОТКИ ТЕКСТА3.1 Анализ задачи дипломного проектированияПолучено следующее задание на дипломную работу. В программе должны подсчитываться абсолютные и относительные частоты слов в тексте, количество слов в тексте. Также желательно отыскивать пересечение слов двух текстов. Должна быть возможность загружать текст из файла. Для решения задачи выбран язык С# и среда разработки VisualStudio.Net 2010. Было решено сделать консольное приложение, чтобы больше внимание уделить разработке программы для обработки текста.3.2 Разработка алгоритма программы для статистической обработки текстаДля начала был разработан обобщенный алгоритм программы для статистического анализа текста.Словесное описание обобщенного алгоритма:Загрузка и обработка файла. Разделение текста на слова, сохранение в виде массива.Подсчет частот слов в цикле.На основании полученных частот расчет относительных частот TF.Повтор п.1-3 для второго текста.Сравнение 2 текстов и поиск пересечения слов.Вывод результатов на экранОбобщенный алгоритм представлен на рисунке 3.1.НачалоСоздание массиваПодсчетчастот в циклеСравнениепересечения текстовВывод результатовКонецЗагрузка из файла в строковую переменную, разбиение на слова с помощью массив разделителейС помощью временной переменной вначале считаются частоты слов, потом относительные частотыВыводятся таблицы абсолютных и относительных частот на экран, а также пересечение текстовРисунок 3.1 – Обобщенный алгоритм программыДалее приводится алгоритм подсчета абсолютных частот (рисунок 3.2). Он заканчивается занесением данных в массив. После получения массива со словами и частотами рассчитывается значение относительной частоты (частота на количество слов). Затем процедура повторяется для второго текста. Рисунок 3.2 – Алгоритм подсчета абсолютных частот слов текста3.3 Первичная обработка текста: загрузка текста из файла, разбиение на слова и подсчет частотКак описано в 2.3.4, текстовый файл загружается из файла. Чтобы не прописывать путь, текстовые файлы хранятся в папке …/bin/Debug. Первый текст в файле 111.txt, второй в 222.txt. Текстовый файл нужно сохранить в формате Unicode. Для того чтобы загрузить текст, нужно подключить библиотеку системного ввода-вывода System.IO или прописать ее в строке (System.IO. File.ReadAllText("111.txt");). Подгружаем системную библиотеку:using System.IO;Текст загружается в строковую переменную:string stroka = File.ReadAllText("111.txt");после чего он разбивается на слова.Также нужно сделать так, чтобы регистр не учитывался. Иначе одинаковые слова, написанные с маленькой и с большой буквы будут различаться, так как строковые переменные учитывают регистр. Для этого приведем весь текст к одному виду с помощью метода ToLower. Данный метод Возвращает строчную версию вызывающей строки. Вот его применение: string stroka1 = File.ReadAllText("111.txt"); //подключение текста из файла string stroka = stroka1.ToLower(); // переход всех слов к нижнему региструКак говорилось в разделе 2.3.2, разбиение текста на слова осуществляется оператором Split с помощью массива типа char separator, в котором перечислены все разделители:char[] separator = new char[9] { ' ', ',', '!', '.', '-', ';', ':', '–', '-' }; string[] slova; //а это соб-но массив слов slova = stroka.Split(separator); foreach (string slovo in slova) { Console.WriteLine("{0}", slovo); }Здесь выводятся все слова массива на консоль. Это нужно для отладки и проверки корректной работы программы. При дальнейшей работе вывод будет удален. //количество слов в тексте int k = slova.Length; Console.WriteLine("Длина массива " + k); Все полученные разделением слова записываются в массив slova. Подсчет количества слов в тексте осуществляется с помощью оператора, считающего количества элементов в массиве Length. После чего подсчитываются частоты. Подсчет частот проводится в цикле. Создается цикл по i и по j. Слово i-тое сравнивается по очереди со всеми словами по циклу j. Создается временная переменная tempsl, в которую записываются значения, если слова эквивалентны. Это определяется в методе Equals( string.Equals(slova[i], slova[j]) == true). В каждом случае эквивалентности прибавляется единица. Потом значение записывается в массив повторов kolvo, и временная переменная обнуляется.int[] kolvo = new int[k]; // массив где кол-во повторов // тут сравнивает слова и записывает это во временную переменную. for (int i = 0; i < slova.Length; i++) { int tempsl = 0; //это обнуляется временная переменная for (int j = 0; j < slova.Length; j++) { if (string.Equals(slova[i], slova[j]) == true ) { tempsl += 1; } } if (!String.IsNullOrEmpty(slova[i])) //это чтоб не пополнять массив лишними словами {kolvo[i] = tempsl; Console.WriteLine("Слово {0} было использовано {1}", slova[i], kolvo[i]); } } Чтобы не пополнять массив пустыми переменными, создается условие if, которое отбрасывает все пустые или равные 0 переменные (метод IsNullOrEmpty(slova[i])). Аналогично обрабатывается второй текст и значения слов записываются в массивы slova2 и kolvo2.3.4 Создание классов и массивов объектов пользовательских классовНа конец обработки данные хранятся в двух массивах: slova и kolvo (для второго текста slova2 и kolvo2). Это неудобно, так как нет соответствия, и нельзя обрабатывать массивы без сдвига данных. Поэтому был создан пользовательский класс Termin с двумя полями, слово и частота: class Termin // класс объектов слова+частоты { public string slovo; public int chastota; }Поскольку нужно будет сливать два массива из слов и частот двух текстов, создан еще один класс Term с полями слова, частота1, частота2, TF1 и TF2:class Term //класс объектов для массива 2 текстов { public string slova; public int chastota1; public int chastota2; public int TF1; //расчетные к-ты для относительной частоты public int TF2; }TF1и TF2 – это расчетные коэффициенты. Они показывают относительную частоту термина в документе. Как описано в гл. 1.2, относительная частота показывает вес термина в документе более точно, чем просто частота без учета количества слов в тексте. Она рассчитывается как частота слова деленная на количество слов в документе.Созданы 2 массива пользовательского класса Termin. Его полям были присвоены значения массивов slova и kolvo: Termin[] terminArray = new Termin[slova.Length]; for (int i = 0; i < slova.Length; i++) { terminArray[i] = new Termin();// массив объектов класса Termin terminArray[i].slovo = slova[i]; // полю слово присвоены элементы массива slova terminArray[i].chastota = kolvo[i]; // полю слово присвоены элементы массива kolvo } foreach (Termin term in terminArray) { Console.WriteLine(term.slovo + " " + term.chastota); // проверка корректности присвоения }Результат работы программы показан на рисунке 3.3 Частоты подсчитаны корректно, но выводятся одинаковые слова. На рисунке 3.3 видно, что слово «систем» показано 2 раза..Рисунок 3.3 Результат работы программы. Повторы частот3.5 Удаление одинаковых элементов из массива объектов пользовательского класса Как говорилось в гл. 2.4.1, метод Еnumerable.Distinct<TSource> возвращает различающиеся элементы последовательности, используя для сравнения значений компаратор проверки на равенство по умолчанию. Для возврата различающихся элементов последовательностей объектов пользовательского типа данных, необходимо реализовывать в классе универсальный интерфейс IEqualityComparer<T>. Поэтому сначала устанавливается универсальный интерфейс IEqualityComparer и прописывается операция сравнения.
Список литературы
В основном используются научные статьи и обзоры по статистической обработке текстов и ее методикам, а также книги по программированию на языке С#
1. Статистическая обработка текстов и сборка N-грамм [Электронный ресурс]: Все о статистической обработке, 2009. URL: http://www.solarix.ru/
2. Ву Ш.-Х., Цай Ц.-В., Сюй В.-Л. Текстовая категоризация с использованием автоматически построенных онтологий [Электронный ресурс]: Инженерия знаний, 2011. URL: http://asp.mmc.nsu.ru
3. Агеев А.М. Обзор современных направлений развития автоматической классификации текстов [Электронный ресурс]: УИС Россия, 2008. URL: http://www.cir.ru/
4. Грэхем П. Применение «наивного» Байеса для фильтрации спама в сервисах электронной почты [Электронный ресурс]: Хабрахабр, 2010. URL: http://www.habrahabr.ru
5. Мерзленко А.А. Автоклассификация текста с помощью нейронных сетей [Электронный ресурс]: ДонНГГ, 2011. URL: http://masters.donntu.edu.ua
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00529