Автоматизированная интеллектуальная система классификации информационных сообщений средств массовой информации
Таблица 3.2 - Таблица «Газета»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код газеты
|
Числовой
|
Длина 2 символа
|
|
|
Наименование
|
Текстовый
|
Длина 150 символов
|
|
|
Таблица 3.3 - Таблица «Регион»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код региона
|
Числовой
|
Длина 8 символов
|
|
|
Наименование региона
|
Текстовый
|
Длина 150 символов
|
|
|
Таблица 3.4 - Таблица «Отрасль»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Составной ключ
|
Код статьи
|
Числовой
|
Длинное целое
|
|
|
Код отрасли
|
Числовой
|
Длинное целое
|
|
|
Таблица 3.5 - Таблица «Справочник отраслей»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код отрасли
|
Числовой
|
Длинное целое
|
|
|
Наименование
|
Текстовый
|
Длина 150 символов
|
|
|
Таблица 3.6 - Таблица «Рубрики»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Составной ключ
|
Код рубрики
|
Числовой
|
Длинное целое
|
|
|
Код статьи
|
Числовой
|
Длинное целое
|
|
|
Уровень рубрики
|
Числовой
|
Длинное целое
|
|
|
Таблица 3.7 - Таблица «Классификация»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код статьи
|
Числовой
|
Длинное целое
|
|
|
Код рубрики
|
Числовой
|
Длинное целое
|
|
|
Уровень рубрики
|
Числовой
|
Длинное целое
|
|
|
По названию статьи
|
Числовой
|
Длинное целое
|
|
|
По ключевым словам
|
Числовой
|
Длинное целое
|
|
|
По тексту статьи
|
Числовой
|
Длинное целое
|
|
|
Результат
|
Текстовый
|
Длина 50 символов
|
|
|
Таблица 3.8 - Таблица «Рубрикатор 1»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код_1
|
Счетчик
|
Последовательное значение
|
|
|
Индекс_1
|
Числовой
|
Длинное целое
|
|
|
Наименование_1
|
Текстовый
|
Длина 150 символов
|
|
|
Таблица 3.9 - Таблица «Рубрикатор 2»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код_2
|
Счетчик
|
Последовательное значение
|
|
|
Индекс_2
|
Числовой
|
Длинное целое
|
|
|
Наименование_2
|
Текстовый
|
Длина 150 символов
|
|
|
Код_1
|
Числовой
|
Длинное целое
|
|
|
Таблица 3.10 - Таблица «Рубрикатор 3»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код_3
|
Счетчик
|
Последовательное значение
|
|
|
Индекс_3
|
Числовой
|
Длинное целое
|
|
|
Наименование_3
|
Текстовый
|
Длина 150 символов
|
|
|
Код_2
|
Числовой
|
Длинное целое
|
|
|
Таблица 3.11 - Таблица «Рубрикатор 4»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код_4
|
Счетчик
|
Последовательное значение
|
|
|
Индекс_4
|
Числовой
|
Длинное целое
|
|
|
Наименование_4
|
Текстовый
|
Длина 150 символов
|
|
|
Код_3
|
Числовой
|
Длинное целое
|
|
|
Таблица 3.12 - Таблица «Словарь рубрикатора 3»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код_3
|
Числовой
|
Длинное целое
|
|
|
Слова
|
Текстовый
|
Длина 255 символов
|
|
|
Таблица 3.13 - Таблица «Словарь рубрикатора 4»
Первичный ключ
|
Атрибуты
|
Тип данных
|
Описание
|
|
Уникальный ключ
|
Код_4
|
Числовой
|
Длинное целое
|
|
|
Слова
|
Текстовый
|
Длина 255 символов
|
|
|
Данные таблицы объединены в инфологическую модель, схема которой представлена на рисунке 3.4.1.
Рисунок 3.4.1 - Инфологическая модель базы
Иерархия заполнения таблиц базы представлена на рисунке 3.4.2.
Рисунок 3.4.2 - Иерархия заполнения таблиц базы
4 МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ
4.1 Математическая постановка задачи классификации информационных сообщений СМИ
Пусть дано множество статей Х, множество ключевых слов статьи W и множество названий статей A. Каждое множество описывается своим набором элементов:
X = {x1, x2, …, xc},
где xi - i- я статья;
c - количество статей;
W = {w1, w2, …, wc},
где wi - строка ключевых слов i-ой статьи, ;
A = {a1, a2, … ac},
где ai - название i-ой статьи, .
Имеется рубрикатор, состоящий из четырех уровней:
R1 = {r11, r12, … r1k},
где k - количество элементов рубрикатора 1;
R2 = {r21, r22, … r2l},
где l - количество элементов рубрикатора 2;
R3 = {r31, r32, … r3m},
где m - количество элементов рубрикатора 3;
R4 = {r41, r42, … r4n},
где n - количество элементов рубрикатора 4.
К каждому элементу рубрикаторов 3-го и 4-го уровней привязаны словари со своими множествами:
D3j = {d31j, d32j, … d3yj}, ;
D4j = {d41j, d42j, … d4zj}, ,
где j - индекс элемента рубрики;
y, z - количество элементов в словаре для конкретной рубрики.
Функция нечеткого поиска задается следующим образом:
здесь U = {{X},{W},{A}};
dpqj - ключевое слово,
где j - индекс элемента рубрики, или ;
p - уровень рубрикатора 3-й или 4-й;
q - индекс элементов в словарях D3j и D4j;
или ;
pн.п - порог нечеткого поиска.
Далее для каждой статьи применяем функцию нечеткого поиска:
где - общее количество совпадений по i-ой статье из словаря 3-го и 4-го уровней;
;
.
Затем для ключевых слов статьи также применяем функцию нечеткого поиска:
где общее количество совпадений по строке ключевых слов i-ой статьи из словаря 3-го и 4-го уровней;
;
.
Для названий статей тоже применяем функцию нечеткого поиска:
где - общее количество совпадений по названию i-ой статьи из словаря 3-го и 4-го уровней;
;
.
Далее для отнесения каждой статьи к той или иной рубрике используется метод ранжирования. Для этого определяются границы трех интервалов:
1) статью однозначно нельзя отнести к рубрике;
2) консультант ОТОИ принимает решение о принадлежности статьи к данной рубрике;
3) статья с заданной вероятностью относится к данной рубрике.
Границей является количество слов, которые должны встретиться в тексте, названии статьи или в списке ключевых слов, относящихся к этой статье.
Метод ранжирования заключается в следующем:
где границы интервалов по тексту i-ой статьи;
границы интервалов по строке ключевых слов i-ой статьи;
границы интервалов по названию i-ой статьи.
4.2 Описание метода нечеткого поиска
Для нечеткого поиска информации используется алгоритм, основанный на процентном отношении совпадения двух строк. Процесс поиска начинается со сравнения каждого элемента одной строки с каждым элементом другой и заканчивается сравнением строк целиком. Эта процедура повторяется дважды для одной и той же пары строк. В первом случае первая строка принимается за эталон, во втором - вторая. В процессе сравнения подсчитывается число совпадений и общее число рассматриваемых случаев, после чего вычисляется их процентное соотношение. На основе этого соотношения принимается решение - считать найденную информацию удовлетворяющей условиям поиска или нет. Описанная процедура применяется ко всем записям информационной базы, в результате пользователь получает всю информацию, удовлетворяющую запросу.
Изменяя минимальный процент совпадения можно уменьшать или увеличивать точность соответствия найденной информации искомой. В данной системе используется 50% совпадения, так как (из практики) этого достаточно для нахождения информации. Схема программы поиска данных по алгоритму нечеткого поиска приведена на рисунке 4.2.1, схема программы сравнения строк приведена на рисунке 4.2.2.
Рисунок 4.2.1 - Схема программы поиска данных по алгоритму нечеткого поиска
Рисунок 4.2.2 - Схема программы сравнения строк «Matching»4.3 Описание запросов
Для данной работы необходимо создать следующие запросы: «Рубрикатор», «Классификация 3-го уровня», «Классификация 4-го уровня», «Классифицированные сообщения», «Обработанные сообщения 3-го уровня», «Обработанные сообщения 4-го уровня».
Запрос «Рубрикатор» необходим для вывода всей информации по всем уровням рубрикатора и словарям 3-го и 4-го уровней. Структура запроса «Рубрикатор» в режиме SQL:
SELECTРубрикатор_1.Индекс_1,Рубрикатор_2.Индекс_2,Рубрикатор_3.Индекс_3, IIf(IsNull([Индекс_4]),0,[Индекс_4])ASИндекс_4,Trim(Str([Рубрикатор_1].[Индекс_1]))+"."+Trim(Str([Рубрикатор_2]
[Индекс_2]))+"."+Trim(Str([Рубрикатор_3].[Индекс_3]))+"."+Trim(Str(IIf(IsNull([Индекс_4]),0,[Индекс_4])))+"."AS Индекс, Рубрикатор_1.Наименование_1,Рубрикатор_2.Наименование_2,Рубрикатор_3.Наименование_3, Рубрикатор_4. Наименование_4, Рубрикатор_1.Код_1, Рубрикатор_2.Код_2, Рубрикатор_3.Код_3, Рубрикатор
_4.Код_4
FROM ((Рубрикатор_1 LEFT JOIN Рубрикатор_2 ON Рубрикатор_1.Код_1= Рубрикатор_2.Код_1) LEFT JOIN Рубрикатор_3 ON Рубрикатор_2.Код_2 = Рубрикатор_3.Код_2) LEFT JOIN Рубрикатор_4 ON Рубрикатор_3.
Код_3 = Рубрикатор_4.Код_3
ORDER BY Рубрикатор_1.Индекс_1,Рубрикатор_2.Индекс_2,Рубрикатор_3.Индекс_3, IIf(IsNull ([Индекс_4]), 0,[Индекс_4]);
Запрос «Классификация 3-го уровня» необходим для вывода информации по результатам классификации по 3-му уровню рубрикатора. Структура запроса «Классификация 3-го уровня» в режиме SQL:
SELECT Trim(Str([Рубрикатор_1].[Индекс_1]))+"."+Trim(Str([Рубрикатор_2].[Индекс_2]))+"."+Trim(Str([Рубрикатор_
3].[Индекс_3]))+"."ASИндекс,[Рубрикатор_1].[Наименование_1]+"."+[Рубрикатор_2].[Наименование_2]+"."+[Рубрикатор_3].[Наименование_3]ASНаименованиерубрики,[Классификация].[Уровеньрубрики], [Классификация].
[Наименование статьи], [Классификация].[Текст статьи], [Классификация].[Ключевые слова], [Классификация]. [Результат], [Классификация].[Код статьи], [Рубрикатор_3].[Код_3] AS Код статьи
FROM (Рубрикатор_1 INNER JOIN Рубрикатор_2 ON [Рубрикатор_1].[Код_1]=[Рубрикатор_2].[Код_1]) INNER JOIN (Рубрикатор_3 INNER JOIN Классификация ON [Рубрикатор_3].[Код_3]=[Классификация].[Код рубрики]) ON [Рубрикатор_2].[Код_2]=[Рубрикатор_3].[Код_2]
WHERE ((([Классификация].[Уровень рубрики])=3));
Запрос «Классификация 4-го уровня» необходим для вывода информации по результатам классификации по 4-му уровню рубрикатора. Структура запроса «Классификация 4-го уровня» в режиме SQL:
SELECT Trim(Str(Рубрикатор_1.Индекс_1))+"."+Trim(Str(Рубрикатор_2.Индекс_2))+"."+Trim(Str(Рубрикатор_3.
Индекс_3))+"."+Trim(Str(Рубрикатор_4.Индекс_4))+"."ASИндекс,Рубрикатор_1.Наименование_1+". "+Рубрикатор
_2.Наименование_2+". "+Рубрикатор_3.Наименование_3+"."+Рубрикатор_4.Наименование_4 AS Наименование рубрики, Классификация.Уровень рубрики, Классификация.Наименование статьи, Классификация.Текст статьи, Классификация.Ключевые слова, Классификация.Результат, Классификация.Код рубрики, Рубрикатор_4.Код_4 AS Код статьи FROM ((Рубрикатор_1 INNER JOIN Рубрикатор_2 ON Рубрикатор_1.Код_1=Рубрикатор_2.Код_1) INNER JOIN Рубрикатор_3 ON Рубрикатор_2.Код_2=Рубрикатор_3.Код_2) INNER JOIN (Рубрикатор_4 INNER JOIN Классификация ON Рубрикатор_4.Код_4=Классификация.Код рубрики) ON Рубрикатор_3.Код_3=
Рубрикатор_4.Код_3 WHERE (((Классификация.Уровень рубрики)=4));
Запрос «Классифицированные сообщения» необходим для создания отчета по результатам классификации. Структура запроса «Обработанные сообщения» в режиме SQL:
SELECT DISTINCT Статьи.Код статьи
FROM Статьи INNER JOIN Рубрики ON Статьи.Код статьи = Рубрики.Код рубрики;
Запрос «Обработанные сообщения 3-го уровня» необходим для вывода информации по обработанным сообщениям СМИ, отнесенным к 3-му уровню рубрикатора. Структура запроса «Обработанные сообщения 3-го уровня» в режиме SQL:
SELECT Trim(Str(Рубрикатор_1.Индекс_1))+"."+Trim(Str(Рубрикатор_2.Индекс_2))+"."+Trim(Str(Рубрикатор_3
.Индекс_3))+"." AS Индекс, Статьи.Файл, Статьи.Код газеты, Статьи.Код региона, Статьи.Код статьи, Статьи.Наименование статьи, Статьи.Ключевые слова, Статьи.Текст статьи, Статьи.Дата, Статьи.автор, Статьи.Код рубрики, Статьи.Уровень рубрики, Рубрикатор_1.Наименование_1+"."+Рубрикатор_2.Наименование
_2+". "+Рубрикатор_3. Наименование_3 AS Наименование рубрики
FROM (Рубрикатор_1 INNER JOIN Рубрикатор_2 ON Рубрикатор_1.Код_1 = Рубрикатор_2.Код_1) INNER JOIN (Рубрикатор_3 INNER JOIN Стать ON Рубрикатор_3.Код_3 = Статьи.Код рубрики) ON Рубрикатор_2.Код_2 = Рубрикатор_3.Код_2
WHERE (((Статьи.Уровень рубрики)=3));
Запрос «Обработанные сообщения 4-го уровня» необходим для вывода информации по обработанным сообщениям СМИ, отнесенным к 4-му уровню рубрикатора. Структура запроса «Обработанные сообщения 4-го уровня» в режиме SQL:
SELECT Trim(Str(Рубрикатор_1.Индекс_1))+"."+Trim(Str(Рубрикатор_2.Индекс_2))+"."+Trim(Str(Рубрикатор_3.
Индекс_3))+"."+Trim(Str(Рубрикатор_4.Индекс_4))+"." AS Индекс, Статьи.Файл, Статьи.Код газеты, Статьи.Код региона, Статьи.Код рубрики, Статьи.Наименование статьи, Статьи.Ключевые слова, Статьи.Текст статьи, Статьи.Дата, Статьи.автор, Статьи.Код рубрики, Статьи.Уровень рубрики, Рубрикатор_1.Наименование_1+". "+Рубрикатор_2.Наименование_2+". "+Рубрикатор_3.Наименование_3+"."+Рубрикатор_4.Наименование_4 AS Наименование рубрики
FROM ((Рубрикатор_1 INNER JOIN Рубрикатор_2 ON Рубрикатор_1.Код_1=Рубрикатор_2.Код_1) INNER JOIN Рубрикатор_3 ON Рубрикатор_2.Код_2=Рубрикатор_3.Код_2) INNER JOIN (Рубрикатор_4 INNER JOIN Статьи ON Рубрикатор_4.Код_4=Статьи.Код рубрики) ON Рубрикатор_3.Код_3=Рубрикатор_4.Код_3
WHERE (((Статьи.Уровень рубрики)=4));
4.4 Описание схемы работы системы
Схема работы системы представляет собой последовательность этапов, которую необходимо выполнить для классификации информационных сообщений СМИ.
Работу необходимо начать с загрузки информационных сообщений СМИ
в базу системы, на основе которых будет проводиться классификация. Для загрузки сообщений определяется местоположение каталога с файлами с заданием расширения с исходными информационными сообщениями.
При переходе ко второму этапу необходимо настроить параметры классификации, которые заключаются в определении количества совпадений по названию статьи, по тексту статьи, по ключевым словам статьи. Также необходимо задать порог нечеткого поиска.
На этапе классификации в первую очередь выполняется поиск записей по различным ключам словаря с помощью алгоритма нечеткого поиска. Далее выполняется классификация информационных сообщений СМИ с помощью метода ранжирования, заключающегося в автоматическом распределении поступающих в систему информационных сообщений СМИ в зависимости от их типа и содержания по рубрикам. Результаты классификации выводятся на экран.
По результатам классификации формируются рекомендации для принятия решений и отчеты. Отчеты сохраняются в текстовом файле формата doc.
При выборе завершающего режима работы системы произойдет выход из нее.
Схема работы системы представлена на рисунке 4.4.1.
Текст программы представлен в приложении Е.
Рисунок 4.4.1 - Схема работы системы
5 ТЕХНИЧЕСКОЕ ОБЕСПЕЧЕНИЕ АИС «КЛАССИФИКАТОР»
5.1 Описание комплекса технических средств
АИС «Классификатор» реализована на базе ПЭВМ. ПЭВМ позволяет существенно повысить эффективность работы пользователя архитектурными и техническими возможностями. Решено использовать базовый комплект ПЭВМ типа IBM PC, технические характеристики которого позволяют решать все поставленные задачи.
При проектировании и функционировании системы используется базовый комплект ПЭВМ IBM PC, включающий следующие устройства:
- процессор Intel Seleron с тактовой частотой 2 ГГц;
- 256 Мбайт оперативной памяти;
- жесткий диск не менее 2 Гбайт;
- операционная система - Windows Me, 2000, XP;
- монитор SVGA;
- клавиатура стандартная русифицированная;
- мышь.
При эксплуатации оборудования пользователи должны руководствоваться следующими документами:
- инструкция по технике безопасности;
- руководство пользователя.
Необходимо соблюдать требования техники безопасности и следующие меры предосторожности:
1) не подключать и не отключать соединители электропитания при поданном напряжении в сеть;
2) не оставлять ЭВМ включенной без наблюдателя;
3) по окончанию работ отключать ПЭВМ от сети.
5.2 Инструкция по эксплуатации комплекса технических средств
Данная инструкция дает пользователю необходимое указание по использованию базового комплекта ПЭВМ IBM PC. К работе с ЭВМ допускаются лица, прошедшие инструктаж по технике безопасности при работе с электроустановками напряжением до 1000 В.
При эксплуатации ПЭВМ запрещается:
1) применять комплектующие изделия, носители данных и материалы, не указанные в эксплуатационной документации;
2) подключать устройства, использование которых не согласовано с изготовителем ПЭВМ;
3) извлекать электронные модули, отсоединять кабель интерфейса при подключенном электропитании любой из составных частей ПЭВМ;
4) снимать кожухи устройства, проводить какие-либо ремонтные работы.
Категорически запрещается работать на ПЭВМ при снятом кожухе любого из устройств. До включения электропитания ПЭВМ необходимо проверить визуально целостность соединительных кабелей.
К эксплуатации оборудования допускаются лица, работающие с АИС «Классификатор», которые могут не являться специалистами в области компьютерных технологий и программирования, а обладают лишь навыками работы с компьютером.
Решение задач осуществляется ПЭВМ под управлением операционной системы (ОС) Windows Me, 2000, XP. Подготовка к работе заключается в начальной загрузке в ОЗУ ПЭВМ ОС Windows. Начальная загрузка OC Windows выполняется автоматически в следующих случаях:
1) при включении электропитания компьютера;
2) при нажатии на клавишу RESET, которая находится на передней панели корпуса ПЭВМ;
3) при перезагрузке компьютера.
Чтобы выполнить загрузку системы, необходимы следующие действия:
1) включить стабилизатор напряжения (если необходимо);
2) включить (если необходимо) принтер;
3) включить монитор компьютера;
4) включить выключатель на корпусе системного блока.
После этого на экране появится сообщение о ходе работы программ проверки и начальной загрузки компьютера. Когда начальная загрузка будет закончена, на экране монитора появится изображение рабочего стола.
После успешного окончания начальной загрузки можно перейти к решению задач пользователя.
При окончании работы программы необходимо:
1) закончить работу программ;
2) выключить принтер, если он включен;
3) выключить монитор компьютера, если необходимо;
4) выключить компьютер;
5) выключить стабилизатор напряжения.
ЗАКЛЮЧЕНИЕ
Во время выполнения дипломной работы был сделан обзор и проведен анализ некоторых существующих разработок в сфере электронного документооборота, направленных на автоматизацию процесса классификации информационных сообщений, указаны их возможности и недостатки. С учетом необходимых требований были определены возможности, которыми должна обладать АИС «Классификатор»:
- создание информационной базы для автоматизированного процесса классификации статей к той или иной категории;
- загрузка информационных сообщений СМИ в базу;
- обработка текстовой и цифровой информации с использованием метода нечеткого поиска;
- классификация информационных сообщений с использованием метода ранжирования;
- открытость структуры рубрикатора и словаря, то есть возможность оперативной их корректировки;
- формирование рекомендаций для принятия решений;
- формирование отчетов.
Были сформулированы назначение и цели системы, поставлены задачи и определены функции.
Была разработана форма и представлено подробное описание структуры входных информационных сообщений СМИ и результатов классификации, используемых и получаемых в результате функционирования АИС «Классификатор». Была разработана структура организации базы для хранения информационных сообщений СМИ.
Была разработана математическая постановка задачи классификации информационных сообщений СМИ, а также описаны метод нечеткого поиска и метод ранжирования, применяемые при реализации требуемых функциональных характеристик АИС «Классификатор», была разработана схема работы системы.
Была рассчитана надежность системы на всех этапах ее развития.
Результатом проделанной работы является программа, выполняющая следующие функции:
- ведение информационной базы: формирование, добавление записи, изменение записи, удаление записи, сохранение записи, согласованное с работой всего объекта автоматизации;
- обработка информационных сообщений СМИ: открытие списка текстовых файлов в каталоге, открытие файла, считывание строки из файла, запись информационных сообщений СМИ в базу, закрытие файла;
- настройка параметров: определение каталога с файлами, задание расширения файлов с исходными данными, настройка расширения файлов, настройка параметров классификации;
- открытость структуры рубрикатора и словаря, то есть возможность оперативной их корректировки;
- классификация информационных сообщений СМИ: поиск записей по различным ключам словаря с помощью метода нечеткого поиска, классификация сообщений по результатам поиска, формирование рекомендаций для принятия решений, формирование отчетов.
При выполнении дипломного проекта особое внимание было уделено информационным характеристикам решаемой задачи, проведен анализ информации, поступающей в систему для обработки, учтены все требования, предъявляемые к решению поставленной задачи. Также был рассчитан экономический эффект от внедрения разработки, рассмотрены вопросы охраны труда.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. ГОСТ 2.105-95. ЕСКД. Общие требования к текстовым документам.
2. ГОСТ Р50.1.028-2001. Методология функционального моделирования.
3. ГОСТ 28195-89. Оценка качества программных средств.
4. ГОСТ 19.102-77.ЕСПД. Стадии разработки.
5. ГОСТ 19.402-78.ЕСПД. Описание программы.
6. ГОСТ 12.1.005-88 Общие санитарно-гигиенические требования к воздуху в рабочей зоне.
7. ГОСТ 19.701-90 Схемы алгоритмов, программ, данных и систем.
8. ГОСТ 34.201-89 Информационная технология. Виды, комплектность и обозначение документов при создании автоматизированных систем.
9. ГОСТ 34.602-89 Информационная технология. Техническое задание на создание автоматизированной системы.
10. СанПиН 2.2.2/2.4.1340-03 Гигиенические требования к персональным электронно-вычислительным машинам и организации работы.
11. Р.2.2.2006-05 Гигиенические критерии оценки условий труда по показателям вредности и опасности окружающей среды, тяжести и напряженности трудового процесса.
12. СанПиН 2.2.548-96 Общие санитарно-гигиенические требования к воздуху в рабочей зоне.
13. Андрейчиков А.В., Андрейчикова О.Н. Интеллектуальные информационные системы: Учебник. - М.: Финансы и статистика, 2004. - 424 с.: ил.
14. Базы данных в Delphi 7. Самоучитель/ В. Понамарев. - СПб.: Питер, 2003. - 224 с.: ил.
15. Башмаков А.И., Башмаков И.А. Интеллектуальные информационные технологии: Учеб. пособие. - М.: Изд-во МГТУ им. Н.Э. Баумана, 2005. - 304 с.: ил.
16. Бобровский С.И. Delphi 7. Учебный курс.- СПб.: Питер, 2003. - 736с.
17. Глушаков С.В., Клевцов А.Л. Программирование в среде Delphi 7. - Харьков: Фолио, 2003. - 528с.
18. Гофман В.Э., Хомоненко А.Д. Работа с базами данных в Delphi / В. - 2-е изд. - СПб.: БХВ - Петербург, 2002. - 624с.: ил.
19. Девятков В.В. Системы искусственного интеллекта: Учеб. пособие для вузов. - М.: Изд-во МГТУ им. Н.Э. Баумана, 2001. - 352 с.: ил.
20. Диго С.М. Проектирование баз данных: Учебник. - М.: Финансы и статистика, 1988. - 216с.
21. Дубнов П.Ю. Access 2000: Программирование баз данных. - М.: ДМК, 2000. - 272с.: ил.
22. Пономарев В. Базы данных в Delphi 7: Самоучитель. - М. и др.: Питер, 2003. - 224с.: ил.
23. Средства защиты в машиностроении: Расчет и проектирование: Справочник/С.В. Белов, А.Ф. Козьяков, О.Ф. Партолин и др.; Под ред. С.В. Белова. - М.: Машиностроение, 1989. - 368 с.: ил.
24. Типовые нормы времени на программирование задач для ЭВМ. - М.: Экономика, 1989.
25. http://google.ru/com/str.zip
26. http://google.ru//narod.ru/Hem/infon.zip
Приложение 1. Структура входных и выходных документов
Результаты классификации информационных сообщений СМИ
Код
|
Наименование рубрики
|
Название
|
Текст
|
Ключевые слова
|
Результат
|
|
|
|
|
|
|
|
|
|
Отчет по результатам классификации статьи
Дата публикации:_________________
Файл публикации:________________
Название публикации:_____________
Ключевые слова:__________________
Автор публикации: ________________
Текст публикации: _______________
Код
|
Наименование
|
По названию
|
По тексту
|
По ключевым словам
|
Результат
|
|
|
|
|
|
|
|
|
|
Отчет по обработанным статьям файла
Дата публикации: ____________________
Название публикации: ________________
Ключевые слова: _____________________
Автор публикации: ___________________
Текст публикации: ___________________
Сопоставленные рубрики: _______________
Приложение 2. Текст программы
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, OleServer, WordXP;
type
TfrmMain = class(TForm)
mnMain: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
wa: TWordApplication;
wd: TWordDocument;
wf: TWordFont;
N12: TMenuItem;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses uInputModule, uClassify, uEditDictModule, uClassifySettings,
uDataModule, uGetFileName, uEditPubl;
{$R *.dfm}
procedure TfrmMain.N2Click(Sender: TObject);
begin
frmInputForm.ShowModal;
end;
procedure TfrmMain.N3Click(Sender: TObject);
begin
frmClassify.ShowModal;
end;
procedure TfrmMain.N5Click(Sender: TObject);
begin
frmEditDict.ShowModal;
end;
procedure TfrmMain.N7Click(Sender: TObject);
begin
frmClassifySettings.ShowModal;
end;
procedure TfrmMain.N9Click(Sender: TObject);
begin
Close;
end;
procedure TfrmMain.N11Click(Sender: TObject);
var tmpl, Template, NewTemplate, ItemIndex: olevariant;
ARange: Range;
pars: Paragraphs;
par: Paragraph;
st: string;
vcol: OleVariant;
iStat: integer;
begin
dmIAS.aqFiles.Close;
dmIAS.aqFiles.Open;
frmGetFileName.cbFiles.Items.Clear;
frmGetFileName.cbFiles.Text:= dmIAS.aqFiles.FieldByName('file').AsString;
while not dmIAS.aqFiles.Eof do
begin
frmGetFileName.cbFiles.Items.Add(dmIAS.aqFiles.FieldByName('file').AsString);
dmIAS.aqFiles.Next;
end;
frmGetFileName.iMD:= 0;
frmGetFileName.ShowModal;
if (frmGetFileName.iMD = 0) or (frmGetFileName.cbFiles.Text = '')
then exit;
dmIAS.aqExe.Close;
dmIAS.aqExe.SQL.Text:= 'Select * from qObrPubl where file = :file';
dmIAS.aqExe.Parameters.ParamByName('file').Value:= frmGetFileName.cbFiles.Text;
dmIAS.aqExe.Open;
try
wa.Connect;
wa.Visible := True;
except
MessageDlg('А у Вас Word не установлен :(', mtError, [mbOk], 0);
Abort;
end;
ItemIndex:= 1;
Template:= EmptyParam;
NewTemplate := False;
// Создание документа
wa.Documents.Add(Template, NewTemplate, EmptyParam, EmptyParam) ;
wd.ConnectTo(wa.Documents.Item(ItemIndex));
wd.PageSetup.Set_Orientation(wdOrientLandscape);
wa.Options.CheckSpellingAsYouType := False;
wa.Options.CheckGrammarAsYouType := False;
ARange:= wd.Range(EmptyParam, EmptyParam);
pars:= wd.Paragraphs;
tmpl:= ARange;
par:= pars.Add(tmpl);
wf.ConnectTo(wd.Sentences.Get_Last.Font);
wd.Range.Paragraphs.Set_Alignment(wdAlignParagraphLeft);
wa.Selection.Font.Bold:= 1;
wa.Selection.Font.Size:= 16;
st:= 'Отчет по обработанным статьям файла ' + frmGetFileName.cbFiles.Text;
wa.Selection.InsertAfter(st+#13);
wa.Selection.InsertAfter(' '+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
iStat:= -1;
while not dmIAS.aqExe.Eof do
begin
if iStat <> dmIAS.aqExe.FieldByName('id_publ').AsInteger
then
begin
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
wa.Selection.Font.Bold:= 0;
wa.Selection.Font.Size:= 14;
wa.Selection.InsertAfter(' '+#13);
wa.Selection.InsertAfter(' '+#13);
st:= 'Дата публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
if (dmIAS.aqExe.FieldByName('data').AsString = '30.12.1899')
then st:= ' '
else st:= dmIAS.aqExe.FieldByName('data').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Название публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.aqExe.FieldByName('name_publ').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Ключевые слова: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.aqExe.FieldByName('keywords').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Автор публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.aqExe.FieldByName('author').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Текст публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.aqExe.FieldByName('text_publ').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Сопоставленные рубрики:';
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.aqExe.FieldByName('indx').AsString
+ ' '
+ dmIAS.aqExe.FieldByName('name_r').AsString;
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
iStat:= dmIAS.aqExe.FieldByName('id_publ').AsInteger;
end
else
begin
wa.Selection.InsertAfter(' '+#13);
st:= dmIAS.aqExe.FieldByName('indx').AsString
+ ' '
+ dmIAS.aqExe.FieldByName('name_r').AsString;
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
end;
dmIAS.aqExe.Next;
end;
wa.Disconnect;
end;
procedure TfrmMain.N12Click(Sender: TObject);
begin
frmEditPubl.ShowModal;
end;
end.
unit uFuzzySearch;
interface
function IndistinctMatching(MaxMatching:Integer; strInputMatching:WideString; strInputStandart:WideString):Integer;
implementation
uses SysUtils;
type
TRetCount = packed record
lngSubRows : Word;
lngCountLike : Word;
end;
function Matching(StrInputA:WideString; StrInputB:WideString; lngLen:Integer):TRetCount;
Var
TempRet : TRetCount;
PosStrB : Integer;
PosStrA : Integer;
StrA : WideString;
StrB : WideString;
StrTempA : WideString;
StrTempB : WideString;
begin
StrA := String(StrInputA);
StrB := String(StrInputB);
For PosStrA:= 1 To Length(strA) - lngLen + 1 do
begin
StrTempA:= System.Copy(strA, PosStrA, lngLen);
For PosStrB:= 1 To Length(strB) - lngLen + 1 do
begin
StrTempB:= System.Copy(strB, PosStrB, lngLen);
If SysUtils.AnsiCompareText(StrTempA,StrTempB) = 0 Then
begin
Inc(TempRet.lngCountLike);
break;
end;
end;
Inc(TempRet.lngSubRows);
end; // PosStrA
Matching.lngCountLike:= TempRet.lngCountLike;
Matching.lngSubRows := TempRet.lngSubRows;
end; { function }
//------------------------------------------------------------------------------
function IndistinctMatching(MaxMatching:Integer; strInputMatching:WideString; strInputStandart:WideString):Integer;
Var
gret : TRetCount;
tret : TRetCount;
lngCurLen: Integer ; //текущая длина подстроки
begin
//если не передан какой-либо параметр, то выход
If (MaxMatching = 0) Or (Length(strInputMatching) = 0) Or
(Length(strInputStandart) = 0) Then
begin
IndistinctMatching:= 0;
exit;
end;
gret.lngCountLike:= 0;
gret.lngSubRows := 0;
// Цикл прохода по длине сравниваемой фразы
For lngCurLen:= 1 To MaxMatching do
begin
//Сравниваем строку A со строкой B
tret:= Matching(strInputMatching, strInputStandart, lngCurLen);
gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
//Сравниваем строку B со строкой A
//tret:= Matching(strInputStandart, strInputMatching, lngCurLen);
//gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
//gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
end;
If gret.lngSubRows = 0 Then
begin
IndistinctMatching:= 0;
exit;
end;
IndistinctMatching:= Trunc((gret.lngCountLike / gret.lngSubRows) * 100);
end;
end.
unit uClassify;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Mask, DBCtrls, Grids, DBGridEh, ComCtrls,
WordXP, OleServer;
type
TfrmClassify = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
DBNavigator1: TDBNavigator;
dbmText: TDBMemo;
Panel3: TPanel;
Label7: TLabel;
Button2: TButton;
Panel4: TPanel;
Label6: TLabel;
Label3: TLabel;
dbAuthor: TDBEdit;
Label2: TLabel;
dbDate: TDBEdit;
Label4: TLabel;
dbName: TDBEdit;
Label5: TLabel;
dbKeywords: TDBEdit;
pbClassify: TProgressBar;
dbgClassify: TDBGridEh;
Button1: TButton;
Label8: TLabel;
dbFile: TDBEdit;
lblCountArticles: TLabel;
Button3: TButton;
wd: TWordDocument;
wa: TWordApplication;
wf: TWordFont;
procedure SetDBElemColor(flColor: boolean);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmClassify: TfrmClassify;
implementation
uses uDataModule, uFuzzySearch, uClassifySettings, uStructs;
{$R *.dfm}
procedure TfrmClassify.SetDBElemColor(flColor: boolean);
begin
if frmClassify = nil
then exit;
if flColor
then
begin
dbName.Color:= clMoneyGreen;
dbKeywords.Color:= clMoneyGreen;
dbmText.Color:= clMoneyGreen;
end
else
begin
dbName.Color:= clWindow;
dbKeywords.Color:= clWindow;
dbmText.Color:= clWindow;
end;
end;
procedure TfrmClassify.Button1Click(Sender: TObject);
var id_publ, id_rubr, level,
Name_cnt, Text_cnt, Key_cnt, im,
iNamePorog12, iTextPorog12, iKeyPorog12,
iNamePorog23, iTextPorog23, iKeyPorog23,
iFuzzyPorog: integer;
stWord, res: string;
function GetRes(NameCnt, TextCnt, KeyCnt: integer): String;
begin
if (NameCnt < iNamePorog12)
and (TextCnt < iTextPorog12)
and (KeyCnt < iKeyPorog12)
then result:= '-'
else
if (NameCnt >= iNamePorog23)
or (TextCnt >= iTextPorog23)
or (KeyCnt >= iKeyPorog23)
then result:= '+'
else result:= '?';
end;
begin
// Устанавливаем пороги срабатывания
iNamePorog12:= frmClassifySettings.GetNamePorog(12);
iTextPorog12:= frmClassifySettings.GetTextPorog(12);
iKeyPorog12:= frmClassifySettings.GetKeyPorog(12);
iNamePorog23:= frmClassifySettings.GetNamePorog(23);
iTextPorog23:= frmClassifySettings.GetTextPorog(23);
iKeyPorog23:= frmClassifySettings.GetKeyPorog(23);
iFuzzyPorog:= frmClassifySettings.GetFuzzyPorog;
// Начинаем классификацию
dmIAS.aqDict.Close;
dmIAS.aqDict.Open;
dmIAS.TruncClassify;
pbClassify.Position:= 0;
pbClassify.Max:= dmIAS.atPublikatsii.RecordCount * (dmIAS.aqDict.RecordCount+1);
with dmIAS.atPublikatsii do
begin
First;
while not Eof do
begin
id_publ:= FieldByName('id_publ').AsInteger;
Name_cnt:= 0;
Text_cnt:= 0;
Key_cnt:= 0;
dmIAS.aqDict.First;
id_rubr:= dmIAS.aqDict.FieldByName('id').AsInteger;
level:= dmIAS.aqDict.FieldByName('level').AsInteger;
while not dmIAS.aqDict.Eof do
begin
// Классифицируем по словарю для каждой рубрики
if id_rubr <> dmIAS.aqDict.FieldByName('id').AsInteger
then
begin
res:= GetRes(Name_cnt, Text_cnt, Key_cnt);
dmIAS.InsertClassify(id_publ, id_rubr, level, Name_cnt,
Text_cnt, Key_cnt, res);
id_rubr:= dmIAS.aqDict.FieldByName('id').AsInteger;
level:= dmIAS.aqDict.FieldByName('level').AsInteger;
Name_cnt:= 0;
Text_cnt:= 0;
Key_cnt:= 0;
end;
stWord:= AnsiUpperCase(dmIAS.aqDict.FieldByName('Word').AsString);
// Классификация по наименованию
im:= IndistinctMatching(length(stWord),
stWord,
AnsiUpperCase(FieldByName('name_publ').AsString));
if im > iFuzzyPorog
then Inc(Name_cnt);
// Классификация по тексту
im:= IndistinctMatching(length(stWord),
stWord,
AnsiUpperCase(FieldByName('text_publ').AsString));
if im > iFuzzyPorog
then Inc(Text_cnt);
// Классификация по ключевым словам
im:= IndistinctMatching(length(stWord),
stWord,
AnsiUpperCase(FieldByName('keywords').AsString));
if im > iFuzzyPorog
then Inc(Key_cnt);
dmIAS.aqDict.Next;
pbClassify.StepIt;
Application.ProcessMessages;
end;
res:= GetRes(Name_cnt, Text_cnt, Key_cnt);
dmIAS.InsertClassify(id_publ, id_rubr, level, Name_cnt,
Text_cnt, Key_cnt, res);
Next;
pbClassify.StepIt;
Application.ProcessMessages;
end;
end;
dmIAS.aqClassify.Close;
dmIAS.atPublikatsii.First;
dmIAS.aqClassify.Open;
Application.ProcessMessages;
ShowMessage('Классификация успешно завершена.');
end;
procedure TfrmClassify.Button2Click(Sender: TObject);
var i, i_rubr, level: integer;
begin
if dbgClassify.SelectedRows.Count = 0
then
begin
ShowMessage('Не выбрано ни одной записи!');
exit;
end;
// Удалить все записи из Publ_Rubr для данной статьи
dmIAS.DeleteFromPublRubr(dmIAS.atPublikatsii.FieldByName('id_publ').AsInteger);
// Записать в Publ_Rubr все выбранные рубрики для данной статьи
for i:= 0 to dbgClassify.SelectedRows.Count-1 do
begin
dbgClassify.DataSource.DataSet.GotoBookmark(Pointer(dbgClassify.SelectedRows.Items[i]));
i_rubr:= dbgClassify.DataSource.DataSet.FieldByName('id').AsInteger;
level:= dbgClassify.DataSource.DataSet.FieldByName('level_r').AsInteger;
dmIAS.InsertIntoPublRubr(dmIAS.atPublikatsii.FieldByName('id_publ').AsInteger,
i_rubr,
level);
end;
dbgClassify.DataSource.DataSet.GotoBookmark(Pointer(dbgClassify.SelectedRows.Items[0]));
ShowMessage('Соответствующие статье рубрики сохранены.');
dmIAS.atObrPublikatsii.Close;
dmIAS.atObrPublikatsii.Open;
dmIAS.atCountObrPublikatsii.Close;
dmIAS.atCountObrPublikatsii.Open;
lblCountArticles.Caption:= 'Всего в базе: '
+ IntToStr(dmIAS.atPublikatsii.RecordCount)
+ ' статей. '
+ ' Классифицировано '
+ IntToStr(dmIAS.atCountObrPublikatsii.RecordCount)
+ ' статей.';
end;
procedure TfrmClassify.FormCreate(Sender: TObject);
begin
frmClassifySettings.SetNamePorog(2, 12);
frmClassifySettings.SetTextPorog(3, 12);
frmClassifySettings.SetKeyPorog(2, 12);
frmClassifySettings.SetNamePorog(4, 23);
frmClassifySettings.SetTextPorog(6, 23);
frmClassifySettings.SetKeyPorog(4, 23);
frmClassifySettings.SetFuzzyPorog(50);
frmClassifySettings.SetflShowAll(true);
end;
procedure TfrmClassify.FormShow(Sender: TObject);
begin
{ if frmClassifySettings.GetflShowAll
then // Показывать все статьи
with dmIAS.atPublikatsii do
begin
Close;
SQL.Text:= stSelectAllPubl;
Open;
end
else // Показывать необработанные статьи
with dmIAS.atPublikatsii do
begin
Close;
SQL.Text:= stSelectNeobrPubl;
Open;
end;}
lblCountArticles.Caption:= 'Всего в базе: '
+ IntToStr(dmIAS.atPublikatsii.RecordCount)
+ ' статей. '
+ ' Классифицировано '
+ IntToStr(dmIAS.atCountObrPublikatsii.RecordCount)
+ ' статей.';
end;
procedure TfrmClassify.Button3Click(Sender: TObject);
var tmpl, Template, NewTemplate, ItemIndex: olevariant;
ARange: Range;
pars: Paragraphs;
par: Paragraph;
tbls: Tables;
tbl1: Table;
st: string;
vcol: OleVariant;
i: integer;
begin
try
wa.Connect;
wa.Visible := True;
except
MessageDlg('А у Вас Word не установлен :(', mtError, [mbOk], 0);
Abort;
end;
ItemIndex:= 1;
Template:= EmptyParam;
NewTemplate := False;
// Создание документа
wa.Documents.Add(Template, NewTemplate, EmptyParam, EmptyParam) ;
wd.ConnectTo(wa.Documents.Item(ItemIndex));
wd.PageSetup.Set_Orientation(wdOrientLandscape);
wa.Options.CheckSpellingAsYouType := False;
wa.Options.CheckGrammarAsYouType := False;
ARange:= wd.Range(EmptyParam, EmptyParam);
pars:= wd.Paragraphs;
tmpl:= ARange;
par:= pars.Add(tmpl);
wf.ConnectTo(wd.Sentences.Get_Last.Font);
wd.Range.Paragraphs.Set_Alignment(wdAlignParagraphLeft);
wa.Selection.Font.Bold:= 1;
wa.Selection.Font.Size:= 16;
st:= 'Отчет по результатам классификации статьи ';
wa.Selection.InsertAfter(st+#13);
wa.Selection.InsertAfter(' '+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
wa.Selection.Font.Bold:= 0;
wa.Selection.Font.Size:= 14;
st:= 'Дата публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
if (dmIAS.atPublikatsii.FieldByName('data').AsString = '30.12.1899')
then st:= ' '
else st:= dmIAS.atPublikatsii.FieldByName('data').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Файл публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.atPublikatsii.FieldByName('file').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Название публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.atPublikatsii.FieldByName('name_publ').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Ключевые слова: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.atPublikatsii.FieldByName('keywords').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Автор публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.atPublikatsii.FieldByName('author').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= 'Текст публикации: ';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
st:= dmIAS.atPublikatsii.FieldByName('text_publ').AsString;
wa.Selection.InsertAfter(st+#13);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
wa.Selection.InsertAfter(' '+#13);
st:= 'Результаты классификации:';
wa.Selection.InsertAfter(st);
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
ARange:= wd.Sentences.Last;
tbls:= ARange.Tables;
tbl1:= tbls.Add(ARange,
dmIAS.aqClassify.RecordCount+1, // число строк
6, // число столбцов
EmptyParam,
EmptyParam);
tbl1.Cell(1, 1).Range.Text:= 'Код';
tbl1.Cell(1, 2).Range.Text:= 'Наименование';
tbl1.Cell(1, 3).Range.Text:= 'По назв.';
tbl1.Cell(1, 4).Range.Text:= 'По тексту';
tbl1.Cell(1, 5).Range.Text:= 'По кл.сл.';
tbl1.Cell(1, 6).Range.Text:= 'Результат';
i:= 2;
dmIAS.aqClassify.First;
while not dmIAS.aqClassify.Eof do
begin
tbl1.Cell(i, 1).Range.Text:= dmIAS.aqClassify.FieldByName('indx').AsString;
tbl1.Cell(i, 2).Range.Text:= dmIAS.aqClassify.FieldByName('name_r').AsString;
tbl1.Cell(i, 3).Range.Text:= dmIAS.aqClassify.FieldByName('name_cnt').AsString;
tbl1.Cell(i, 4).Range.Text:= dmIAS.aqClassify.FieldByName('text_cnt').AsString;
tbl1.Cell(i, 5).Range.Text:= dmIAS.aqClassify.FieldByName('key_cnt').AsString;
tbl1.Cell(i, 6).Range.Text:= dmIAS.aqClassify.FieldByName('res').AsString;
dmIAS.aqClassify.Next;
Inc(i);
end;
vcol := wdCollapseEnd;
wa.Selection.Collapse(vcol);
wa.Disconnect;
dmIAS.aqClassify.First;
end;
end.
Страницы: 1, 2
|