【问题标题】:A spell corrector code in Delphi?Delphi中的拼写校正器代码?
【发布时间】:2011-08-17 07:12:59
【问题描述】:

这个问题是讨论如何编写拼写校正器,而不是重复 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 解决方案,它根本不是为了竞争,尽管彼得在指导谷歌研究方面很有影响力。

[更新]

我被大卫的建议所启发,研究了彼得页面的理论和例程。完成了一个非常粗糙和低效的例程,与其他语言略有不同,我的是 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行,不包括记录检查时间的功能。行数可能不是马塞洛上面提到的衡量标准。这篇文章讨论了如何以不同的方式完成任务。 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功能(编辑距离2)。这将增加大约另外 12 行代码。彼得说编辑距离 2 将包括几乎所有的可能性。 “某事”将有 114,324 种可能性。我的函数将为它生成 102,727 种独特的可能性。当然,建议的词也会包括更多。

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

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

【问题讨论】:

  • 您希望我们在 Delphi 中实现它并告诉您有多少行以及性能如何?听起来更像是一场竞赛,而不是一个严肃的问题。无论如何,我们无法测量不同机器上的结果并将其与 Peter Norvig 的机器进行比较。 -1 至少在你解释你真正想知道的东西之前。
  • @daemon_x,我想知道如何在delphi中做到这一点。如何翻译 Peter 页面中的 Python 语法,例如“[(word[:i], word[i:]) for i in range(len(word) + 1)]”或“[a + c + b[1: ] for a, b in splits for c in letters if b]"。彼得列出任务的语言并不意味着竞争,而是表明不止一种语言可以做到这一点。我没有测试所有的语言版本。尽管某些语言的行数较少,但它们可能并不意味着更好的性能。
  • @user482742 - -1 已移除;将代码翻译成 Delphi 可能会很有趣,但这对 SO 来说不是一个好问题(任务)。
  • @daemon_x,谢谢。为了避免任何可能的厌恶和误解,我从 Peter 的页面编辑和删除了任务的语言和行数。
  • 也许您需要为您不理解的每一行创建单独的问题.. :)

标签: delphi


【解决方案1】:

这是一个 Python 列表推导式。它形成了分割和字母的笛卡尔积。

每个拆分项都是一个元组,它被解包为 a 和 b。字母表的每个项目都放入一个名为 c 的变量中。然后连接 3 个变量,假设它们是字符串。列表推导表达式的结果是一个包含 a + c + b 形式元素的列表,笛卡尔积中的每个项目都有一个元素。

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

res = []
for a, b in splits:
  for c in alphabets:
    res.append(a + c + b)

在 Delphi 中是这样的

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

我建议您阅读 Python list comprehensions 以更好地了解这个非常强大的 Python 功能。

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多