Esta pregunta es para debatir cómo codificar un corrector ortográfico y no es un duplicado del componente Delphi Spell Checker.¿Un código corrector ortográfico en Delphi?
Hace dos años, encontré y usé el código de corrector ortográfico por Peter Norvig at his website en Python. Pero el rendimiento no parecía alto. Curiosamente, más idiomas que implementan la misma tarea se han agregado recientemente a su lista de páginas web.
Algunas líneas en la página de Peter incluyen sintaxis como:
[a + c + b for a, b in splits for c in alphabet]
Cómo traducir en Delphi?
Estoy interesado en cómo Delphi experto en SO utilizará la misma teoría y hará la misma tarea con algunas líneas adecuadas y un rendimiento mediocre o mejor posible. Esto no implica menospreciar ningún idioma, sino aprender a comparar cómo implementan la tarea de manera diferente.
Muchas gracias de antemano.
[Editar]
citaré Marcelo Toledo que aporta la versión C, como diciendo "... Mientras que el propósito de este artículo [Versión C] fue mostrar los algoritmos, no para poner de relieve Python ..." . Aunque su versión C es con la segunda mayoría de las líneas, según su artículo, su versión es de alto rendimiento cuando el archivo del diccionario es enorme. Por lo tanto, esta pregunta no es resaltar ningún idioma, sino solicitar una solución de Delphi y no está destinado en absoluto a la competencia, aunque Peter es influyente en la dirección de Google Research.
[Actualización]
estaba iluminado por la sugerencia de David y estudió teoría y la rutina de la página de Peter. Se hizo una rutina muy áspera e ineficiente, ligeramente diferente de otros idiomas, la mía es GUI. Soy un principiante y un aprendiz en Delphi, no me atrevo a publicar mi código completo (está mal escrito). Esbozaré mi idea de cómo lo hice. Su comentario es bienvenido para que la rutina se mejore.
Mi hardware y software es antiguo. Esto es suficiente para mi trabajo (mi especialidad no está en la computadora o programa relacionado)
AMD Athlon Dual Core Processor
2.01 Ghz, 480 Memory
Windows XP SP2
IDE Delphi 7.0
Ésta es la instantánea y registro de tiempo de procesamiento de la palabra 'correcta'. Intenté Gettickcount, Tdatetime y Queryperformancecounter para rastrear el tiempo correcto por palabra, pero gettickcount y Tdatetime darán como resultado ms para cada comprobación, así que tengo que usar Queryperformancecounter. Tal vez hay otras formas de hacerlo de manera más precisa.
El total de líneas es 72, sin incluir la función que registra el tiempo de comprobación. Es posible que el número de líneas no sea el criterio medido anteriormente por Marcelo. La publicación trata sobre cómo hacer la tarea de manera diferente. Los expertos de Delphi en SO, por supuesto, usarán líneas mínimas para hacerlo con el mejor rendimiento.
procedure Tmajorform.FormCreate(Sender: TObject);
begin
loaddict;
end;
procedure Tmajorform.loaddict;
var
fs: TFilestream;
templist: TStringlist;
p1: tperlregex;
w1: string;
begin
//load that big.txt (6.3M, is Adventures of Sherlock Holmes)
//templist.loadfromstream
//Use Tperlregex to tokenize (I used regular expression by [Jan Goyvaerts][5])
//The load and tokenize time is about 7-8 seconds on my machine, Maybe there are other ways to
//speed up loading and tokenizing.
end;
procedure Tmajorform.edits1(str: string);
var
i: integer;
ch: char;
begin
// This is to simulate Peter's page in order to fast generate all possible combinations.
// I do not know how to use set in delphi. I used array.
// Peter said his routine edits1 would generate 494 elements of 'something'. Mine will
// generate 469. I do not know why. Before duplicate ignore, mine is over 500. After setting
// duplicate ignore, there are 469 unique elements for 'something'.
end;
procedure Tmajorform.correct(str: string);
var
i, j: integer;
begin
//This is a loop and binary search to add candidate word into list.
end;
procedure Tmajorform.Button2Click(Sender: TObject);
var
str: string;
begin
// Trigger correct(str: string);
end;
Parece por TFileStream que puede aumentar la carga por 1-2 segundos. Traté de usar el método CreateFileMapping pero fallé y me pareció un poco complicado. Tal vez haya otras maneras de cargar un archivo enorme rápidamente. Debido a que este big.txt no será grande teniendo en cuenta la disponibilidad de corpus, debería haber una forma más eficiente de cargar archivos cada vez más grandes.
Otro punto es que Delphi 7.0 no tiene una expresión regular incorporada. Echo un vistazo a otros idiomas que revisan la ortografía en la página de Perter, en su mayoría están llamando directamente a su expresión regular incorporada. Por supuesto, un verdadero experto no necesita ninguna clase o biblioteca incorporada y puede construir por sí mismo. Para principiantes, algunas clases o bibliotecas son convenientes.
Su comentario es bienvenido.
[Actualización]
que continuaron la investigación y la función edits2 incluye además (distancia de edición 2). Esto aumentará otras 12 líneas de código. Peter dijo que editar la distancia 2 incluiría casi todas las posibilidades. 'algo' tendrá 114,324 posibilidades. Mi función generará 102,727 posibilidades ÚNICAS para ello. Por supuesto, las palabras sugeridas también incluirán más.
Si con edits2, el tiempo de respuesta para la corrección obviamente se retrasa ya que aumenta los datos unas 200 veces. Pero creo que algunas correcciones sugeridas son obviamente imposibles ya que un mecanógrafo no escribirá una palabra de error que estará en la lista larga de palabras corregidas. Por lo tanto, la distancia de edición 1 estará mejor siempre que el archivo big.txt sea lo suficientemente grande como para incluir más palabras correctas.
A continuación se muestra la instantánea de las ediciones de seguimiento de 2 veces correctas.
¿Desea que nosotros lo implementemos en Delphi y le diga cuántas líneas y cómo fue el rendimiento? Suena más como una competencia que una pregunta seria. De todos modos, no podemos medir los resultados en diferentes máquinas y compararlo con el de Peter Norvig. -1 al menos hasta que expliques lo que realmente quieres saber. –
@daemon_x, quiero saber cómo hacerlo en Delphi. Cómo traducir la sintaxis de Python en la página de Peter como "[(palabra [: i], palabra [i:]) para i en rango (len (palabra) + 1)]" o "[a + c + b [1: ] para a, b en divisiones para c en alfabeto si b] ". Que Peter enumere los idiomas para la tarea no significa competencia, pero sugiere que más de un idioma puede hacerlo. No he probado toda la versión del idioma. Aunque algunos idiomas están etiquetados con menos líneas, es posible que no signifiquen un mejor rendimiento. – Dylan
@ user482742 - -1 eliminado; podría ser muy interesante traducir el código a Delphi, pero no es una buena pregunta (tarea) para SO. –