gpt4 book ai didi

delphi - Delphi中的拼写校正器代码?

转载 作者:行者123 更新时间:2023-12-03 14:43:48 25 4
gpt4 key购买 nike

这个问题是要讨论如何编码拼写校正器,而不是重复的
Delphi Spell Checker组件。

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

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

[a + c + b     for a, b in splits for c in alphabet]

如何将其翻译成delphi?

我对SO的Delphi专家如何使用相同的理论并以一些合适的方式以及可能表现平平或更好的性能执行相同的任务感兴趣。这不是要打败任何语言,而是要学习比较它们如何以不同方式执行任务。

提前非常感谢。

[编辑]

我将引用贡献C版本的 Marcelo Toledo的话说:“...而本文[C版本]的目的是展示算法,而不是突出显示Python ...”。尽管他的C版本的代码排在第二位,但根据他的文章,当词典文件很大时,他的版本具有很高的性能。因此,这个问题并不是要突出任何语言,而是要寻求delphi解决方案,尽管彼得在领导Google Research方面很有影响力,但这个问题根本不是为了竞争。

[更新]

大卫的建议启发了我,并研究了彼得的页面的理论和惯例。完成了一个非常粗糙且效率低下的例程,与其他语言略有不同,我的是GUI的。我是Delphi的初学者和学习者,我不敢发布完整的代码(编写得不好)。我将概述我的想法。欢迎您发表评论,以便改进常规程序。

我的硬件和软件很旧。这对我的工作已经足够了(我的专业不是与计算机或程序相关的)
AMD Athlon Dual Core Processor
2.01 Ghz, 480 Memory
Windows XP SP2
IDE Delphi 7.0

这是“正确”字的处理时间的快照和记录。
我尝试使用Gettickcount,Tdatetime和Queryperformancecounter来跟踪单词的正确时间,但是gettickcount和Tdatetime会为每个检查输出o ms,因此我必须使用
查询性能计数器。也许还有其他方法可以更精确地做到这一点。

总行数为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不会很大,所以应该有更有效的方式来加载越来越大的文件。

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

欢迎您发表评论。

[更新]

我继续进行研究,并进一步包括了edits2函数(edit distance 2)。这将增加大约12行代码。彼得说编辑距离2将包括几乎所有可能性。 “某物”将有114,324种可能性。我的函数将为其产生102,727种独特的可能性。当然,建议的单词也将包含更多内容。

如果使用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 list comprehensions以获得对这一非常强大的Python功能的更好的了解。

关于delphi - Delphi中的拼写校正器代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com