Deklination von Wörtern und Initialen in Delphi / Freepascal

Guten Silvester allerseits! In diesem Artikel möchte Ich mag Ihnen sagen , wie ich zu einem Legacy - Projekt in Pascal zurückkehren musste, und buchstäblich vor Abschied von ihm zu sagen, zu lazarus, und das Fehlen eines dunkelen Themas aus der Box .





Das letzte Mal habe ich erklärt, dass ich von Beruf kein Programmierer bin, aber ich benutze mein Lieblingshobby, um alles zu automatisieren, was bei der Arbeit eines Anwalts zur Hand ist. Ich bin sicher, dass 90% aller rechtlichen Bürokratie erfolgreich automatisiert werden können: Verwalten einer Vielzahl von Datenbanken und Karten, Erstellen von Dokumenten anhand von Vorlagen, Steuern des Timings von Aufgaben, Verwenden von Hilfsdiensten, die bereits eine eigene API für die Schraubenautomatisierung an einem bestimmten Arbeitsplatz haben usw. usw. Dies muss angestrebt werden, um nach den Anweisungen von Isaac Asimov die Zeit eines Anwalts für die Erfüllung der Hauptaufgabe freizugeben - über die Vertragsbedingungen nachzudenken und die Demagogie vor Gericht zu züchten.






Vor vielen Jahren habe ich ein sehr großes Projekt durchgeführt, um meine Büroarbeit zu erleichtern. Er sammelte alle Daten zu Marken und Patenten (und es gibt mehrere hundert davon), kontrollierte den Zeitpunkt der Zahlung von Patentgebühren, formulierte Zahlungsaufträge, Verträge, Anmeldungen und gab natürlich verschiedene Berichte heraus. Warum eigentlich in der Vergangenheitsform? Das Projekt funktioniert ziemlich gut. Es wurde nur nach allen möglichen Anti-Mustern entwickelt, mit all den Fahrrädern und Krücken, die nur auf der Erde entdeckt wurden. Um zu diesem Rolton- (oder Doshirak-) Code zurückzukehren, um ihn umzugestalten , wollte ich das nicht, denn das Mem " Lass uns alles neu schreiben in ... " ist hier perfekt .





Leider ist es ein langwieriges und langwieriges Geschäft, alles in einer neuen Sprache für eine neue Plattform oder sogar mehrere neu zu schreiben, und Dokumente müssen hier und jetzt abgestempelt werden. Deshalb muss ich von Zeit zu Zeit nach Pascal zurückkehren.





An einem der schönen Tage wurde das gesamte Projekt auf einer 64-Bit-Plattform neu aufgebaut, und zu meiner Überraschung fiel der beliebteste Teil: die Generierung von Verträgen und Aussagen mit vollständiger Automatisierung aller Grammatik und Morphologie - die Deklination von Initialen, Positionen und anderen Wörtern in den erforderlichen Fällen und Siehe auch Singular / Plural. Die Sache ist, dass die alte Delphic- und proprietäre padegUC-Bibliothek in ihrer 64-Bit-Version nicht mehr kostenlos ist.





32- , . .





- , . , :





IInitialsMorpher = interface
  function GetInitials(Initials: string): CasesResponse;
  function GetWordsCase(Words: string): CasesResponse;
  function GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
end;
      
      



, , -: (.. ), , , , , , .. CasesResponse , Gender - :





TWordCase = (Nominative, Gentitive, Dative, Accusative, Instrumental, Prepositional);
TGender = (Male, Female, UnrecognizedGender);
CasesResponse = array[TWordCase] of string;
      
      



. , :

















DaData





-





-





-





- -





-





Pymorphy





github





- MIT , python





- Corpora ( )





- , .. , , , ..





- , , ..





Morphos





- MIT , php





-





-





- ,





, Morphos, / .





rest api, json, , http, :





generic function JSONfromRestUri<T>(Uri: string): T;
var
  HTTPSender: THTTPSend;
  JSONStreamer: TJSONDeStreamer;
  Json: TJSONObject;
begin
  HTTPSender := THTTPSend.Create;
  JSONStreamer := TJSONDeStreamer.Create(nil);
  HTTPSender.Clear;
  Result := T.Create;
  if not HTTPSender.HTTPMethod('GET', Uri) then 
  		raise EInOutError.Create(RESTOUT_ERROR);
  JSON := GetJSON(HTTPSender.Document) as TJSONObject;
  JSONStreamer.JSONToObject(JSON, Result);
  FreeAndNil(JSON);
  FreeAndNil(JSONStreamer);
  FreeAndNil(HTTPSender);
end;
      
      



Freepascal Synapse Fpjson, (httpsend, fpjson, fpjsonrtti) uses. json rtti, .. , -, published, -, (, , ), -, json. , @SerializedName , .





Morphos :





MORPHOS_URL = 'http://morphos.io/api/inflect-name?name=%s&_format=json';
      
      



json , - / , , name gender:





{
    "name": " ",
    "cases": [
        " ",
        " ",
        " ",
        " ",
        " ",
        "  "
    ],
    "gender": "m"
}
      
      



IInitialsMorpher Morpher. , json Fpjson ( , TPersistent):





TMorphosResponse = class(TPersistent)
  private
    fCases: TStrings;
    fGender: string;
    fName: string;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property name: string read fName write fName;
    property cases: TStrings read fCases write fCases;
    property gender: string read fGender write fGender;
  end;
      
      



:





TMorphosImpl = class(TInterfacedObject, IInitialsMorpher)
  public
    function GetInitials (Initials: string): CasesResponse;
    function GetWordsCase (Words: string): CasesResponse;
    function GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
  end;
      
      



, :





function TMorphosImpl.GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
var
  inf: TWordCase;
  i: integer = 0;
  response: TMorphosResponse;
begin
  response := specialize JSONfromRestUri<TMorphosResponse>
                (Replacetext(Format(MORPHOS_URL, [Initials]), ' ', '+'));
  for inf in TWordCase do begin
      Result[inf] := response.cases[i];
      inc(i);
  end;
  case response.gender of
       'm': Gender := Male;
       'f': Gender := Female;
       else Gender := UnrecognizedGender;
  end;
  FreeAndNil(response);
end;
      
      



, . , ( ) , , - :





function TMorphosImpl.GetInitials(Initials: string): CasesResponse;
var
  MokeGender: TGender = UnrecognizedGender;
begin
  Result := GetGenderAndInitials(Initials, MokeGender);
end;

function TMorphosImpl.GetWordsCase(Words: string): CasesResponse;
var
  inf: TWordCase;
begin
  Result := GetInitials(Words);
  for inf in TWordCase do
    Result[inf] := UTF8LowerString(Result[inf]);
end;
      
      



, . , . . , , , DI- - "" .





- -, ( , , - ?) - http-. Morphos , DaData , 10 .





, . , json ashMap- Generics.Collections - , freepascal delphi. , - ( , http- , ).





Morphos :





Morpher := TMorphFabric.Create(MORPHOS);
//...
response := Morpher.GetInitials(Text)
StringList.AddStrings(response);
      
      



Für alle Interessierten werde ich meine resultierende Bibliothek mit einer Testfensteranwendung für win in einem offenen Repository aufbewahren . Höchstwahrscheinlich werde ich nichts damit anfangen, denn jetzt bin ich in das offene Meer der mobilen Entwicklung (Kotlin) und Python getaucht, um dasselbe Mem zu implementieren: "Alles neu schreiben in ..."





Frohes Neues Jahr 2020 + '1' allerseits!








All Articles