2011-08-17 36 views
8

Câu hỏi này là để thảo luận cách viết mã hiệu chỉnh chính tả và không trùng lặp với thành phần Delphi Spell Checker.Mã sửa lỗi chính tả trong Delphi?

Hai năm trước, tôi đã tìm và sử dụng mã hiệu chỉnh chính tả bằng Peter Norvig at his website bằng Python. Nhưng hiệu suất dường như không cao. Khá thú vị, nhiều ngôn ngữ thực hiện cùng một tác vụ đã được thêm vào danh sách trang web của anh gần đây.

Một số dòng trong trang Phêrô bao gồm cú pháp như sau:

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

Làm thế nào để chuyển nó thành delphi?

Tôi quan tâm đến cách chuyên gia Delphi tại SO sẽ sử dụng cùng một lý thuyết và thực hiện nhiệm vụ tương tự với một số dòng phù hợp và có thể tầm thường hoặc hiệu suất tốt hơn. Đây không phải là để downvote bất kỳ ngôn ngữ nhưng để tìm hiểu để so sánh cách họ thực hiện nhiệm vụ khác nhau.

Cảm ơn bạn rất nhiều trước.

[Chỉnh sửa]

Tôi sẽ trích dẫn Marcelo Toledo người góp phần phiên bản C, cho biết "... Trong khi mục đích của bài viết này [C version] là để hiển thị các thuật toán, không phải để làm nổi bật Python ..." . Mặc dù phiên bản C của anh là với dòng thứ hai, theo bài viết của anh, phiên bản của anh có hiệu suất cao khi tập tin từ điển rất lớn. Vì vậy, câu hỏi này không làm nổi bật bất kỳ ngôn ngữ nào nhưng yêu cầu giải pháp delphi và nó không hề có ý định cạnh tranh, mặc dù Peter có ảnh hưởng trong việc chỉ đạo Nghiên cứu của Google.

[Cập nhật]

Tôi đã giác ngộ theo gợi ý của David và nghiên cứu lý thuyết và thói quen của trang Phêrô. Một thói quen rất thô sơ và không hiệu quả được thực hiện, hơi khác với các ngôn ngữ khác, của tôi là GUI. Tôi là một người mới bắt đầu và người học ở Delphi, tôi không dám gửi mã hoàn chỉnh của tôi (nó được viết kém). Tôi sẽ phác thảo ý tưởng của tôi về cách tôi đã làm nó. Bình luận của bạn được chào đón để các thói quen sẽ được cải thiện.

Phần cứng và phần mềm của tôi cũ. Điều này là đủ cho công việc của tôi (chuyên môn của tôi không có trong máy tính hoặc chương trình liên quan)

AMD Athlon Dual Core Processor 
2.01 Ghz, 480 Memory 
Windows XP SP2 
IDE Delphi 7.0 

Đây là ảnh chụp và ghi lại thời gian xử lý từ 'chính xác'. Tôi đã thử Gettickcount, Tdatetime và Queryperformancecounter để theo dõi thời gian chính xác cho từ, nhưng gettickcount và Tdatetime sẽ xuất ra o ms cho mỗi lần kiểm tra, vì vậy tôi phải sử dụng Queryperformancecounter. Có lẽ có nhiều cách khác để làm điều đó một cách chính xác hơn.

Tổng số dòng là 72, không bao gồm chức năng ghi lại thời gian kiểm tra. Số lượng các dòng có thể không được yardstick như đã đề cập ở trên bởi Marcelo. Bài đăng sẽ thảo luận cách thực hiện tác vụ khác nhau. Các chuyên gia Delphi tại SO tất nhiên sẽ sử dụng các dòng tối thiểu để làm điều đó với hiệu suất tốt nhất.

Spell Checker

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; 

Dường bởi Tfilestream nó có thể làm tăng tải 1-2 giây. Tôi đã thử sử dụng phương thức CreateFileMapping nhưng không thành công và có vẻ phức tạp một chút. Có lẽ có nhiều cách khác để tải tập tin cực nhanh. Bởi vì big.txt này sẽ không lớn xem xét tính khả dụng của kho văn bản, nên có cách hiệu quả hơn để tải tệp lớn hơn và lớn hơn.

Một điểm khác là Delphi 7.0 không có biểu thức chính quy được tích hợp sẵn. Tôi có một cái nhìn tại các ngôn ngữ khác mà làm kiểm tra chính tả tại trang của Perter, họ chủ yếu là trực tiếp gọi biểu thức chính quy được xây dựng trong của họ. Tất nhiên, chuyên gia thực sự không cần bất kỳ lớp học hoặc thư viện tích hợp nào và có thể tự xây dựng. Đối với người mới bắt đầu, một số lớp học hoặc thư viện là tiện lợi.

Nhận xét của bạn được hoan nghênh.

[Cập nhật]

tôi tiếp tục nghiên cứu và chức năng edits2 thêm bao gồm (chỉnh sửa khoảng cách 2). Điều này sẽ tăng thêm 12 dòng mã khác. Peter cho biết khoảng cách chỉnh sửa 2 sẽ bao gồm gần như tất cả các khả năng. 'cái gì đó' sẽ có 114,324 khả năng. Chức năng của tôi sẽ tạo ra 102,727 khả năng UNIQUE cho nó. Tất nhiên, các từ được đề xuất cũng sẽ bao gồm nhiều hơn.

Nếu có chỉnh sửa2, thời gian phản hồi để hiệu chỉnh rõ ràng là trì hoãn vì nó làm tăng dữ liệu khoảng 200 lần. Nhưng tôi tìm thấy một số sửa chữa được đề xuất rõ ràng là không có khả năng như một người đánh máy sẽ không gõ một từ lỗi sẽ nằm trong danh sách từ được sửa chữa dài. Vì vậy, chỉnh sửa khoảng cách 1 sẽ được cung cấp tốt hơn rằng tệp big.txt đủ lớn để bao gồm các từ chính xác hơn.

Dưới đây là ảnh chụp nhanh các chỉnh sửa theo dõi 2 thời gian chính xác.

enter image description here

+2

Bạn có muốn chúng tôi triển khai nó ở Delphi và cho bạn biết có bao nhiêu dòng và hiệu suất hoạt động như thế nào? Âm thanh giống như một cuộc thi hơn là một câu hỏi nghiêm túc. Dù sao chúng tôi không thể đo lường kết quả trên các máy khác nhau và so sánh nó với Peter Norvig. -1 ít nhất cho đến khi bạn giải thích những gì bạn thực sự muốn biết. –

+0

@daemon_x, tôi muốn biết làm thế nào để làm điều đó trong delphi. Cách dịch cú pháp python trong trang của Peter như "[(từ [: i], từ [i:]) cho i trong phạm vi (len (từ) + 1)]" hoặc "[a + c + b [1: ] cho a, b chia tách cho c trong bảng chữ cái nếu b] ". Rằng Peter liệt kê các ngôn ngữ cho nhiệm vụ không có nghĩa là cạnh tranh nhưng đề nghị rằng nhiều hơn một ngôn ngữ có thể làm điều đó. Tôi chưa kiểm tra tất cả các phiên bản ngôn ngữ. Mặc dù một số ngôn ngữ được gắn nhãn với ít dòng hơn, nhưng chúng có thể không có nghĩa là hiệu suất tốt hơn. – Dylan

+0

@ user482742 - -1 bị xóa; nó có thể rất thú vị để dịch mã sang Delphi, nhưng nó không phải là một câu hỏi hay (nhiệm vụ) cho SO. –

Trả lời

8

Đây là danh sách Python hiểu. Nó tạo thành sản phẩm Descartes của phân tách và bảng chữ cái.

Từng mục chia tách là một bộ được giải nén thành a và b. Mỗi mục của bảng chữ cái được đặt vào một biến gọi là c. Sau đó, 3 biến được nối, giả sử rằng chúng là các chuỗi. Kết quả của biểu thức đọc danh sách là danh sách chứa các phần tử của biểu mẫu a + c + b, một phần tử cho mỗi mục trong sản phẩm Descartes.

Trong Python nó có thể được viết tương đương như

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

Trong Delphi nó sẽ là

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

tôi đề nghị bạn đọc lên trên Python list comprehensions để có được một sự hiểu biết tốt hơn về tính năng Python rất mạnh mẽ này.

Các vấn đề liên quan