2013-09-04 98 views
6

Tôi có một bảng sản phẩm SQL Server và mỗi sản phẩm đều có mô tả công khai trên trang web của chúng tôi. Tôi muốn ngăn chặn hoặc ít nhất cảnh báo người dùng của chúng tôi khi nào, mô tả quá giống với mô tả của sản phẩm khác. Chiều dài mô tả của mỗi sản phẩm có thể rất khác nhau.SQL - Tương tự giữa hai chuỗi có độ dài khác nhau

Tôi muốn truy vấn cho các sản phẩm có mô tả bao gồm các đoạn văn bản/văn bản trùng lặp/tương tự nhau. tức là chuỗi A có một loạt các nội dung độc đáo, nhưng chia sẻ một tương tự/giống hệt đoạn w/chuỗi B. Tuy nhiên, tôi không chắc chắn tương tự thuật toán là tốt nhất để sử dụng:

  • Các Levenshtein distanceJaro-Winler distance thuật toán xuất hiện chỉ hoạt động tốt với các chuỗi ngắn.

  • Tôi không chắc chắn số longest common subsequence algorithm có tính đến sự khác biệt lớn rất tốt. nghĩa là nó dường như bỏ qua khoảng trống tiềm năng giữa hai ký tự, tìm ra bất kỳ chuỗi kết hợp tương tự nào.

Fuzzy hashing loại âm thanh gì tôi đang tìm kiếm, nhưng tôi không chỉ tìm kiếm nội dung trùng lặp w/khác biệt tinh tế. Tôi là cũng tìm kiếm nội dung trùng lặp với sự khác biệt tinh tế được tiêm trong khối văn bản duy nhất. Và tôi không có ý tưởng làm thế nào để thực hiện băm mờ trong SQL. SOUNDEX()DIFFERENCE() xuất hiện để sử dụng băm mờ, nhưng khá không chính xác cho trường hợp sử dụng của tôi.

Lý tưởng nhất là hàm SQL tương tự sẽ nhanh, nhưng tôi có thể lưu trữ các giá trị tương tự được lưu trong bộ nhớ cache trong một bảng khác và lên lịch công việc để thỉnh thoảng cập nhật.

Triển khai thuật toán/SQL (hoặc tích hợp CLR) tốt nhất để thực hiện điều này là gì?

+0

Tại sao bạn hạn chế bản thân thực hiện điều này trong SQL? –

+0

Vâng, tôi cho rằng nó không cần phải có trong SQL. Tuy nhiên, tôi giả sử một triển khai SQL thuần túy sẽ có hiệu suất cao hơn. Tôi có khả năng có thể sử dụng một hội nhập NET CLR như [thư viện tương tự này] (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into- mds /) ... nhưng tôi không có kinh nghiệm với SQL Server CLR hội nhập và tôi vẫn sẽ không biết những gì thuật toán để sử dụng. –

+0

Một điều bạn có thể thử là để lấy chuỗi và chỉ xem xét trường hợp của một số chữ cái, sau đó Levenshtein những chuỗi.Ví dụ: lấy một văn bản như "Lorem ipsum dolor sit amet" và chỉ xem xét các trường hợp của e và t. Chuỗi kết quả sẽ là etet, mà bạn có thể Levenshtein chống lại một chuỗi được lọc khác. Rõ ràng đòi hỏi một số điều chỉnh, nhưng hy vọng bạn sẽ có được ý tưởng. – kevmo314

Trả lời

2

Gần đây, tôi không phải tham gia tên nhóm theo kết hợp chuỗi mờ.
Tôi đã thử khoảng 40 thuật toán khác nhau, nhưng không có đủ tốt để làm điều này, mặc dù tên nhóm chỉ viết khác nhau bởi một số lỗi chính tả, thiếu khoảng trắng và thỉnh thoảng được thêm vào _mLF.

Vì vậy, nếu bạn cố gắng điều tương tự, tôi khuyên bạn nên dừng ngay bây giờ và gửi dữ liệu (trong trường hợp tệp Excel của tôi) cho người dùng để sửa, nơi nó thuộc về.

Nếu bạn thực sự chỉ quan tâm đến chuỗi so sánh, liên kết này có thể chỉ là những gì bạn cần:
http://anastasiosyal.com/POST/2009/01/11/18.ASPX

Tôi tìm thấy Jaro-Winkler chức năng để mang lại kết quả tốt nhất trong trường hợp của tôi, nhưng bạn có thể thử nghiệm cho chính mình.

+0

Vâng, lý tưởng là tôi muốn yêu cầu người dùng ngừng nhập văn bản trùng lặp. Nhưng một số sẽ tiếp tục làm điều đó anyway ... Tôi cần để có thể hồi tố phát hiện khi nội dung trùng lặp/tương tự. Bài viết đó chắc chắn sẽ giúp ích. –

+1

Tôi cũng đã tìm thấy thuật toán tìm kiếm mờ này có hiệu suất hợp lý: https://sites.google.com/site/sqlblindman/fuzzysearchalgorithm –