Khớp tên một phần trong hàng triệu hồ sơ


10

Chúng tôi đã phát triển một ứng dụng dựa trên web để khớp tên. Nó hoạt động bằng cách chia tên thành các phần và giá trị Soundex của từng phần được lưu trữ trong cơ sở dữ liệu. Các khoảng cách levenshtein số liệu được sử dụng để áp dụng phù hợp với tỷ lệ phần trăm của âm thanh cũng như chính tả chống lại một tên nhất định.

Khi chạy, chúng tôi tải tất cả các bản ghi vào bộ nhớ và áp dụng khoảng cách Levenshtein cho tất cả các giá trị Soundex và chính tả của tất cả các phần của tất cả các tên.

Điều này ban đầu hoạt động tốt vì có tối đa 20 nghìn tên, nhưng bây giờ một trong những khách hàng của chúng tôi có 30 triệu tên. Tải danh sách khổng lồ này vào bộ nhớ cho mỗi yêu cầu và áp dụng loại kết hợp này là một cách tiếp cận thảm hại, sử dụng nhiều bộ nhớ và thời gian thực hiện.

Chúng tôi đang tìm kiếm các đề xuất để tìm kiếm cơ sở dữ liệu từ 30 triệu bản ghi trở lên trong tương lai gần với tỷ lệ phần trăm phù hợp với Âm thanh và Chính tả.

Chức năng cốt lõi

Người dùng cuối nhập tên được khớp và tỷ lệ phần trăm tối thiểu. Chúng tôi phải hiển thị tất cả các tên đó trong cơ sở dữ liệu mà bất kỳ phần nào của tên khớp với bất kỳ phần nào của tên đã cho đến phần trăm đã cho. Tên đầy đủ không bắt buộc phải được khớp, bất kỳ phần nào nếu khớp với tỷ lệ phần trăm là thành công. Ví dụ.

Given Name: Helen Hunt
Name in DB: Holly Hunter 

Cả hai phần của cả hai tên không khớp chính xác nhưng đến một mức độ nào đó, chúng ta hãy giả sử 80%, vì vậy nếu người dùng nhập 80% thì tên trong DB phải được hiển thị dưới dạng tên khớp.


1
Bạn đang sử dụng SQL Server? Tôi thấy bạn đã gắn thẻ nó asp.net. Suy nghĩ về khả năng lắp ráp CLR sẽ ngăn chặn lưu lượng mạng và để máy chủ SQL quản lý bộ nhớ.
RubberChickenLeader

@WindRaven chúng tôi đang sử dụng cả SQL Server và Oracle
bjan

1
Đây có phải là cùng một vấn đề thu thập dữ liệu web mà Google giải quyết không?
candied_orange

@bjan tên được lưu ở đâu? chúng được lưu trữ trong SQL Server?
RubberChickenLeader

Bạn đang kiếm gì vậy? 100 tên hàng đầu phù hợp nhất với một truy vấn nhất định?
Doc Brown

Câu trả lời:


6

Không biết chi tiết đầy đủ về những gì bạn cần, có lẽ bạn muốn thực hiện một trong những điều sau đây:

Tôi không biết đầy đủ những gì liên quan đến việc cài đặt và cấu hình nhân sư; nhưng, tôi có ấn tượng rằng bạn có thể trỏ nó vào cơ sở dữ liệu, cho nó biết trường nào cần lập chỉ mục, cách tính trọng số của kết quả và nó sẽ cung cấp cho bạn một danh sách sắp xếp các bản ghi khớp.

Đối với những thứ quan trọng đối với người dùng hoặc nhiệm vụ, hãy sử dụng một công cụ tìm kiếm hiện có.

Nếu bạn chỉ cảm thấy học tập ... Chơi với ngrams:

Một bảng tra cứu ngrams có thể đóng vai trò là tập hợp các trận đấu tiềm năng ban đầu của bạn và bạn có thể sử dụng khoảng cách Levenshtein để cắt tỉa và sắp xếp kết quả.

Giả sử bạn muốn tìm kiếm people, bạn có thể làm một cái gì đó như:

_ people _________
personId: int
name: varchar
soundex_name: varchar

_ people_ngrams __
personId: int
ngramId: int

_ ngrams _________
ngramId: int
ngram: char(3)
count: int

Bạn có thể định kỳ xây dựng lại ngrams của mình hoặc xây dựng chúng một cách nhanh chóng. Dù bằng cách nào, một thuật toán tìm kiếm đơn giản, ngây thơ có thể trông như thế này:

search_ngrams = ngrammify(soundex(search_string));

notable_ngrams = select top 10 *
  from ngrams
  where ngram in (search_ngrams)
  order by count asc;

possible_matches = select top 1000 distinct people.*
  from people_ngrams, people
  where ngramId in (notable_ngrams);

best_matches = top 100 possible_matches
  ordered by Levenshtein_distance(match, soundex(search_string));

Sử dụng một cái gì đó khá giống với cái này (nhưng với một chút điều chỉnh "mức độ phổ biến", danh sách đen, danh sách trắng, v.v.), tôi đã thấy loại thuật toán này hợp nhất các bản ghi giữa các bộ dữ liệu, cũng như tạo điều kiện cho tìm kiếm mờ tùy chỉnh tiện ích và hồ sơ liên tục nỗ lực chống trùng lặp.

Bây giờ, trong trường hợp của tôi, tôi không khớp với hàng triệu bản ghi, tôi đang tìm cách chọn các kết hợp tốt nhất có thể có giữa hai bộ dữ liệu theo thứ tự hàng trăm ngàn bản ghi. Và, chúng tôi muốn nó hoạt động khá nhanh - trong vài phút. (Nhanh lên, 100.000 * 100.000 là gì?) Và, chúng tôi đã thành công.

Vì vậy, với sự điều chỉnh phù hợp, loại điều này có thể được linh hoạt và hiệu quả. Cuối cùng, chúng tôi đã có thể tạo ra một bộ hợp nhất trên một máy lõi kép khiêm tốn, có niên đại trong vài phút, với các phép hợp nhất "có thể nghi vấn" được gắn cờ để xem xét thủ công. Tuy nhiên, phải mất rất nhiều thời gian để tìm ra điểm ngọt phổ biến / mức độ phù hợp của ngram, và ngưỡng khoảng cách chuỗi đúng, và danh sách đen, và danh sách trắng ... vv

RẤT NÓI , bạn thực sự có thể bị hút vào một lỗ làm việc trên công cụ này. Đối với bất kỳ công cụ cấp sản xuất trong thế giới thực, bạn thường nên sử dụng một công cụ được thiết lập tốt đã được thực hiệntối ưu hóa cho loại tìm kiếm này.

Giống như Nhân sư hoặc Lucene .


Tôi chỉ tìm kiếm mờ trên hướng dẫn tham khảo phát hành Sphinx 2.2.11 và có vẻ như nó khớp với từ chính xác trong khi tôi cần ghép các từ một phần. Sửa tôi nếu tôi sai về điều này.
bjan

@bjan Vâng. Nhìn vào các tài liệu xa hơn, tôi không chắc tìm kiếm mờ của Sphinx chính xác là những gì bạn đang tìm kiếm. Nó có thể sử dụng một hình thái soundex . Nhưng, dựa trên chỉnh sửa gần đây của bạn, bạn có thể muốn cuộn ngram + tìm kiếm khoảng cách chuỗi của riêng bạn. Và như tôi đã nói ở trên, có thể mất một lúc để điều chỉnh thuật toán và ngưỡng để có được quyền; Nhưng, nó không phải là không thể. Và, nếu bạn cần mức độ linh hoạt đó ...
svidgen

@bjan ơi, tôi cũng hoàn toàn quên mất Lucene . Tôi không chắc nó cũng làm những gì bạn cần; nhưng, nó khá phổ biến và đáng xem trước khi bạn tự làm. Các tài liệu của Lucene đề cập đến việc tìm kiếm và xếp hạng mờ bằng khoảng cách chuỗi Levenshtein.
Svidgen
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.