close

Вход

Забыли?

вход по аккаунту

?

Основная часть (2)

код для вставкиСкачать
 ВВЕДЕНИЕ
В ходе изучения предмета "Основы Алгоритмизации и Программирования" был разработан курсовой проект "Программное средство реализующее оценку похожести текстов", основное назначение которого - определение плагиата. Плагиат - это заимствование чужой работы, будь то преднамеренно или непреднамеренно, как своей, ради собственной выгоды.
Плагиат с появлением Интернета превратился в серьёзную проблему. Попав в Интернет, знание становится достоянием всех, соблюдать авторское право становится всё труднее и даже невозможно. Постепенно становится сложнее идентифицировать первоначального автора.
Стремительное развитие сети Интернет наряду с увеличивающейся компьютерной грамотностью способствует проникновению плагиата в различные сферы человеческой деятельности: плагиат является острой проблемой в образовании, промышленности и научном сообществе.
Плагиат является преступлением. Это вводит в заблуждение читателей, приносит ущерб автору, и предоставляет незаслуженные блага плагиатору.
Широкий доступ к отечественной и зарубежной литературе, многократное увеличение числа профессиональных изданий, публикаций в Интернете - всё это практически сводит на нет какие бы то ни было редакторские стремления "проверить" или "установить" подлинность и оригинальность аргументов и фактов, используемых в рукописях, предлагаемых к публикации [1].
Огромные информационные ресурсы Интернета существенно изменили возможности обучения. В идеале цель обучения в вузе - получение не только диплома, но и знаний. Тогда студенты должны "по максимуму" использовать возможности Интернета для подготовки качественных работ. Однако такие работы требуют много времени. В случае "нерадивых" студентов ресурсы могут использоваться, и действительно, используются для ускоренной подготовки - для "скачивания" рефератов, контрольных и курсовых работ. Во многих таких случаях меняется только фамилия автора. То есть, имеет место плагиат "в чистом виде".
Однако следует критически подходить к материалам, представленным в сети Интернет, особенно в части, касающейся "готовых рефератов", "готовых курсовых работ". Авторы их не несут никакой ответственности за уровень и качество представленных материалов, так что все претензии преподаватель будет предъявлять "нерадивому студенту". То есть, даже если факт плагиата и не выявится, работа может оказаться неудовлетворительной сама по себе [2].
В настоящее время системы анализа схожести текстов получают все более широкое распространение. Существуют несколько различных алгоритмов и методик процесса сравнения.
1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
1.1 Анализ существующих аналогов
В настоящее время существует достаточно большое количество сервисов и программ, позволяющих каким-либо образом выявить заимствования. В числе таковых можно назвать: систему "Антиплагиат", Advego Plagiatus, miratools.ru, istio.com, Praide Unique Content Analyser II, Plagiatinform, Copyscape.
Система "Антиплагиат" разработана компанией "Форексис".
Система осуществляет онлайн поиск по большому количеству документов, хранящихся в собственной базе. Обладает рядом недостатков, таких как: отсутствие осуществления поиска по документам, доступным в сети Интернет; ограничение проверяемого текста 3000 символами и 5000 символами после регистрации и ограничение возможностью проверки только по базе имеющихся работ.
Программа Advego Plagiatus осуществляет онлайн проверку с использованием поисковых систем.
В отличие от аналогичных систем, Advego Plagiatus не использует Яндекс.XML (бесплатный сервис, предоставляющий возможность производить автоматические поисковые запросы к "Яндексу" и публиковать его выдачу у себя на ресурсе). Программа выдаёт процент совпадения текста и выводит найденные источники. Программа не преобразует буквы, то есть нет преобразования регистра, нет обработки и изменения латинских букв в русских словах на аналогичные буквы русского алфавита для текстов на русском языке. Также отсутствует поддержка поиска по собственной базе; из-за особенностей работы возникают ситуации, когда результаты проверки отличаются от раза к разу.
Сервис www.miratools.ru позволяет осуществлять онлайн проверку текста на плагиат (рис. 1.1).
Система использует результаты выдачи поисковых систем. К достоинствам можно отнести возможность замены английских букв на русские. Также имеется возможность изменения длины и шага шингла (англ.)русск., используемых для проверки. По результатам проверки выдаётся процент совпадений и найденные источники. Недостатком является то, что система не работает с собственной базой, существует ограничение на длину текста в 3000 символов и ограничение на число проверок в течение суток.
Рисунок 1.1 - Окно интернет-сервиса www.miratools.ru
Сервис www.istio.com осуществляет проверку текста на наличие заимствованного контента с использованием поисковых систем Яндекс.XML и Yahoo.com.
Возможности сервиса несколько слабее по сравнению с Miratools. По результатам проверки выдаётся сообщение о том, является ли текст уникальным или нет, и выдаётся список подобных страниц сайтов. Сервис предоставляет дополнительные средства для анализа текстов, например, проверку орфографии, анализ наиболее частотных слов и т. д. У системы отсутствует преобразование букв и поиск по собственной базе.
Рисунок 1.2 - Окно интрнет-сервиса www.istio.com
Программа Praide Unique Content Analyser II имеет широкие возможности по проверке текстов с использованием поисковых систем.
Имеется возможность выбора используемых поисковых систем, содержит средства добавления новых поисковых систем. Проверка осуществляется шинглами, длину которых можно изменять. Можно задавать количества слов перекрытия шинглов. Выводится подробный отчёт по проверке в каждой поисковой системе. В программе отсутствует замены букв, обработка стоп-слов и нет поддержки работы с собственной базой.
Система Plagiatinform проверяет документы на наличие заимствований как в локальной базе, так и в сети Интернет.
Система умеет находить плагиат в виде документов, скомпонованных из "перемешанных" кусков текста нескольких источников. Проверка может осуществляться с использованием быстрого или углублённого поиска. Результаты проверки выдаются в виде наглядного отчёта. Недостатком является отсутствие преобразования букв. Также авторы не предоставляют возможности свободного использования или тестирования системы, и оценить качество её работы невозможно.
Сервис Copyscape позволяет осуществлять поиск копий веб-страниц в Интернете.
Система возвращает список веб-страниц, у которых есть похожий по содержанию текст. Сервис осуществляет проверку на наличие заимствованного контента с использованием поисковых систем Google и Yahoo!
Проверяется только контент веб страницы, то есть, для выяснения уникальности текста необходимо опубликовать текст на сайте и ввести в системе адрес страницы. Без регистрации существует ограничение на количество проверок в месяц и на количество отображаемых результатов - 10 сайтов. Для зарегистрированных пользователей нет ограничений на количество проверок и выводимых результатов, но каждый запрос стоит 5 центов [1].
1.2 Постановка задачи
Анализ литературы и предметной области показали, что в теме курсового проекта уже было проведено большое количество научных исследований. Однако следует отметить, что практичных, простых и действенных средств по оценке похожести текстов очень мало.
В связи с этим на курсовое проектирование поставлена задача:
1. Изучить основные методы сравнения текстов.
2. Разработать схему реализации наиболее подходящего метода сравнения текстов.
3. Разработать программное средство для анализа похожести текстов, реализующее определенный алгоритм.
4. 2 МАТЕМАТИЧЕСКИЕ МОДЕЛИ И МЕТОДЫ ПОЛОЖЕННЫЕ В ОСНОВУ ПРОГРАММНОГО СРЕДСТВА
На рисунке 2.1 представлена классификация методов компьютерного обнаружения плагиата с технической точки зрения.
Рисунок 2.1 - Методы выявления плагиата
Методы характеризуются по типу оценки сходства.
Глобальная оценка использует большие части текста или документа для нахождения сходства в целом, в то время как локальные методы на входе проверяют ограниченный сегмент текста.
В настоящее время наиболее распространённым подходом является Дактилоскопия:
Из ряда документов выбирается набор из нескольких подстрок, которые и являются "отпечатками". Рассматриваемый документ будет сравниваться с "отпечатками" для всех документов коллекции. Найденные соответствия с другими документами указывают на общие сегменты текста.
Проверка документа дословным перекрытием текста представляет собой классическое сравнение строк.
Проверка подозрительных документов в этой ситуации требует расчёта и хранения эффективно сопоставимые представления всех документов в справочной коллекции, которые сравниваются попарно. Как правило, используют модели, такие как суффиксное дерево или суффиксный массив, которые были адаптированы для выполнения этой задачи в контексте компьютерного обнаружения плагиата. Однако сопоставление подстроки является нежизнеспособным решением для проверки больших коллекций документов (алгоритм отрабатывает в среднем 2h сравнений, где h - длина строки, в которой ведётся поиск). Анализ "множества слов" является упрощением представления, используемого в обработке естественного языка и поиска информации. В этой модели текст представлен как неупорядоченный набор слов. Документы представлены в виде одного или нескольких векторов, которые используются для попарного вычисления сходства.
Цитирование - компьютерный метод выявления плагиата, предназначенный для использования в научных документах, позволяющий использовать цитаты и справочный материал. Определяет общие цитаты двух научных работ.
Шаблон цитат представляет собой подпоследовательности, содержащие не только общие цитаты для двух документов, но и подобный порядок и близость цитат в тексте, являющихся основными критериями для определения шаблона цитат. Стилометрия или изучение языковых стилей - это статистический метод для выявления авторства анонимных документов и для компьютерной проверки на плагиат.
Строятся стилометрические модели для различных сегментов текста, отрывков, которые стилистически отличаются от других. И путём сравнения моделей можно обнаружить плагиат.
Например, анализ на основе последовательностей частей речи. Рассматривается способ разбиения текста на фрагменты однородности. В качестве параметров разбиения берутся различные последовательности частей речи. Далее проводится анализ фрагментов. И в результате для текста находятся последовательности, которые выделяли из текстов фрагменты, то есть алгоритм выделяет из текста фрагменты неоднородности, имеющие разные частоты встречаемости выбранной последовательности частей речи, что показывает на возможный плагиат в данном месте [1].
В разрабатываемом программном средстве для оценки сходства текстов применялся алгоритм Рабина-Карпа.
Алгоритм Рабина - Карпа - это алгоритм поиска строки, который ищет шаблон, то есть подстроку, в тексте, используя хеширование. Он был разработан в 1987 году Майклом Рабином и Ричардом Карпом.
Алгоритм редко используется для поиска одиночного шаблона, но имеет значительную теоретическую важность и очень эффективен в поиске совпадений множественных шаблонов. Для текста длины n и шаблона длины m его среднее время исполнения и лучшее время исполнения - это O(n), но в (весьма нежелательном) худшем случае он имеет производительность O(nm), что является одной из причин того, почему он не слишком широко используется. Однако алгоритм имеет уникальную особенность находить любую из k строк менее чем за время O(n) в среднем, независимо от размера k.
Алгоритм Рабина-Карпа пытается ускорить проверку эквивалентности образца с подстроками в тексте используя хэш-функцию. Хэш-функция - это функция, которая преобразует каждую строку в числовое значение, называемое хэш-значение; например, мы можем иметь hash("hello")=5. Алгоритм использует тот факт, что если две строки одинаковы, то и их хэш-значения также одинаковы. Таким образом, всё что нам нужно, это посчитать хэш-значение той подстроки, которую мы ищем и затем найти подстроку с таким же хэш-значением.
Однако, существуют две проблемы связанные с этим. Первая, так как существует очень много различных строк, для того, чтобы иметь небольшие хэш-значения, мы должны иметь некоторые строки, хэш-значения которых совпадают. Это означает, что несмотря на то, что хэш значения совпадают, строки могут не совпадать; нам необходимо проверять что это действительно так, что занимает достаточно много времени для длинных подстрок. К удаче, хорошая хэш-функция обеспечивает нам то, что при достаточно хороших вводных значениях это не будет происходить очень часто, и в результате среднее время поиска мало.
На рисунке 2.2 показано, как выглядит алгоритм на языке программирования Pascal.
Рисунок 2.2 - Реализация алгоритма Рабина-Карпа на языке Pascal
Строки 2, 3, и 6 каждая, требуют время Ω(m). Однако, строки 2 и 3 исполняются только один раз, а строка 6 выполняется только в случае, когда хэш-значения совпадают, что не может произойти чаще, чем несколько раз. Строка 5 выполняется n раз, но всегда требует постоянного времени. Теперь рассмотрим вторую проблему: строку 8.
Если мы наивно пересчитываем хэш-значение для подстроки s[i+1..i+m], это будет требовать время Ω(m), и так как это делается в каждом цикле, алгоритм будет требовать время Ω(mn), т.е. такое же, как и наиболее простые алгоритмы. Приём для решения этой задачи заключается в том, что переменная hs уже содержит хэш-значение для s[i..i+m-1]. Если мы сможем использовать его для подсчёта следующего хэш-значения за постоянное время, тогда наша задача будет решена.
Мы будем делать это используя так называемый кольцевой хэш. Кольцевой хэш - это хэш-функция, использующаяся специально для этой операции. Самым простым примером кольцевого хэша является добавление значений каждого следующего символа в подстроке. Затем, мы можем использовать эту формулу для подсчёта каждого следующего хэш-значения за фиксированное время: s[i+1..i+m] = s[i..i+m-1] - s[i] + s[i+m]
Эта простая функция работает, но в результате выражение в 6 строке будет выполняться чаще, чем другие более умные кольцевые хэш-функции, как те, что будут обсуждены в следующем разделе.
Заметим, что если мы очень неудачливы, или имеем очень плохую хэш-функцию, такую как постоянную функцию, строка 6 очень вероятно будет выполняться n раз, на каждую итерацию цикла. Так как она требует время Ω(m), алгоритм полностью будет требовать время Ω(mn).
Ключом к производительности алгоритма Рабина-Карпа является эффективное вычисление хэш-значения последовательных подстрок текста. Одна популярная и эффективная кольцевая хэш-функция интерпретирует каждую подстроку как число в некоторой системе счисления, основанием которой является большим простым числом. Например, если подстрока "hi" и основание системы счисления 101, хэш-значение будет 104 × 1011 + 105 × 1010 = 10609 (ASCII код 'h' - 104 и 'i' - 105)
Технически, этот алгоритм только подобен настоящему числу в недесятичной системе представления, так как для примера мы взяли "основание" меньше, чем одну из его "цифр". См. статью хэш-функция для более детального обсуждения. Существенная польза достигается таким представлением, которое возможно для расчёта хэш-значения следующей подстроки из значения предыдущей путём исполнения только постоянного набора операций, независимо от длин подстрок.
Например, если мы имеем текст "abracadabra" и ищем образец длины 3, мы можем рассчитать хэш подстроки "bra" из хэша подстроки "abr" (предыдущая подстрока), вычитая число добавленное для первой буквы 'a' из "abr", т.е. 97 × 1012 (97 - ASCII для 'a' и 101 - основание, которое мы используем), умножение на основание и наконец добавляя последнее число для "bra", т.е. 97 × 1010 = 97. Если подстроки в запросе длинны, этот алгоритм достигает большой экономии сравнимо с многими другими схемами хэширования.
Теоретически, существуют другие алгоритмы, которые могут обеспечить сравнимый объём вычислений, например, умножая ASCII-значения всех символов, в результате сдвиг подстроки будет влечь за собой только деление на первый символ и умножение на последний. Ограничением, однако, является размер типа данных целого числа и необходимость использовать модульную арифметику для уменьшения результатов хэширования, см. статью хэш-функция; тем не менее, эти простые хэш-функции, которые быстро не производят большие числа, такие как просто добавление ASCII-кодов, наиболее вероятно генерируют большое количество хэш-коллизий и следовательно - замедляют алгоритм. Из этого следует, что описанная хэш-функция является предпочитаемой для алгоритма Рабина-Карпа [3].
3 РАЗРАБОТКА ПРОГРАММНОГО СРЕДСТВА
3.1 Разработка спецификации требований
Программное средство предназначено для осуществления оценки похожести текстов. Оценка похожести будет производиться по предложенному алгоритму.
Программное средство должно обеспечивать выполнение следующих функций:
1. Сравнение текстов.
2. Выдачу результата сравнения, процент совпадения текстов.
3. Возможность ввода текста непосредственно с клавиатуры.
4. Возможность загрузки текста из текстового файла с жесткого диска.
5. Предоставление краткой справочной информации по приложению.
Программное средство должно иметь приятный и интуитивно-понятный пользователю интерфейс.
Предполагается создание графического пользовательского интерфейса. Консольный интерфейс не предусмотрен.
Входными данными является текст, который может быть введен как с клавиатуры, так и загружен из текстового файла с жесткого диска.
На выходе исходя из анализа текстов должна быть оценка их похожести в процентах. Также к выходным данным относится краткая справочная информация.
Программное средство не должно допускать повреждения текстовых файлов пользователя при загрузке текста с жесткого диска.
Быстродействие программного средства должно соответствовать быстродействию алгоритма, который оно реализует, исходя из размера подаваемого текста.
Программное средство должно быть простым в сопровождении, легко расширяемым и модфицируемым.
3.2 Разработка архитектуры программного средства
Приложение содержит одну рабочую форму, на котором содержатся 2 поля для ввода текста. Поля для ввода представлены компонентом Memo класса TMemo.
Компонент Delphi Memo это простой текстовый редактор. Delphi Memo позволяет вводить многострочный текст с клавиатуры, загружать его из файла, редактировать и сохранять в файл текстового формата. При изучении работы с Delphi Edit советую посетить страничку работа со строками Delphi, так как там описываются функции Delphi для работы с данными, представленными в текстовой форме, с которыми и оперирует компонент Memo.
Простота текстового редактора компонента Delphi Memo заключается в том, что текстовый редактор Delphi Memo не обладает возможностями форматирования содержещегося в нём текста. Это означает, что все атрибуты выбранного шрифта будут относиться ко всему тексту.
Текст в компоненте Delphi Memo размещается построчно. Поэтому имеется доступ к каждой строке текста отдельно. Строки в редакторе Delphi Memo являются объектами Lines[i] типа String, где i - номер строки, отсчитываемый от нуля. Объект Lines[i] доступен и для чтения, и для записи [5]. Каждое поле содержит панель инструментов, которые предоставляют функции загрузки текста из текстового файла с жесткого диска, а также функцию очистки поля. Эта панель представлена элементом ActionToolBar класса TActionToolBar.
Компонент Delphi ToolBar представляет собой инструментальную панель, для быстрого доступа к часто используемым функциям нашей программы, позволяет управлять компоновкой быстрых кнопок и компонентов.
Если поместить компонент ToolBar на форму, то он расположится вверху, поскольку его свойство Align равно alTop(по умолчанию). Если хотите, чтобы панель располагалась по другому, установите Align равным alNone, после этого можете делать с панелью что хотите.
На этот компонент можно вставить любые дочерние элементы, но все его возможности проявляются только со специальным компонентом ToolButton разработанный специально для ToolBar. ToolButton похож на кнопку SpeedButton, только изображение для кнопки определяется не свойством Glyph, а Imagelndex. Но вы не найдете этот компонент в палитре компонентов. Так как он разработан специально для ToolBar, вставить его можно только щелчка правой кнопкой мыши на компоненте ToolBar и выбрав в его контекстном меню команду New Button(кнопка) или New Separator (разделитель) - который предназначен для функционального выделения на нашей панели инструментов групп [6].
Форма также содержит управляющие элементы - кнопки, которые предоставляют функции сравнения текстов, закрытия приложения а также отображения краткой справочной информации. Они реализованы при помощи компонента BitBtn класса TBitBtn.
Компонент Delphi BitBtn это пиктографическая кнопка, представляющая собой один из вариантов стандартной кнопки Button. В отличие от последней кнопка Delphi BitBtn умеет отображать на своей поверхности не только надпись, но и изображение, которое задаётся свойством Glyph. В состав Delphi входит большое количество готовых изображений, которые можно размещать на кнопках Delphi BitBtn.
Свойство Kind компонента Delphi BitBtn определяет один из стандартных вариантов кнопки BitBtn, которые показаны на рисунке 3.1.
Рисунок 3.1 - Виды кнопки BitBtn
Нажатие на любую из них (кроме кнопок со свойством BitBtn.Kind, равным bkCustom или bkHelp) приводит к закрытию модального окна, в котором она установлена, а результат, возвращаемый в программу равен mrName (Name - Yes, Abort, Cancel и т.д. - название кнопки). Отличие есть у кнопки Close, её нажатие (после закрытия модального окна) приводит к возвращению не mrClose а mrCancel, а для главное окно программы просто закрывается, поэтому работа программы сразу завершается.
В случае если пиктограмма Glyph у кнопки Delphi BitBtn была изменена, система Delphi автоматически изменит и её значение BitBtn.Kind, которое станет равным bkCustom
Рисунок с изображениями для кнопки может состоять из нескольких (до 4-х) частей. Стандартная пиктограмма имеет размер 16х16 пикселов. Соответственно, если рисунок состоит из 2-х частей (для активного или неактивного состояния кнопки - именно такие изображения содержатся в стандартной поставке Delphi), то рисунок будет иметь размер 32х16. Количество пиктограмм задаётся свойством Glyph. Однако, если изображение состоит из нескольких квадратных пиктограмм одного размера, система Delphi сама распознает их количество.
Если в растре задана только одна пиктограмма, то Delphi сама может менять её изображение: в состоянии "нажата" изображение на кнопке смещается на 1 пиксель вниз-вправо, а в состоянии "недоступная" (Enabled=False) все цвета, кроме чёрного, меняются на светло-серый, а чёрный - на белый, что создаёт эффект вдавленности [7].
На рисунке 3.2 представлен снимок главного окна программы.
Рисунок 3.2 - Главное окно программы
Вся логика работы приложения сосредоточена в модуле главного окна MainUnit. На вход будет подаваться текст. В случае загрузки с жесткого диска необходимо будет указать путь к текстовому файлу с расширением .txt, после чего текст выбранное поле будет заполнено текстом из файла. Никаких синтаксических ограничений добавляемого текста в программе нет.
Затем по нажатию кнопки "Начать сравнение" запустится процедура анализа похожести текстов, реализующая предоставленный алгоритм. Закончив выполнение алгоритма, программа выведет сообщение с результатом сравнения.
3.3 Обоснование выбора языка программирования
В основе языка Delphi лежит язык Object Pascal. Pascal - это высокоуровневый язык программирования общего назначения. Один из самых известных в мире языков, который очень широко применяется при обучении программированию в высшей школе, в промышленном программировании и является основной базой для других языков.
Важнейшим шагом в развитии языка Pascal стало появление его различных свободных реализаций. Это были GNU Pascal и Free Pascal. Данные версии вобрали в себя не только черты множества прочих диалектов языка, но и создали чрезвычайно широкую возможность для переносимости написанных программ. Object Pascal в полной мере поддерживает все требования, предъявляемые к объектно-ориентированному языку программирования. Как и положено строго типизированному языку, классы поддерживают только простое наследование, но зато интерфейсы могут иметь сразу несколько предков. К числу особенностей языка следует отнести поддержку обработки исключительных ситуаций (exceptions), а также перегрузку методов и подпрограмм (overload). Некоторые отличительные характеристики Object Pascal от Turbo Pascal приведены ниже:
1) группы целых, символьных и строковых типов, которые стали разделяться на две категории: фундаментальные (fundamental) типы (их представление в памяти строго фиксируется и выдерживается неизменным во всех последующих реализациях Object Pascal для любых операционных систем и компьютерных платформ) и родовые (generic) типы (их представление в памяти не фиксируется и будет реализовано оптимальным способом, в зависимости от реализации для конкретной операционной системы и компьютерной платформы);
2) введена перегрузка процедур и функций, не являющихся членами объекта или класса. Перегружаются (с помощью ключевого слова overload) отличающиеся типами и числом параметров процедуры и функции;
3) начиная с Delphi 6, в языке Object Pascal, был введен вариантный тип данных - Variant, тип которых не известен на этапе компиляции. Вариантные переменные могут принимать различные значения (целые, строковые, булевские, Currency, OLE-строки) а также быть массивами элементов этих же типов, а также массивом значений вариантного типа;
4) стала возможна передача параметров различного типа. В оригинале он назван как "variant open array parameters". Тип данных определяется динамически в процессе выполнения программы. Так же как и в обычном открытом массиве, функция High вызывается для определения числа элементов массива. Для объявления используются ключевые слова array of const;
5) для введения новой объектной модели введено ключевое слово class (в Turbo Pascal ключевое слово object). Введены операторы для проверки и приведения классов is и as динамически в ходе выполнения программы. Появились указатели на методы, для чего введено новое использование ключевого слова object;
6) в Turbo Pascal можно было работать как с динамическими, так и со статическими экземплярами объектов. В объектной модели Object Pascal программист работает только с динамическими экземплярами классов, выделяемых в heap-области. В связи с этим изменен синтаксис обращения к полям и методам объектов. Ранее для работы с динамическими экземплярами объектов, проинициализированными с использованием обращения к конструктору в сочетании с функцией New, необходимо было использовать обращение "по адресу" (^). Теперь тип класса стал являться по умолчанию также указателем;
7) появилась возможность ограничивать видимость членов класса (методы, свойства), которые предназначены для использования только в реализации производных классов. Это дает возможность защищать исходный код от модификации пользователями класса. Такие методы содержатся в секции protected в объявлении класса;
8) c помощью точки стало возможным обращаться для доступа к методам класса. Кроме того, было изменено соглашение об именовании конструкторов и деструкторов. В старой объектной модели вызов New отвечал за распределение памяти, а обращение к конструктору инициализировало выделенную область памяти. В новой модели эти действия выполняет конструктор Create;
9) появились понятия свойства (property) и связанные с со свойствами ключевые слова read, write, stored, default (nodefault), index. Свойства визуальных объектов, видимых в интегрированной среде разработки, объявляются с помощью нового слова published в качестве секции в объявлении класса, являющегося визуальным объектом.
Таким образом, можно сделать вывод, что Object Pascal - это более удобная и усовершенствованная версия языка Turbo Pascal [4].
3.4 Разработка схемы алгоритма оценки похожести текстов
На рисунке 3.3 представлена схема процесса анализа похожести текстов приложения.
В начале работы алгоритма происходит получение текстов. Далее проводится проверка на заполненность.
Если поля пусты, то выводится соответствующее сообщение, и управление передается обратно пользователю. Если же поля заполнены, то начинается сравнение текстов. Высчитывается хэш-код очередной строки, и затем ищется совпадение по второму тексту. Если совпадение есть, наращивается процент совпадения, и берется следующая строка, если же нет, то сразу берется следующая строка. На каждом шаге проводится проверка на окончание проверяемого текста, и, если он заканчивается, на экран выводится результат проверки.
Рисунок 3.3 - Схема процесса анализа похожести текстов
4 ТЕСТИРОВАНИЕ ПРОГРАММНОГО СРЕДСТВА
В ходе разработки программного средства были проведены некоторые тесты для проверки корректности работы приложения в исключительных ситуациях. В ходе проведения некоторых из этих тестов были получены неожиданные результаты, ошибки, которые впоследствии были обработаны.
В частности, при попытке начать сравнение текстов при условии того, что поля для текстов пусты, появлялась ошибка, показанная на рисунке 4.1.
Рисунок 4.1 - Ошибка при незаполненных полях
После обнаружения эта исключительная ситуация была исправлена проверкой полей на заполнение перед стартом анализа текстов и выводом соответствующего сообщения.
Также была выявлена исключительная ситуация при попытке открытия файла неподходящего формата. Результат открытия показан на рисунке 4.2.
Рисунок 4.2 - Результат открытия неподходящего файла
Это было исправлено добавлением в компонент OpenDialog фильтра файлов, как показано на рисунке 4.3.
Рисунок 4.3 - Фильтр компонента OpenDialog
5 МЕТОДИКА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО СРЕДСТВА
Для удобства ввода и работы с текстом был разработан удобный и интуитивно-понятный графический пользовательский интерфейс.
На рисунке 5.1 представлен вид главного окна приложения. Оно содержит 2 поля для ввода текстов, каждое из которых имеет панель инструментов, которая делает работу с приложением еще более простой.
Рисунок 5.1 - Главное окно приложения
Панели инструментов содержат 2 кнопки: кнопка для загрузки текста из текстового файла с жесткого диска и кнопка для очистки текстового поля. Снимок панели инструментов представлен на рисунке 5.2.
Рисунок 5.2 - Панель инструментов
При нажатии кнопки загрузки текста из текстового файла появляется диалоговое окно, показанное на рисунке 5.3, в котором необходимо указать путь к текстовому файлу.
Рисунок 5.3 - Диалоговое окно открытия текстового файла
При попытке запуска анализа текстов при незаполненности полей анализ не производится, и выводится соответствующе сообщение, как показано на рисунке 5.4.
Рисунок 5.4 - Сообщение о незаполненности полей
При заполнении обеих полей текстом можно начать анализ кнопкой "Начать сравнение". По завершению анализа выводится результат сравнения, в котором показан процент совпадения текстов, как показано на рисунке 5.5.
Рисунок 5.5 - Результат выполнения анализа текстов
Также в приложении имеется краткая справочная информация, которая выводится на экран по нажатию кнопки "Справка". Снимок сообщения-справки показан на рисунке 5.6.
Рисунок 5.6 - Справочная информация
ЗАКЛЮЧЕНИЕ
Разработанная программа отлажена, протестирована и готова для демонстрации и практического использования. Ошибки работы программы могут возникать только при некорректном её использовании.
В ходе создания программного средства были проведены неоднократные тесты на правильность работы всех функций. Тесты проводились как после добавления каждой функции, так и по завершению создания программы.
Программа проста в использовании и понятна для обычного пользователя. В ней имеется удобный способ ввода, а также отображения введенных данных. Были проанализированы аналоги разработанного программного средства, рассмотрены их преимущества и недостатки.
Были рассмотрены математические методы и модели, положенные в основу программного средства.
Также была разработана спецификация требований к разрабатываемому программному средству.
Затем была разработана архитектура приложения, а также схема алгоритма оценки похожести текстов, реализованного в программном средстве.
В результате, на основании задачи, поставленной в данной работе, было разработано настольное клиентское приложение, проводящее оценку похожести текстов предложенным алгоритмом "Рабина-Карпа" для определения плагиата.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. http://ru.wikipedia.org/wiki/Определение_плагиата
2. http://www.eidos.ru/journal/2011/0425-01.htm
3. http://ru.wikipedia.org/wiki/Алгоритм_Рабина_-_Карпа
4. http://ru.wikipedia.org/wiki/Delphi_(язык_программирования)
5. http://www.delphi-manual.ru/memo.php
6. http://helpdelphi.ru/toolbar/
7. http://www.delphi-manual.ru/bitbtn.php
ПРИЛОЖЕНИЕ А. Исходный код программы
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, ToolWin, ActnMan, ActnCtrls,
ActnList, XPStyleActnCtrls, ImgList, Menus;
type
TMainForm = class(TForm)
MainFormBackPanel: TPanel;
FirstTextGroupBox: TGroupBox;
FirstTextMemo: TMemo;
SecondTextGroupBox: TGroupBox;
SecondTextMemo: TMemo;
CompareButton: TBitBtn;
HorizontalSplitter: TSplitter;
ExitButton: TBitBtn;
FirstTextMemoToolBar: TActionToolBar;
SecondTextMemoToolBar: TActionToolBar;
ActionManager: TActionManager;
FirstMemoFileOpenAction: TAction;
FirstMemoClearAction: TAction;
SecondMemoFileOpenAction: TAction;
SecondMemoClearAction: TAction;
ToolBarsImageList: TImageList;
OpenDialog: TOpenDialog;
HelpButton: TBitBtn;
procedure FirstMemoFileOpenActionExecute(Sender: TObject);
procedure FirstMemoClearActionExecute(Sender: TObject);
procedure SecondMemoFileOpenActionExecute(Sender: TObject);
procedure SecondMemoClearActionExecute(Sender: TObject);
procedure CompareButtonClick(Sender: TObject);
procedure HelpButtonClick(Sender: TObject);
private
{ Private declarations }
procedure MemoLoadFromFile(memo: TMemo; fileName: string);
procedure RabinKarpCompare();
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FirstMemoFileOpenActionExecute(Sender: TObject);
begin
if OpenDialog.Execute then
MemoLoadFromFile(FirstTextMemo, OpenDialog.FileName);
end;
procedure TMainForm.FirstMemoClearActionExecute(Sender: TObject);
begin
FirstTextMemo.Clear;
end;
procedure TMainForm.SecondMemoFileOpenActionExecute(Sender: TObject);
begin
if OpenDialog.Execute then
MemoLoadFromFile(SecondTextMemo, OpenDialog.FileName);
end;
procedure TMainForm.SecondMemoClearActionExecute(Sender: TObject);
begin
SecondTextMemo.Clear;
end;
procedure TMainForm.MemoLoadFromFile(memo: TMemo; fileName: string);
begin
memo.Clear;
memo.Lines.LoadFromFile(fileName);
end;
procedure TMainForm.RabinKarpCompare();
var T: array[1..40000] of Char;
S: array[1..10000] of Char;
i,j,strCounter, currMatchingStrings: LongInt;
maxTextStringsCount, totalMatch: Real;
n,m: LongInt;
v,w: LongInt;
k: LongInt;
const P: LongInt = 7919;
D: LongInt = 256;
begin
currMatchingStrings := 0;
if FirstTextMemo.Lines.Count>=SecondTextMemo.Lines.Count then
maxTextStringsCount := FirstTextMemo.Lines.Count
else
maxTextStringsCount := SecondTextMemo.Lines.Count;
n:=Length(FirstTextMemo.Text);
Move(FirstTextMemo.Text[1], T, n);
for strCounter:=0 to SecondTextMemo.Lines.Count do
begin
m:= Length(SecondTextMemo.Lines.Strings[strCounter]);
FillChar(S,SizeOf(S),#0);
Move(SecondTextMemo.Lines.Strings[strCounter][1], S, m);
v:=0;
w:=0;
for i:=1 to m do
begin
v:=(v*D + Ord(S[i])) mod P;
w:=(w*D + Ord(T[i])) mod P;
end;
k:=1;
for i:=1 to m-1 do
k:=k*D mod P;
for i:=m+1 to n+1 do
begin
if (w=v) and (w<>0) then
begin
j:=0;
while (j<m) and (S[j+1]=T[i-m+j]) do
j:=j+1;
if j=m then
Inc(currMatchingStrings);
end;
if i<=n then
w:=(d*(w+P-(Ord(T[i-m])*k mod P))+ Ord(t[i])) mod P;
end;
end;
totalMatch := currMatchingStrings * 100 / maxTextStringsCount;
ShowMessage('Ñîâïàäåíèå òåêñòîâ: ' + FloatToStr(totalMatch) + '%');
FillChar(T,SizeOf(T),#0);
FillChar(S,SizeOf(S),#0);
end;
procedure TMainForm.CompareButtonClick(Sender: TObject);
begin
if (FirstTextMemo.Text = '') and (SecondTextMemo.Text = '') then
ShowMessage('Òåêñòîâûå ïîëÿ íå çàïîëíåíû.')
else
RabinKarpCompare;
end;
procedure TMainForm.HelpButtonClick(Sender: TObject);
begin
ShowMessage('Ïðîãðàììà äëÿ àíàëèçà ñõîæåñòè òåêñòîâ. Ðàçðàá. Åâìåíîâ Ä., ÁÃÓÈÐ ãð. 381063, 2013 ã.');
end;
end.
4
Документ
Категория
Рефераты
Просмотров
403
Размер файла
481 Кб
Теги
часть, основная
1/--страниц
Пожаловаться на содержимое документа