2012-04-08 54 views
5

Tôi đang cố gắng viết mô-đun kiểm tra chính tả.Tìm kiếm các từ tương tự

Nó tải văn bản, tạo từ điển từ tệp 16 mb và sau đó kiểm tra xem từ tương ứng với từ trong từ điển (tương tự = khác nhau đến hai ký tự), nếu sau đó nó thay đổi thành dạng từ điển.

Ngay bây giờ tôi đang sử dụng một thuật toán Levenshtein Khỏang cách và chế biến một 50 từ thiết mất 3 phút ...

Tôi khá chắc chắn rằng phải có một giải pháp nhanh hơn. Profiler nói với tôi rằng ứng dụng của tôi dành hơn 80% thời gian của nó trong hàm Levenshtein Distance.

Có giải pháp/thuật toán nào tốt hơn không?

Dưới đây là thực hiện các phiên bản của thuật toán tôi sử dụng:

def levenshteinDistance(s1, s2): 
    l_s1 = len(s1) 
    l_s2 = len(s2) 
    d = [[a for a in genM(x, l_s2 + 1)] for x in xrange(l_s1 + 1)] 
    for i in xrange(1, l_s1 + 1): 
     for j in xrange(1, l_s2 + 1): 
      d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + decide_of_equality(s1[i - 1],s2[j - 1])) 
    return d[l_s1][l_s2] 
+0

Âm thanh giống như "Tự động sửa" hơn kiểm tra chính tả, vì trình kiểm tra chính tả thường tạo tùy chọn và cho phép người dùng chọn trong số đó. Autocorrect là khá rõ ràng là không thể làm tốt, một thực tế hiện nay hầu như được thừa nhận, ngay cả trên quảng cáo truyền hình. :-) –

+0

Nếu bạn giả định rằng chữ cái đầu tiên của từ luôn đúng, thì bạn chỉ có thể kiểm tra từ điển cho các từ bắt đầu bằng chữ cái đó. Nó sẽ giảm thời gian của bạn bởi nhiều hơn hoặc ít hơn một yếu tố hoặc 26 – Doboy

+1

Tôi không biết nhiều về python, nhưng chức năng khoảng cách của bạn sử dụng giải pháp lập trình động tiêu chuẩn. Đây là phiên bản của tôi trong C++: http://codereview.stackexchange.com/questions/10130/edit-distance-between-two-strings có thể bạn có thể phát hiện một số khác biệt. –

Trả lời

2

Tôi đã sử dụng người sửa lỗi chính tả Norvig, đã đề cập trong các ý kiến ​​và nó là tuyệt vời.

Tuy nhiên, đến vấn đề của bạn, bạn đã viết Thuật toán khoảng cách chỉnh sửa lập trình động. Thuật toán của bạn đủ điều kiện để trở thành một thuật toán song song dữ liệu. Trên một bộ nhớ chia sẻ, tức là trên một máy tính duy nhất nếu bạn có nhiều lõi, bạn có thể khai thác chúng. Bạn có biết cái gì gọi là map-reduce? Xin đừng nghĩ rằng phân phối và tất cả ngay bây giờ, chỉ cần xem xét một máy tính lõi tứ duy nhất và một bộ nhớ chia sẻ. Như một bước 1 bạn có thể phân vùng từ điển của bạn và phân bổ một phần cho mỗi chủ đề mà sẽ chạy khoảng cách chỉnh sửa trên một phần của từ điển (tương tự như bước bản đồ). Sau đó tất cả các chủ đề của bạn sẽ trả lại cho bạn tất cả các từ ở khoảng cách chỉnh sửa là 2 (tương tự như giảm bước). Bằng cách này, chương trình của bạn sẽ được hưởng lợi từ kiến ​​trúc đa lõi.

Một điều khác mà tôi có thể nghĩ là bên trong mã python của bạn viết thuật toán khoảng cách chỉnh sửa chuyên sâu cpu trong C tức là bằng cách viết phần mở rộng python.

+0

Thật không may là tôi không được phép sử dụng nhiều lõi, nhưng giải pháp của Norvig đã làm được điều đó. – Michal

0

Có thể vấn đề ở mức cao hơn. Khi một trình thông báo cho bạn biết rằng rất nhiều thời gian được sử dụng trong một hàm, có thể bạn đang gọi nó quá thường xuyên. Bạn có lẽ so sánh từng từ trong văn bản với từng từ trong từ điển không? Hãy thử nó theo cách khác xung quanh: cho các từ trong văn bản, trực tiếp tạo ra các từ khoảng cách < = 2 và kiểm tra xem chúng có trong từ điển hay không.

+0

Bạn nói đúng là đôi khi vấn đề nằm trong quá nhiều cuộc gọi, nhưng đó không phải là trường hợp của tôi. Tôi chỉ có thể sử dụng các từ trong từ điển, đó là lý do tại sao tôi không cần phải tạo từ mới mà thay vào đó tôi có thể sử dụng các từ trong từ điển có khoảng cách <= 2 từ từ tôi gặp phải. Nhưng bạn đã chỉ ra một số thứ tốt cho các trường hợp khác. – Michal

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