Cơ sở dữ liệu khái niệm tìm kiếm mờ


13

Tôi đã nghĩ về điều này, và đã cố gắng đưa ra các giải pháp về cách làm mờ tìm kiếm cơ sở dữ liệu, ví dụ như người dùng gõ một lỗi chính tả. Bất kỳ vấn đề rõ ràng với logic đằng sau này? Nó sẽ làm việc và nó đã được thực hiện trước đây?

Bảng của chúng tôi, chúng tôi muốn tìm kiếm:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Vì vậy, chúng tôi lưu trữ cơ thể văn bản thô để hiển thị vật lý. Hai cột khác được sử dụng cho các tìm kiếm được tính toán trước theo cách sau:

Soundex

Phần thân được chia thành các từ và được dịch thành phiên bản soundex. IE, kết quả có thể là một cái gì đó như:

H252 B54 C23 E33... etc

Vì vậy, ai đó có thể nhập 'khủng long' và cơ thể bài viết đọc 'khủng long' cả hai đều đánh giá B26. Sau đó chúng tôi chạy một lượt THÍCH trên giá trị soundex của cụm từ tìm kiếm.

Mã nhân vật

Đưa ra một ánh xạ ký tự ánh xạ các ký tự thành số nguyên tố, IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Nếu người dùng có ý định nhập 'xin chào' nhưng họ đã chuyển hai hoặc nhiều ký tự xung quanh, ví dụ 'hlelo', họ sẽ đánh giá cùng một số. Chia phần thô thành các từ, nguyên tố mã hóa từng từ và lưu trữ trong cơ sở dữ liệu cung cấp cho bạn một trường giống như:

330 6825 330 1050... etc

Sau đó chúng ta có thể thích tìm kiếm trên giá trị này để phù hợp với sương mù.

Những lợi ích

  • Typose được bảo vệ chống lại
  • Phiên âm không đúng chính tả được bảo vệ chống lại
  • Nói tiếng Anh không phải tiếng mẹ đẻ
  • Sẽ hoạt động ở bất kỳ ngôn ngữ nào (nơi soundex hoạt động)

Nhận xét và suy nghĩ? Một loại tìm kiếm nhiều lớp. Tất nhiên bạn có thể trả về các giá trị trọng số để làm cho nó thậm chí tốt hơn (IE một kết hợp thân văn bản bằng chữ có giá trị hơn), nhưng đây có phải là một giải pháp tốt cho lỗi chính tả và người nói tiếng Anh không phải là người bản ngữ thực hiện tìm kiếm?


Sẽ rất thú vị khi xem cách so sánh này với Trigram Search.
Giàu

Tôi rất thích có một cái gì đó như thế này cho wordpress ...
Kit Menke

Việc sử dụng các số nguyên tố cho chức năng băm của bạn có thể không có bất kỳ xung đột từ nào không bao gồm các phương thức giống hệt nhau không? Dường như có thể có một từ dài có nhiều chữ cái có giá trị thấp được băm với cùng giá trị như một từ ngắn với một vài chữ cái có giá trị cao, nhưng tôi không biết nhiều về lý thuyết số có lẽ nó đã được chứng minh bằng cách này hay cách khác ...
glenatron

1
@Glen Afaik nhân các số nguyên tố với nhau luôn tạo ra một số duy nhất. Các đảo chữ cái sẽ va chạm với nhau nhưng thật ra có bao nhiêu vấn đề, về cơ bản đó là vấn đề cần tìm đảo chữ một cách nhanh chóng.
Tom

@Glen: Xem định lý nhân tố duy nhất cho tính duy nhất.
Steven Evers

Câu trả lời:


2

Có một số thuật toán tìm kiếm khác. Smith-Waterman là một trong những người tốt hơn cho văn bản của con người, trong khi BLAST (cho đến nay) là tốt nhất để tìm kiếm chuỗi DNA. Khi bạn được trình bày văn bản với các lỗi chính tả khác nhau như hlepthay vì help, thì bạn đang tìm khoảng cách chỉnh sửa tối thiểu .

Để thư viện triển khai một số chức năng này trong CLR trong SQL Server 2005 (và sau này), hãy xem SimMetrics của dự án giả mạo nguồn . Bài đăng trên blog về SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex được phát triển vì sự khác biệt chính giữa các biến thể lời nói trong khu vực hầu như chỉ có ở nguyên âm - đó là lý do tại sao nó ném nguyên âm ra. Nó không tốt trong việc đối phó với các chữ cái chuyển.


2

Apache Solr, hỗ trợ từ đồng nghĩa và sửa lỗi chính tả - mặc dù nó vẫn hơi thô xung quanh các cạnh.

Tìm kiếm mờ có thể được thực hiện bằng Ngrams,

Porter Rootmer: http://tartarus.org/~martin/PorterStemmer/

và cơ sở dữ liệu ngôn ngữ như http://wordnet.princeton.edu/

... nhưng các dự án như Xapian và Solr xử lý phần lớn việc này cho bạn.

Nếu bạn muốn xây dựng công cụ phân tích / tìm kiếm thuật ngữ tìm kiếm từ riêng của mình, tôi khuyên bạn nên đưa mã thông báo hoặc thuật ngữ bạn tạo vào cơ sở dữ liệu hiện có được thiết kế để thực hiện tìm kiếm ngôn ngữ.


1

Tôi đã làm một cái gì đó tương tự một lúc trước cho các địa chỉ sẽ kiểm tra xem sẽ cần bao nhiêu thay đổi để chuyển đổi một chuỗi thành một chuỗi khác và trả về một giá trị số từ 0 đến 1 về mức độ trùng khớp của hai chuỗi.

Nó hoạt động rất tốt vì nó sẽ trả lại giá trị cao cho các mặt hàng như N / North, St / Street, EastMain / MainEast, v.v. Ý tưởng xuất phát từ liên kết CodeProject này


Là mã bạn đã viết cho địa chỉ phù hợp với nguồn mở?
Điều này diễn ra vào

@Thismatters Tôi không có quyền truy cập vào mã, nhưng liên kết trong câu trả lời của tôi sẽ cung cấp logic cho nó. Về cơ bản, bạn chỉ muốn xem có bao nhiêu thay đổi để tạo một chuỗi thành chuỗi khác và càng ít thay đổi thì chúng càng gần hơn
Rachel

0

Nếu bạn khớp tên, hoặc người hoặc địa điểm, danh sách từ đồng nghĩa có thể hoạt động tốt hơn rất nhiều.

Soundex sẽ không khớp với "Dick == Richard" "Kit == Christopher" hoặc "Ms. == Mrs."

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.