2008-09-03 23 views
106

thể trùng lặp:
How does the Google “Did you mean?” Algorithm work?Làm cách nào để bạn triển khai "Ý của bạn là"?

Giả sử bạn có một hệ thống tìm kiếm đã có trong trang web của bạn. Làm cách nào để bạn có thể triển khai "Ý của bạn là: <spell_checked_word>" như Google có trong một số search queries?

+0

@pek: Tôi đã có suy nghĩ tương tự cách đây một thời gian ... Bạn có nghĩ đến việc sử dụng trình quét HTML và sử dụng Google làm nguồn sửa chữa không? –

+0

Xem http://stackoverflow.com/questions/3763640/where-can-i-learn-more-about-the-google-search-did-you-mean-algorithm – John

Trả lời

81

Thực ra những gì Google làm là rất ít tầm thường và cũng có tính phản trực giác đầu tiên. Họ không làm bất cứ điều gì như kiểm tra đối với từ điển, nhưng thay vào đó họ sử dụng thống kê để xác định các truy vấn "tương tự" trả lại nhiều kết quả hơn truy vấn của bạn, thuật toán chính xác là tất nhiên không được biết.

Có các vấn đề phụ khác nhau để giải quyết ở đây, làm cơ sở cơ bản cho tất cả các số liệu thống kê xử lý ngôn ngữ tự nhiên có liên quan, có một cuốn sách phải có: Foundation of Statistical Natural Language Processing.

Cụ thể để giải quyết vấn đề tương tự về từ/truy vấn Tôi đã có kết quả tốt với việc sử dụng Edit Distance, một thước đo toán học về sự giống nhau về chuỗi hoạt động đáng ngạc nhiên. Tôi đã từng sử dụng Levenshtein nhưng những người khác có thể đáng xem xét.

Soundex - theo kinh nghiệm của tôi - thật đáng sợ.

Thực sự lưu trữ và tìm kiếm một từ điển lớn các từ sai chính tả và có lần truy xuất phụ thứ hai là không tầm thường, đặt cược tốt nhất của bạn là sử dụng các công cụ lập chỉ mục và truy xuất văn bản đầy đủ hiện tại (tức là không phải cơ sở dữ liệu của bạn) mà Lucene hiện là một trong những tốt nhất và tình cờ chuyển đến nhiều nền tảng nhiều.

6

Tôi khuyên bạn nên xem SOUNDEX để tìm các từ tương tự trong cơ sở dữ liệu của bạn.

Bạn cũng có thể truy cập từ điển riêng của google bằng cách sử dụng Google API spelling suggestion request.

+1

+1 cho liên kết tới API Google dường như chính xác những gì người hỏi đang tìm kiếm, ngay cả khi câu trả lời được chọn có chiều sâu hơn và trả lời 'lý do' và 'cách' thực hiện của Google. – dimo414

0

Soundex là tốt cho trận đấu ngữ âm, nhưng hoạt động tốt nhất với tên các dân tộc (nó đã được ban đầu được phát triển cho các dữ liệu điều tra dân số)

Ngoài ra kiểm tra Full-Text-Indexing, cú pháp là khác nhau từ Google logic, nhưng nó rất nhanh và có thể xử lý các yếu tố ngôn ngữ tương tự.

+0

một trong những điều xấu của soundex là nó quá trung tâm tiếng Anh – Javier

+0

Nó được phát triển để Anglisize tên, do đó, Smith và Schmidt là giả sử để phù hợp với nó. Metaphone là tốt hơn nhưng có một vấn đề tương tự. Bất kỳ thuật toán ngữ âm nào sẽ phụ thuộc vào ngôn ngữ. – Keith

0

Soundex và "Porter stemming" (soundex là tầm thường, không chắc chắn về porter xuất phát).

+1

Thông tin (bao gồm cả việc triển khai 19 ngôn ngữ mã hóa khác nhau) trên Porter có thể tìm thấy tại http://tartarus.org/~martin/PorterStemmer/index.html – msanders

13

Kiểm tra this bài viết trên wikipedia về khoảng cách Levenshtein. Hãy chắc chắn rằng bạn có một cái nhìn tốt tại các cải tiến có thể.

+0

Cách tính toán khoảng cách chỉnh sửa phổ biến nhất. Một cách phổ biến để làm điều này là thuật toán Wagner-Fischer. – Giuliano

2

Nếu bạn có bản dịch cụ thể theo ngành, bạn có thể sẽ cần từ điển. Ví dụ, tôi làm việc trong ngành trang sức và đã viết tắt trong các mô tả của chúng tôi như kt - karat, thứ tròn, cwt - carat trọng lượng ... Endeca (công cụ tìm kiếm tại công việc đó) có một từ điển sẽ dịch từ phổ biến lỗi chính tả, nhưng nó yêu cầu can thiệp thủ công.

4

Tôi nghĩ điều này tùy thuộc vào trang web của bạn lớn đến mức nào. Trên Intranet cục bộ của chúng tôi được sử dụng bởi khoảng 500 thành viên của nhân viên, tôi chỉ đơn giản là nhìn vào các cụm từ tìm kiếm trả lại kết quả bằng không và nhập cụm từ tìm kiếm đó bằng cụm từ tìm kiếm mới được đề xuất vào bảng SQL.

Tôi gọi điện trên bảng đó nếu không có kết quả tìm kiếm nào được trả lại, tuy nhiên, điều này chỉ hoạt động nếu trang web tương đối nhỏ và tôi chỉ làm điều đó cho cụm từ tìm kiếm phổ biến nhất.

Bạn cũng có thể muốn xem xét câu trả lời của tôi cho một câu hỏi tương tự:

6

Tôi tin rằng Google ghi lại tất cả các truy vấn và xác định khi có ai đó sửa lỗi chính tả. Điều chỉnh này sau đó có thể được đề xuất khi những người khác cung cấp cùng một truy vấn đầu tiên. Điều này sẽ làm việc cho bất kỳ ngôn ngữ nào, trên thực tế bất kỳ chuỗi ký tự nào.

+0

Họ thực sự. Điều này giúp họ học từ mới dễ dàng - họ có sự giúp đỡ của hàng triệu người. –

+2

Vâng, đây thực sự là câu trả lời đúng. Theo cuốn sách "Trong Plex", Google tìm kiếm các trường hợp ai đó tìm kiếm nội dung nào đó, nhận kết quả, sau đó điều chỉnh ngay lập tức cụm từ tìm kiếm của họ một chút. –

33

Tiến sĩ Norvig của Google đã phác thảo cách hoạt động của nó; ông thậm chí đưa ra một 20ish thực hiện dòng Python:

http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

http://www.norvig.com/spell-correct.html

Tiến sĩ Norvig cũng thảo luận về các "cậu có nghĩa là" trong this excellent talk. Tiến sĩ Norvig là người đứng đầu nghiên cứu tại Google - khi được hỏi "ý của bạn là" được thực hiện, câu trả lời của anh là authoritive.

Vì vậy, kiểm tra lỗi chính tả của nó, có lẽ với từ điển động được tạo từ các tìm kiếm khác hoặc thậm chí các cụm từ internet thực tế và như vậy. Nhưng đó vẫn là kiểm tra lỗi chính tả.

SOUNDEX và các dự đoán khác không có giao diện, mọi người!

+4

Tiến sĩ Norvig cung cấp một ví dụ về đồ chơi của khái niệm; nó không đủ chính xác để cung cấp 'ý của bạn' cho web.Ví dụ: "barak" không đưa ra đề xuất; "Barak obama" (vì họ biết "barack" thường xảy ra với obama, và có thể suy ra khả năng sửa lỗi – SquareCog

+2

không khó để kiểm tra chính tả đồ chơi của mình với một thứ gì đó xử lý ví dụ của bạn và hoạt động tốt. Điều cần ghi nhớ là anh ta đang hiển thị một trình kiểm tra chính tả, nhưng nó khác biệt nhưng khác biệt đáng kể so với truy vấn suggester.Chỉnh sửa nó với các truy vấn trước đó thay vì văn bản tiếng anh là một nơi tốt để bắt đầu – jshen

+0

Chắc chắn hơn nó chỉ là kiểm tra chính tả. Đối với một điều, tôi đã nhìn thấy trường hợp mà không phải là điều tôi đã gõ hoặc thay thế được đề xuất là "từ điển" –

0

Có điều gì đó gọi là aspell có thể giúp: http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

Có một viên ngọc ruby ​​cho nó, nhưng tôi không biết làm thế nào để nói chuyện với nó từ python http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html

Dưới đây là một trích dẫn từ ruby thực hiện

Cách sử dụng

Aspell phép bạn kiểm tra từ và đề nghị Corre ctions. Ví dụ:

string = "my haert wil go on" 

    string.gsub(/[\w\']+/) do |word| 
    if !speller.check(word) 
     # word is wrong 
     puts "Possible correction for #{word}:" 
     puts speller.suggest(word).first 
    end 
    end 

đầu ra này:

chỉnh có thể cho haert: tim chỉnh có thể cho wil: Will

0

Thực hiện sửa chính tả cho công cụ tìm kiếm trong một cách hiệu quả không phải là tầm thường (bạn không thể tính toán khoảng cách chỉnh sửa/levenshtein cho mọi từ có thể). Giải pháp dựa trên chỉ mục k-gram được mô tả trong Introduction to Information Retrieval (toàn văn có sẵn trực tuyến).

12

Tôi rất ngạc nhiên khi ai đó đã hỏi cách tạo hệ thống đề xuất chính tả hiện đại cho công cụ tìm kiếm. Tôi đã làm việc về chủ đề này trong hơn một năm cho một công ty công cụ tìm kiếm và tôi có thể trỏ đến thông tin về miền công cộng về chủ đề này.

Như đã đề cập trong một bài trước, Google (và Microsoft và Yahoo!) không sử dụng bất kỳ từ điển được xác định trước hoặc họ không sử dụng đám của các nhà ngôn ngữ học suy nghĩ về lỗi chính tả có thể có của các truy vấn. Điều đó sẽ là không thể do quy mô của vấn đề mà còn bởi vì nó không phải là rõ ràng rằng mọi người thực sự có thể xác định chính xác khi nào và nếu một truy vấn sai chính tả.

Thay vào đó, có một nguyên tắc đơn giản và khá hiệu quả cũng hợp lệ cho tất cả các ngôn ngữ châu Âu. Nhận tất cả truy vấn duy nhất trên nhật ký tìm kiếm của bạn, tính toán khoảng cách chỉnh sửa giữa tất cả các cặp truy vấn, giả sử truy vấn tham chiếu là truy vấn có số lượng cao nhất.

Thuật toán đơn giản này sẽ hoạt động tốt cho nhiều loại truy vấn. Nếu bạn muốn đưa nó lên cấp độ tiếp theo thì tôi đề nghị bạn đọc bài báo của Microsoft Research về chủ đề đó. Bạn có thể tìm thấy nó here

Bài báo có phần giới thiệu tuyệt vời nhưng sau đó bạn sẽ cần phải am hiểu về các khái niệm như Mô hình Markov ẩn.

0

U có thể sử dụng ngram cho comparisment: http://en.wikipedia.org/wiki/N-gram

Sử dụng mô-đun python ngram: http://packages.python.org/ngram/index.html

import ngram 

G2 = ngram.NGram([ "iis7 configure ftp 7.5", 
        "ubunto configre 8.5", 
        "mac configure ftp"]) 

print "String", "\t", "Similarity" 
for i in G2.search("iis7 configurftp 7.5", threshold=0.1): 
    print i[1], "\t", i[0] 

U nhận được:

>>> 
String Similarity 
0.76 "iis7 configure ftp 7.5"  
0.24 "mac configure ftp" 
0.19 "ubunto configre 8.5" 
Các vấn đề liên quan