2008-09-08 49 views
44

Ở đây tại nơi làm việc, chúng ta thường cần phải tìm một chuỗi từ danh sách các chuỗi phù hợp nhất với một chuỗi đầu vào khác. Hiện tại, chúng tôi đang sử dụng thuật toán Needleman-Wunsch. Thuật toán thường trả về rất nhiều kết quả dương tính giả (nếu chúng tôi đặt số điểm tối thiểu quá thấp), đôi khi nó không tìm thấy kết quả phù hợp khi cần (khi điểm tối thiểu quá cao) và hầu hết các lần, chúng ta cần phải kiểm tra kết quả bằng tay. Chúng tôi nghĩ chúng ta nên thử các lựa chọn thay thế khác.Thuật toán đối sánh chuỗi gần đúng

Bạn có kinh nghiệm gì về thuật toán không? Bạn có biết cách các thuật toán so sánh với nhau không?

Tôi thực sự đánh giá cao một số lời khuyên.

PS: Chúng tôi đang viết mã bằng C#, nhưng bạn không nên quan tâm đến nó - tôi đang hỏi về các thuật toán nói chung.


Ồ, tôi xin lỗi tôi quên đề cập đến điều đó.

Không, chúng tôi không sử dụng nó để khớp với dữ liệu trùng lặp. Chúng tôi có một danh sách các chuỗi mà chúng tôi đang tìm kiếm - chúng tôi gọi đó là danh sách tìm kiếm. Và sau đó chúng tôi cần xử lý văn bản từ nhiều nguồn khác nhau (như nguồn cấp dữ liệu RSS, trang web, diễn đàn, v.v.) - chúng tôi trích xuất các phần của các văn bản đó (có toàn bộ quy tắc cho điều đó, nhưng điều đó không liên quan) và chúng tôi cần khớp những người chống lại danh sách tìm kiếm. Nếu chuỗi khớp với một trong các chuỗi trong danh sách tìm kiếm - chúng ta cần thực hiện thêm một số thao tác (điều này cũng không liên quan).

Chúng tôi không thể thực hiện việc so sánh bình thường, bởi vì các dây được chiết xuất từ ​​các nguồn bên ngoài, hầu hết các lần, bao gồm một số lời thêm, vv

Dù sao, nó không phải là để phát hiện trùng lặp.

+1

Bạn có khớp các chuỗi 'thực' (tức là tiếng Anh) hoặc tin sinh học không? Nếu chuỗi thực, bạn đang sử dụng ma trận thay thế của bạn? –

+0

Các câu hỏi tương tự tại đây http://stackoverflow.com/questions/31494/how-to-detect-duplicate-data và tại đây http://stackoverflow.com/questions/42013/levenshtein-distance-based-methods-vs-soundex Những người khác có thể được tìm thấy thông qua các thẻ và cụm từ tìm kiếm có liên quan. Tuy nhiên, bạn không chỉ định chính xác * tại sao * bạn cần phải khớp các chuỗi theo cách này - bạn có đang kiểm tra dữ liệu trùng lặp không? –

Trả lời

32

OK, Needleman-Wunsch (NW) là bộ căn chỉnh đầu cuối ("toàn cầu" cổ điển) từ tài liệu tin sinh học. Nó đã được lâu trước đây có sẵn như là "sắp xếp" và "align0" trong gói FASTA. Sự khác biệt là phiên bản "0" không thiên vị về việc tránh kết thúc, điều này thường cho phép các trận đấu nội bộ chất lượng cao dễ dàng hơn. Smith-Waterman, tôi nghi ngờ bạn biết, là một bộ định vị cục bộ và là cơ sở ban đầu của BLAST. FASTA có bộ định vị cục bộ riêng của nó cũng hơi khác một chút. Tất cả những phương pháp này đều là phương pháp heuristic để ước tính khoảng cách Levenshtein có liên quan đến số liệu cho từng cặp nhân vật (trong tin sinh học, thường được đưa ra bởi Dayhoff/"PAM", Henikoff & Henikoff, hoặc các ma trận khác và thường được thay thế bằng một cái gì đó đơn giản hơn và phản xạ hợp lý hơn thay thế hình thái từ ngôn ngữ khi áp dụng cho ngôn ngữ tự nhiên). Chúng ta không phải là quý giá về nhãn hiệu: khoảng cách Levenshtein, như được tham chiếu trong thực tế ít nhất, về cơ bản là chỉnh sửa khoảng cách và bạn phải ước lượng nó. trường hợp: nước được sâu nhanh chóng ở đó, và do đó chúng tôi có phương pháp heuristic lâu dài và tốt danh tiếng.

Bây giờ là vấn đề của riêng bạn: vài năm trước, tôi phải kiểm tra độ chính xác của DNA ngắn đối với chuỗi tham chiếu được xác định là chính xác và tôi đã đưa ra thứ gọi là "sắp xếp neo".

Ý tưởng là đặt chuỗi tham chiếu của bạn và "phân tích" chuỗi bằng cách tìm tất cả các vị trí có chuỗi con N ký tự nhất định xuất hiện. Chọn N sao cho bảng bạn xây không phải là quá lớn mà còn sao cho bề mặt của độ dài N không quá phổ biến. Đối với các bảng chữ cái nhỏ như cơ sở DNA, có thể tìm ra một băm hoàn hảo trên các chuỗi ký tự N và tạo một bảng và chuỗi các kết quả phù hợp trong một danh sách liên kết từ mỗi thùng. Các mục trong danh sách phải xác định chuỗi và vị trí bắt đầu của chuỗi con ánh xạ tới thùng chứa trong danh sách chúng xuất hiện. Đây là "neo" trong danh sách các chuỗi được tìm kiếm tại đó một tuyến NW có thể hữu ích.

Khi xử lý chuỗi truy vấn, bạn lấy N ký tự bắt đầu tại một số giá trị K trong chuỗi truy vấn, băm chúng, tìm thùng của chúng và nếu danh sách cho thùng đó không trống thì bạn sẽ xem tất cả các bản ghi danh sách và thực hiện sắp xếp giữa chuỗi truy vấn và chuỗi tìm kiếm được tham chiếu trong bản ghi. Khi thực hiện các sắp xếp này, bạn xếp hàng chuỗi truy vấn và chuỗi tìm kiếm tại neo và trích xuất chuỗi con của chuỗi tìm kiếm có cùng độ dài với chuỗi truy vấn và có chứa ký tự đó ở cùng độ lệch, K.

Nếu bạn chọn độ dài neo đủ dài N và tập hợp giá trị bù đắp K hợp lý (chúng có thể được trải rộng trên chuỗi truy vấn hoặc bị giới hạn ở độ lệch thấp), bạn sẽ nhận được một tập hợp con có thể sắp xếp và thường sẽ nhận được người chiến thắng rõ ràng hơn. Thông thường, bạn sẽ muốn sử dụng align align-giống như aligned giống như NW aligner.

Phương pháp này cố gắng tăng NW một chút bằng cách hạn chế đầu vào và điều này có hiệu suất vì bạn sắp xếp ít hơn và chúng thường xuyên hơn giữa các chuỗi tương tự. Một điều tốt nữa để làm với NW aligner của bạn là cho phép nó từ bỏ sau khi một số tiền hoặc chiều dài của gapping xảy ra để cắt giảm chi phí, đặc biệt là nếu bạn biết bạn sẽ không nhìn thấy hoặc quan tâm đến các trận đấu chất lượng middling. Cuối cùng, phương pháp này được sử dụng trên một hệ thống có bảng chữ cái nhỏ, với K bị giới hạn ở 100 vị trí đầu tiên trong chuỗi truy vấn và chuỗi tìm kiếm lớn hơn nhiều so với truy vấn (DNA đọc khoảng 1000 căn cứ và chuỗi tìm kiếm được đặt theo thứ tự 10000, vì vậy tôi đang tìm kiếm các kết quả chuỗi con gần đúng được biện minh bởi ước tính khoảng cách chỉnh sửa cụ thể). Thích nghi phương pháp này với ngôn ngữ tự nhiên sẽ yêu cầu một số suy nghĩ cẩn thận: bạn bị mất kích thước bảng chữ cái nhưng bạn đạt được nếu chuỗi truy vấn của bạn và chuỗi tìm kiếm có độ dài tương tự.

Dù bằng cách nào, cho phép nhiều hơn một neo từ các đầu khác nhau của chuỗi truy vấn được sử dụng đồng thời có thể hữu ích trong việc lọc thêm dữ liệu được cung cấp cho NW. Nếu bạn làm điều này, hãy chuẩn bị để có thể gửi các chuỗi chồng lên nhau chứa một trong hai neo để căn chỉnh và sau đó điều chỉnh các sắp xếp ... hoặc có thể sửa đổi thêm NW để nhấn mạnh việc giữ neo của bạn hầu như nguyên vẹn trong một liên kết bằng cách sửa đổi hình phạt trong thực hiện thuật toán.

Hy vọng điều này hữu ích hoặc ít nhất là thú vị.

+1

Điều này thực sự rất thú vị. – Paulius

4

Chúng tôi đang sử dụng phương pháp Levenshtein distance để kiểm tra các khách hàng trùng lặp trong cơ sở dữ liệu của chúng tôi. Nó hoạt động khá tốt.

6

Liên quan đến khoảng cách Levenstein: bạn có thể muốn bình thường hóa nó bằng cách chia kết quả với độ dài của chuỗi dài hơn, để bạn luôn nhận được số từ 0 đến 1 và bạn có thể so sánh khoảng cách của cặp các chuỗi theo cách có ý nghĩa (biểu thức L (A, B)> L (A, C) - ví dụ - là vô nghĩa trừ khi bạn chuẩn hóa khoảng cách).

5

Thuật toán thay thế để xem là agrep (Wikipedia entry on agrep), FASTA and BLAST thuật toán khớp nối chuỗi sinh học. Đây là những trường hợp đặc biệt của approximate string matching, cũng trong số Stony Brook algorithm repositry. Nếu bạn có thể chỉ định cách các chuỗi khác nhau, bạn có thể tập trung vào một thuật toán phù hợp. Ví dụ: aspell sử dụng một số biến thể của khoảng cách "âm thanh" (âm thanh-metaphone) kết hợp với khoảng cách "bàn phím" để chứa các người đánh giá xấu và máy in xấu.

1

Sử dụng FM Index với backtracking, tương tự như một trong Bowtie Aligner mờ

1

Để giảm thiểu sai lệch do biến thể hoặc lỗi chính tả nhỏ, tôi đã sử dụng các thuật toán Metaphone, sau đó khoảng cách levenshtein (quy mô đến 0 -100 dưới dạng phần trăm phù hợp) trên mã hóa Metaphone để đo lường sự gần gũi. Điều đó dường như đã hoạt động khá tốt.

0

Để mở rộng câu trả lời của Cd-MaN, có vẻ như bạn đang gặp phải sự cố bình thường hóa. Nó không phải là rõ ràng làm thế nào để xử lý điểm số giữa các sắp xếp với độ dài khác nhau.

Với những gì bạn quan tâm, bạn có thể muốn nhận được giá trị p cho căn chỉnh của mình. Nếu bạn đang sử dụng Needleman-Wunsch, bạn có thể nhận được các giá trị p này bằng cách sử dụng số liệu thống kê Karlin-Altschul http://www.ncbi.nlm.nih.gov/BLAST/tutorial/Altschul-1.html

BLAST sẽ có thể căn chỉnh và đánh giá chúng bằng cách sử dụng các thống kê này. Nếu bạn lo lắng về tốc độ, đây sẽ là một công cụ tốt để sử dụng.

Một tùy chọn khác là sử dụng HMMER. HMMER sử dụng các mô hình Profile Markov để sắp xếp các chuỗi. Cá nhân, tôi nghĩ rằng đây là một cách tiếp cận mạnh mẽ hơn vì nó cũng cung cấp thông tin vị trí. http://hmmer.janelia.org/

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