Model basis data yang efisien untuk menyimpan data yang diindeks oleh n-gram

12

Saya sedang mengerjakan sebuah aplikasi yang membutuhkan pembuatan database n-gram yang sangat besar yang ada dalam corpus teks besar.

Saya membutuhkan tiga jenis operasi yang efisien: Pencarian dan penyisipan diindeks oleh n-gram itu sendiri, dan permintaan untuk semua n-gram yang berisi sub-n-gram.

Bagi saya ini kedengarannya seperti database harus pohon dokumen raksasa, dan database dokumen, misalnya Mongo, harus dapat melakukan pekerjaan dengan baik, tetapi saya tidak pernah menggunakannya pada skala.

Mengetahui format pertanyaan Stack Exchange, saya ingin mengklarifikasi bahwa saya tidak meminta saran tentang teknologi tertentu, melainkan tipe database yang harus saya cari untuk mengimplementasikan sesuatu seperti ini pada skala.

Phonon
sumber
2
Saya pikir struktur yang ingin Anda terapkan adalah "trie" - apakah Anda dapat menemukan DB yang bekerja secara efisien dengan struktur itu, atau perlu memutar sendiri di RDBMS pilihan Anda, saya tidak bisa mengatakannya.
Neil Slater

Jawaban:

9

Lihat Lucene NGramTokenizer

Apakah Anda yakin tidak bisa menggunakan lucene atau teknik pengindeksan yang serupa?

Indeks terbalik akan menyimpan n-gram hanya sekali, maka hanya id dokumen yang berisi ngram; mereka tidak menyimpan ini sebagai teks mentah yang sangat berlebihan.

Sedangkan untuk menemukan ngram yang berisi sub-n-gram kueri Anda, saya akan membangun indeks pada ngram yang diamati, misalnya menggunakan indeks lucene kedua, atau indeks substring lainnya seperti pohon trie atau suffix. Jika data Anda dinamis, mungkin lucene adalah pilihan yang masuk akal, menggunakan kueri frasa untuk menemukan n-gram Anda.

Memiliki QUIT - Anony-Mousse
sumber
3

Pada dasarnya untuk tugas ini Anda dapat secara efisien menggunakan database SQL apa pun dengan dukungan indeks B + tree yang baik (MySQL akan sesuai dengan kebutuhan Anda dengan sempurna).

Buat 3 tabel:

  1. Tabel dokumen, kolom: id / dokumen
  2. Tabel N-gram: n_gram_id / n_gram
  3. Pemetaan antara n-gram dan dokumen: document_id / n_gram_id

Buat indeks pada N-gram table / n_gram string dan Mapping table / n_gram_id, kunci primer juga akan diindeks dengan baik.

Operasi Anda akan efisien:

  1. Penyisipan dokumen: ekstrak semua n-gram dan masukkan ke dalam tabel dokumen dan tabel N-gram
  2. Cari in_gram akan cepat dengan dukungan indeks
  3. Permintaan untuk semua n-gram yang berisi sub-n-gram: dalam 2 langkah - cukup kueri berdasarkan indeks semua n-gram yang berisi sub-n-gram dari tabel ke-2. Lalu - ambil semua dokumen yang sesuai untuk masing-masing n-gram ini.

Anda bahkan tidak perlu menggunakan gabungan untuk mencapai semua operasi ini sehingga indeks akan banyak membantu. Juga jika data tidak sesuai dalam satu mesin - Anda dapat menerapkan skema sharding, seperti menyimpan n_gram mulai dari pada satu server dan oz pada skema lain atau yang sesuai lainnya.

Anda juga dapat menggunakan MongoDB, tetapi saya tidak yakin bagaimana tepatnya Anda perlu menerapkan skema pengindeksan. Untuk MongoDB Anda akan mendapatkan skema sharding gratis karena sudah ada di dalamnya.

Maxim Galushka
sumber
1

Saya belum pernah melakukan ini sebelumnya tetapi kedengarannya seperti pekerjaan untuk basis data grafik mengingat fungsionalitas yang Anda inginkan. Ini demo di neo4j .

Emre
sumber