Mô hình cơ sở dữ liệu hiệu quả để lưu trữ dữ liệu được lập chỉ mục bởi n-gram


12

Tôi đang làm việc trên một ứng dụng đòi hỏi phải tạo ra một cơ sở dữ liệu rất lớn về n-gram tồn tại trong một văn bản lớn.

Tôi cần ba loại hoạt động hiệu quả: Tra cứu và chèn được lập chỉ mục bởi chính n-gram và truy vấn cho tất cả n-gram có chứa một tiểu gram.

Đối với tôi, âm thanh này giống như một cơ sở dữ liệu khổng lồ và cơ sở dữ liệu tài liệu, ví dụ Mongo, có thể thực hiện tốt công việc, nhưng tôi chưa bao giờ sử dụng chúng ở quy mô.

Biết định dạng câu hỏi Stack Exchange, tôi muốn làm rõ rằng tôi không yêu cầu đề xuất về các công nghệ cụ thể, mà là một loại cơ sở dữ liệu mà tôi nên tìm kiếm để thực hiện quy mô như thế này ở quy mô.


2
Tôi nghĩ rằng cấu trúc bạn muốn triển khai là một "trie" - cho dù bạn có thể tìm thấy một DB hoạt động hiệu quả với cấu trúc đó hay không cần phải tự cuộn trong RDBMS mà bạn chọn.
Neil Slater

Câu trả lời:


9

Xem Lucene NGramTokenizer

Bạn có chắc chắn rằng bạn không thể chỉ sử dụng các kỹ thuật lập chỉ mục lucene hoặc tương tự?

Các chỉ mục đảo ngược sẽ chỉ lưu trữ n-gram một lần, sau đó chỉ là các id tài liệu có chứa ngram; họ không lưu trữ đây là văn bản thô dư thừa.

Đối với việc tìm ngrams chứa sub-n-gram truy vấn của bạn, tôi sẽ xây dựng một chỉ mục trên các ngram được quan sát, ví dụ như sử dụng chỉ mục lucene thứ hai hoặc bất kỳ chỉ mục chuỗi con nào khác như cây trie hoặc hậu tố. Nếu dữ liệu của bạn là động, có lẽ lucene là một lựa chọn hợp lý, sử dụng truy vấn cụm từ để tìm n-gram của bạn.


3

Về cơ bản cho nhiệm vụ này, bạn có thể sử dụng hiệu quả bất kỳ cơ sở dữ liệu SQL nào với sự hỗ trợ tốt của các chỉ mục dựa trên cây B + (MySQL sẽ bộ bạn cần hoàn hảo).

Tạo 3 bảng:

  1. Bảng tài liệu, cột: id / document
  2. Bảng N-gram: n_gram_id / n_gram
  3. Ánh xạ giữa n-gram và tài liệu: document_id / n_gram_id

Tạo các chỉ mục trên bảng N-gram / chuỗi n_gram và Bảng ánh xạ / n_gram_id, các khóa chính cũng sẽ được lập chỉ mục theo mặc định.

Hoạt động của bạn sẽ hiệu quả:

  1. Chèn tài liệu: chỉ cần trích xuất tất cả n-gram và chèn vào bảng tài liệu và bảng N-gram
  2. Tra cứu in_gram sẽ nhanh chóng với sự hỗ trợ của chỉ mục
  3. Truy vấn cho tất cả n-gram có chứa một n-gram phụ: trong 2 bước - chỉ cần truy vấn dựa trên chỉ mục tất cả n-gram có chứa tiểu n-gram từ bảng 2. Sau đó - lấy tất cả các tài liệu tương ứng cho mỗi n-gram này.

Bạn thậm chí không cần sử dụng các phép nối để đạt được tất cả các hoạt động này vì vậy các chỉ mục sẽ giúp ích rất nhiều. Ngoài ra, nếu dữ liệu sẽ không được kết hợp trong một máy - bạn có thể triển khai chương trình shending, như lưu trữ n_gram được bắt đầu từ một máy chủ và oz trên máy khác hoặc sơ đồ phù hợp khác.

Ngoài ra, bạn có thể sử dụng MongoDB, nhưng tôi không chắc chính xác bạn cần thực hiện sơ đồ lập chỉ mục như thế nào. Đối với MongoDB, bạn sẽ nhận được chương trình shending miễn phí vì nó đã được tích hợp sẵn.


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.