Delphi中的拼写更正代码?

Delphi中的拼写更正代码?,delphi,Delphi,这个问题是讨论如何编写拼写更正程序,而不是重复的 组成部分 两年前,我在Python中找到并使用了拼写更正器的代码。但表现似乎并不高。非常有趣的是,最近他的网页列表中添加了更多实现相同任务的语言 Peter页面中的某些行包含以下语法: [a + c + b for a, b in splits for c in alphabet] 如何将其翻译成delphi 我感兴趣的是,SO的德尔福专家如何使用相同的理论,用一些合适的行和可能的平庸或更好的性能来完成相同的任务。这不是要否定任何语言,

这个问题是讨论如何编写拼写更正程序,而不是重复的 组成部分

两年前,我在Python中找到并使用了拼写更正器的代码。但表现似乎并不高。非常有趣的是,最近他的网页列表中添加了更多实现相同任务的语言

Peter页面中的某些行包含以下语法:

[a + c + b     for a, b in splits for c in alphabet]
如何将其翻译成delphi

我感兴趣的是,SO的德尔福专家如何使用相同的理论,用一些合适的行和可能的平庸或更好的性能来完成相同的任务。这不是要否定任何语言,而是要学会比较它们如何以不同的方式执行任务

非常感谢

[编辑]

我将引用C版本的作者的话,“…而本文[C版本]的目的是展示算法,而不是强调Python…”。根据他的文章,尽管他的C版本的行数排在第二位,但当字典文件很大时,他的版本性能很高。所以这个问题不是要强调任何语言,而是要寻求德尔福解决方案,它根本不是为了竞争,尽管彼得在指导谷歌研究方面很有影响力

[更新]

大卫的建议启发了我,我学习了彼得书页的理论和惯例。完成了一个非常粗糙和低效的例程,与其他语言略有不同,我的是GUI。我是Delphi的初学者和学习者,我不敢发布我的完整代码(它写得很糟糕)。我将概述我是如何做到这一点的。欢迎您的评论,以便改进日常工作

我的硬件和软件都很旧。这对我的工作来说已经足够了(我的专业不是计算机或程序相关的)

这是“正确”字处理时间的快照和记录。 我尝试了Gettickcount、Tdatetime和Queryperformancecounter来跟踪word的正确时间,但Gettickcount和Tdatetime将为每次检查输出毫秒,因此我必须使用 查询性能计数器。也许还有其他更精确的方法

总行数为72行,不包括记录检查时间的函数。行数可能不是Marcelo上面提到的标准。这篇文章是讨论如何以不同的方式完成任务。SO的Delphi专家当然会使用最少的行来实现最佳性能

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;

通过Tfilestream,它似乎可以将负载增加1-2秒。我尝试使用CreateFileMapping方法,但失败了,看起来有点复杂。也许还有其他方法可以快速加载大文件。因为考虑到语料库的可用性,这个big.txt不会很大,所以应该有更有效的方法来加载越来越大的文件

另一点是Delphi7.0没有内置的正则表达式。我在Perter的页面上看到了其他进行拼写检查的语言,它们主要是直接调用其内置正则表达式。当然,真正的专家不需要任何内置类或库,可以自己构建。对于初学者来说,有些课程或图书馆很方便

欢迎您的评论

[更新]

我继续研究,并进一步包括edits2功能(编辑距离2)。这将增加大约12行代码。彼得说,编辑距离2将包括几乎所有的可能性“某物”将有114324种可能性。我的函数将为它生成102727个独特的可能性。当然,建议的词语还包括更多

如果使用edits2,则更正的响应时间明显延迟,因为它将数据增加约200倍。但我发现一些建议的更正显然是不可能的,因为打字员不会键入一个错误单词,而这个错误单词将出现在长长的更正单词列表中。因此,如果big.txt文件足够大,可以包含更多正确的单词,则编辑距离1会更好

下面是跟踪编辑2正确时间的快照


这是一个Python列表理解。它形成了拆分和字母表的笛卡尔乘积

拆分的每一项都是一个元组,它被解包为a和b。字母表的每一项都被放入一个叫做c的变量中。然后将这3个变量连接起来,假设它们是字符串。列表理解表达式的结果是一个列表,其中包含形式为a+c+b的元素,笛卡尔乘积中的每个项目对应一个元素

在Python中,它可以等效地写成

res = []
for a, b in splits:
  for c in alphabets:
    res.append(a + c + b)
在德尔菲,这将是

res := TStringList.Create;
for split in splits do
  for c in alphabets do
    res.Add(split.a + c + split.b);

我建议您继续阅读,以便更好地了解这个非常强大的Python功能。

您希望我们在Delphi中实现它,并告诉您有多少行代码以及性能如何?听起来更像是一场比赛,而不是一个严肃的问题。无论如何,我们无法在不同的机器上测量结果,并将其与彼得·诺维格的机器进行比较-至少在你解释你真正想知道什么之前。@daemon_x,我想知道如何在delphi中实现它。如何翻译Peter页面中的python语法,例如“[(单词[:i],单词[i:])表示范围内的i(len(单词)+1)]”或“[a+c+b[1:]表示a,b表示字母表中的c,b表示b]”。Peter为任务列出语言并不意味着竞争,而是暗示不止一种语言可以做到这一点。我没有测试所有的语言版本。虽然有些语言标记的行数较少,但它们可能并不意味着性能更好。@user482742--1已删除;将代码翻译成Delphi可能很有趣,但对于SO来说,这不是一个好问题(任务)。@daemon_x,谢谢。为了避免任何可能的厌恶和误解,我从Peter的页面中编辑并删除了任务的语言和行数。也许你需要为你不理解的每行创建单独的问题:)
res := TStringList.Create;
for split in splits do
  for c in alphabets do
    res.Add(split.a + c + split.b);