N-gram ile dizinlenmiş verileri depolamak için verimli veritabanı modeli


12

Büyük bir metin topluluğunda bulunan çok büyük bir n-gram veritabanı oluşturmayı gerektiren bir uygulama üzerinde çalışıyorum.

Üç verimli çalışma türüne ihtiyacım var: Arama ve ekleme n-gram kendisi tarafından dizin ve bir alt-n-gram içeren tüm n-gram sorgulama.

Bu bana veritabanının devasa bir belge ağacı olması gerektiği gibi geliyor ve örneğin Mongo gibi belge veritabanları işi iyi yapabilmelidir, ancak bunları hiç ölçekli kullanmadım.

Stack Exchange soru biçimini bilerek, belirli teknolojiler hakkında öneri istemediğimi açıklamak istiyorum, daha ziyade böyle bir şeyi ölçekli olarak uygulamak için aramam gereken bir veritabanı türü.


2
Ben uygulamak istediğiniz yapının bir "trie" olduğunu düşünüyorum - ister bu yapı ile verimli bir şekilde çalışan bir DB bulmak, ya da kendi RDBMS kendi rulo gerek söylemek söyleyemeyiz.
Neil Slater

Yanıtlar:


9

Lucene NGramTokenizer'i görün

Sadece lucene veya benzeri indeksleme tekniklerini kullanamayacağınızdan emin misiniz?

Tersine çevrilmiş dizinler n-gram'ı yalnızca bir kez, daha sonra yalnızca ngramı içeren belge kimlikleri depolar; bunu fazladan işlenmemiş ham metin olarak depolamazlar.

Alt-n-gram sorgunuzu içeren ngramları bulmaya gelince, gözlemlenen ngramlar üzerinde, örneğin ikinci bir lucene indeksi veya bir trie veya sonek ağacı gibi başka bir alt dize indeksi kullanarak bir indeks oluşturacağım . Verileriniz dinamikse, n-gramlarınızı bulmak için ifade sorgularını kullanarak muhtemelen lucene makul bir seçimdir.


3

Temelde bu görev için B + ağaç tabanlı dizinleri iyi bir destek ile herhangi bir SQL veritabanını verimli bir şekilde kullanabilirsiniz (MySQL sadece mükemmel ihtiyacınız paketi olacaktır).

3 tablo oluşturun:

  1. Belgeler tablosu, sütunlar: kimlik / belge
  2. N gram tablosu: n_gram_id / n_gram
  3. N gram ve belgeler arasında eşleme: document_id / n_gram_id

N-gram tablosu / n_gram dizesi ve Eşleme tablosu / n_gram_id'de dizinler oluşturun, ayrıca birincil anahtarlar varsayılan olarak iyi dizinlenir.

Operasyonlarınız verimli olacak:

  1. Belgenin eklenmesi: tüm n-gramları çıkarın ve belge tablasına ve N-gram tablasına yerleştirin
  2. Dizin desteği ile in_gram araması hızlı olacaktır
  3. Bir alt-n-gram içeren tüm n-gramlar için sorgulama: 2 adımda - sadece 2. tablodan alt-n-gram içeren tüm n-gramları endekse göre sorgulayın. Sonra - bu n-gramların her biri için ilgili tüm belgeleri alın.

Tüm bu işlemleri gerçekleştirmek için birleştirme kullanmanıza bile gerek yoktur, böylece dizinler çok yardımcı olacaktır. Ayrıca veriler bir makinede paketlenmezse - bir sunucudan başlatılan n_gramları ve başka bir veya başka bir uygun şemada oz depolamak gibi parçalama şemasını uygulayabilirsiniz.

Ayrıca MongoDB kullanabilirsiniz, ancak tam olarak nasıl indeksleme düzeni uygulamak gerekir emin değilim. MongoDB için, zaten yerleşik olduğu için ücretsiz parçalama şeması alacaksınız.


1

Bunu daha önce yapmadım ama istediğiniz işlevsellik göz önüne alındığında bir grafik veritabanı için bir iş gibi geliyor. İşte neo4j'de bir demo .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.