Traitement personnalisé

Retour  Précédent  Suivant

 

Cette fonctionnalité, d'un niveau avancé, est disponible dans le menu Modifier les paramètres | Avancé.

 

Le but

Je ne peux pas connaître les critères que vous avez définis pour traiter vos textes, à l'exception des critères prédéfinis tels que le choix des textes, du terme de recherche, etc. Vous serez amené à effectuer des vérifications ou modifications spécifiques des données avant qu'elles ne soient converties au format WordSmith. Vous pourriez par exemple avoir besoin de lemmatiser un mot en fonction des exigences spécifiques de votre langue.

Cette fonction le permet. Si vous avez choisi de filtrer les concordances, Concord appelle le fichier *.dll chaque fois qu'il trouve un résultat pour votre mot de recherche au cours du traitement de vos fichiers texte. Votre fichier *.dll reçoit des informations sur les éléments trouvés, et le fichier peut ainsi modifier le résultat ou envoyer des informations à Concord pour qu'il l'ignore.

 

Procédure

Sélectionnez votre fichier *.dll (il peut avoir n'importe quel nom) et cochez une ou plusieurs options dans la page Avancé. Pour cela, il faut appeler des fonctions standard et connaître leurs noms et leurs formats. C'est à vous d'écrire votre propre programme *.dll qui effectuera la tâche désirée. Il peut être écrit dans n'importe quel langage (C++, Java, Pascal, etc).

 

Exemple de lemmatisation d'un mot dans WordList

 

Le fichier *.dll est fourni lors de l'installation, compilé et prêt à l'utilisation.

 

Votre fichier *.dll doit contenir une fonction comportant les spécifications suivantes :

 

function WordlistChangeWord(

original : pointer;

language_identifier : DWORD;

is_Unicode : WordBool) : pointer; stdcall;

 

L'élément language_identifier est un nombre correspondant à la langue avec laquelle vous travaillez. Reportez-vous aux valeurs LCID (List of Locale ID) affectées par Microsoft .

 

Ainsi, l'original (envoyé par WordSmith) peut être PCHAR (7 ou 8 bits) ou PWIDECHAR (Unicode 16 bits), et le résultat fourni par votre fichier *.dll peut mener vers :

 

a) néant (si vous ne souhaitez pas que le terme d'origine apparaisse dans votre liste)

b) le même PCHAR/PWIDECHAR s'il ne doit y avoir aucune modification

c) une forme de remplacement

 

Voici un exemple où le texte source était

 

Today is Easter Day.

 

 

custom_processingEASTER

 

Le code source dans Delphi pour ce fichier *.dll est le suivant :

 

************************************

library WordSmith4CustomDLL;

 

uses

Windows, SysUtils;

 

{

This example uses a very straightforward Windows routine for comparing

strings, CompareStringA and CompareStringW which are in a Windows .dll.

 

The function does a case-insensitive comparison because

NORM_IGNORECASE (=1) is used. If it was replaced by 0, the comparison

would be case-sensitive.

 

In this example, EASTER gets changed to CHRISTMAS.

}

 

function WordlistChangeWord(

original : pointer;

language_identifier : DWORD;

is_Unicode : WordBool) : pointer; stdcall;

begin

Result := original;

if is_Unicode then begin

  if CompareStringW(

    language_identifier,

    NORM_IGNORECASE,

    PWideChar(original), -1,

    PWideChar(widestring('EASTER')), -1) - 2 = 0

  then

    Result := pwidechar(widestring('CHRISTMAS'));

end else begin

  if CompareStringA(

    language_identifier,

    NORM_IGNORECASE,

    PChar(original), -1,

    PChar('EASTER'), -1) - 2 = 0

  then

    Result := pchar('CHRISTMAS');

end;

end;

 

function ConcordChangeWord(

original : pointer;

language_identifier : DWORD;

is_Unicode : WordBool) : pointer; stdcall;

begin

Result := WordlistChangeWord(original,language_identifier,is_unicode);

end;

 

function KeyWordsChangeWord(

original : pointer;

language_identifier : DWORD;

is_Unicode : WordBool) : pointer; stdcall;

begin

Result := WordlistChangeWord(original,language_identifier,is_unicode);

end;

 

function HandleConcordanceLine

(source_line : pointer;

hit_position,

hit_length : word;

byte_position_in_file,

language_id : DWORD;

is_Unicode : WordBool;

filename : pchar) : pointer; stdcall;

 

function extrasA : string;

begin

  Result := #9+pchar(filename)+

            #9+ IntToStr(byte_position_in_file)+

            #9+ IntToStr(hit_position)+

            #9+ IntToStr(hit_length);

end;

 

function extrasW : widestring;

begin

  Result := extrasA;

end;

 

var f : TextFile;                                                        

output_file : string;

begin

Result := source_line;

output_file := ChangeFileExt(ParamStr(0),'')+

  '_user_dll_concordance_lines.txt';

if (not IsPathDelimiter(ExpandUNCFileName(ParamStr(0)),1)) and

   (DiskFree(Ord(UpCase(output_file[1]))-64) > 1024*2000) then

try

  if FileExists(output_file) then begin

    AssignFile(f,output_file);

    Append(f);

  end else begin

    AssignFile(f,output_file);

    Rewrite(f);

  end;

  if is_Unicode then

    Writeln(f,pwidechar(source_line)+extrasW)

  else

    Writeln(f,pchar(source_line)+extrasA);

  Flush(f);

  CloseFile(f);

except

end;

end;

 

exports

 

ConcordChangeWord,

KeyWordsChangeWord,

WordlistChangeWord,

HandleConcordanceLine;

 

begin

end.