Рефераты. Автоматизированная интеллектуальная система классификации информационных сообщений средств массовой информации

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, 3, 4, 5, 6, 7, 8, 9



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.