Diese Frage soll diskutieren, wie man einen Zauberkorrektor kodiert und ist kein Duplikat von Delphi-Rechtschreibprüfung -Komponente.
Vor zwei Jahren habe ich den Code des Zauberkorrektors von Peter Norvig auf seiner Website in Python gefunden und benutzt . Aber die Leistung schien nicht hoch zu sein. Interessanterweise wurden in letzter Zeit mehr Sprachen in seine Webseitenliste aufgenommen, die die gleiche Aufgabe implementieren.
Einige Zeilen in Peters Seite enthalten Syntax wie:
%Vor%Wie übersetzt man es in Delphi?
Ich bin daran interessiert, wie Delphi-Experte bei SO die gleiche Theorie verwenden und die gleiche Aufgabe mit einigen geeigneten Linien und möglicher mittelmäßiger oder besserer Leistung ausführen wird. Dies bedeutet nicht, irgendeine Sprache zu verwerfen, sondern zu lernen zu vergleichen, wie sie die Aufgabe anders umsetzen.
Vielen Dank im Voraus.
[Bearbeiten]
Ich werde Marcelo Toledo zitieren, der C Version beisteuert, wie gesagt "... Während der Zweck dieses Artikels [C-Version] war, die Algorithmen zu zeigen, nicht um Python hervorzuheben ...". Obwohl seine C-Version mit den zweithöchsten Zeilen versehen ist, ist seine Version laut seinem Artikel sehr leistungsfähig, wenn die Wörterbuchdatei riesig ist. Diese Frage ist also keine Sprache, sondern die Frage nach einer Delphi-Lösung, und sie ist keineswegs für den Wettbewerb gedacht, obwohl Peter bei der Leitung von Google Research einflussreich ist.
[Update]
Ich wurde von Davids Vorschlag erleuchtet und studierte Theorie und Routine von Peters Seite. Eine sehr grobe und ineffiziente Routine wurde gemacht, etwas anders als in anderen Sprachen, meine ist GUI's. Ich bin ein Anfänger und Lerner in Delphi, ich wage nicht, meinen kompletten Code zu veröffentlichen (es ist schlecht geschrieben). Ich werde meine Vorstellung davon, wie ich es gemacht habe, skizzieren. Ihr Kommentar ist willkommen, damit die Routine verbessert wird.
Meine Hardware und Software ist alt. Dies ist genug für meine Arbeit (meine Spezialisierung ist nicht in Computer oder Programm bezogen)
%Vor%Dies ist der Schnappschuss und die Aufzeichnung der Verarbeitungszeit des "korrekten" Wortes. Ich habe Gettickcount, Tdatetime und Queryperformancecounter ausprobiert, um die korrekte Zeit für das Wort zu verfolgen, aber gettickcount und Tdatetime geben für jede Prüfung o ms aus, also muss ich sie verwenden Abfrageperformancecounter. Vielleicht gibt es andere Möglichkeiten, es genauer zu machen.
Die Gesamtzahl der Zeilen beträgt 72, ohne die Funktion, die die Prüfzeit aufzeichnet. Die Anzahl der Zeilen ist möglicherweise nicht so, wie von Marcelo erwähnt. Im Beitrag wird erläutert, wie die Aufgabe anders zu erledigen ist. Delphi-Experten bei SO verwenden natürlich minimale Linien, um dies mit der besten Leistung zu erreichen.
%Vor%
Es scheint bei Tfilestream, dass das Laden um 1-2 Sekunden erhöht werden kann. Ich habe versucht, CreateFileMapping-Methode, aber fehlgeschlagen und es schien ein wenig kompliziert. Vielleicht gibt es andere Möglichkeiten, große Dateien schnell zu laden. Da diese big.txt angesichts der Verfügbarkeit des Korpus nicht groß sein wird, sollte es eine effizientere Möglichkeit geben, größere und größere Dateien zu laden.
Ein weiterer Punkt ist, dass Delphi 7.0 keinen eingebauten regulären Ausdruck hat. Ich schaue mir andere Sprachen an, die auf Perters Seite eine Rechtschreibprüfung durchführen, sie rufen größtenteils ihren eingebauten regulären Ausdruck direkt auf. Natürlich braucht echter Experte keine eingebaute Klasse oder Bibliothek und kann selbst bauen. Für Anfänger sind einige Klassen oder Bibliotheken bequem.
Ihr Kommentar ist willkommen.
[Update]
Ich fuhr mit der Forschung fort und beinhaltete die edits2-Funktion (edit distance 2). Dies wird um weitere 12 Zeilen Code erhöht. Peter sagte, dass Editierdistanz 2 fast alle Möglichkeiten beinhalten würde. "Etwas" wird 114324 Möglichkeiten haben. Meine Funktion wird 102.727 einzigartige Möglichkeiten dafür generieren. Natürlich enthalten vorgeschlagene Wörter auch mehr.
Wenn bei edits2 die Reaktionszeit für die Korrektur offensichtlich verzögert wird, werden die Daten um etwa das 200-fache erhöht. Aber ich finde, dass einige vorgeschlagene Korrekturen offensichtlich unmöglich sind, da eine Schreibkraft kein Fehlerwort eingibt, das in der langen korrigierten Wortliste enthalten ist. Editierdistanz 1 ist also besser, wenn die Datei big.txt groß genug ist, um richtigere Wörter aufzunehmen.
Im Folgenden sehen Sie den Schnappschuss von Tracking-Bearbeitungen in der korrekten Zeit.
Dies ist ein Python-Listenverständnis. Es bildet das kartesische Produkt von Splits und Alphabeten.
Jeder Splitt ist ein Tupel, das in a und b ausgepackt wird. Jedes Alphabet wird in eine Variable namens c eingegeben. Dann werden die 3 Variablen verkettet, unter der Annahme, dass sie Strings sind. Das Ergebnis des Listenverständnisausdrucks ist eine Liste mit Elementen der Form a + c + b, einem Element für jedes Element des kartesischen Produkts.
In Python könnte es äquivalent geschrieben werden wie
%Vor%In Delphi wäre es
%Vor%Ich schlage vor, Sie lesen Python-Listen-Comprehensions , um ein besseres Verständnis dafür zu bekommen mächtige Python-Funktion.
Tags und Links delphi