Modello di database efficiente per la memorizzazione di dati indicizzati da n-grammi


12

Sto lavorando su un'applicazione che richiede la creazione di un database molto grande di n-grammi che esiste in un corpus di testo di grandi dimensioni.

Ho bisogno di tre tipi di operazioni efficienti: ricerca e inserimento indicizzati dall'n-grammo stesso e interrogazione per tutti gli n-grammi che contengono un sotto-n-grammo.

Mi sembra che il database dovrebbe essere un gigantesco albero di documenti e che i database di documenti, ad esempio Mongo, dovrebbero essere in grado di fare bene il lavoro, ma non li ho mai usati su larga scala.

Conoscendo il formato delle domande di Stack Exchange, vorrei chiarire che non sto chiedendo suggerimenti su tecnologie specifiche, ma piuttosto un tipo di database che dovrei cercare per implementare qualcosa di simile su larga scala.


2
Penso che la struttura che si desidera implementare sia un "trie": se non riesco a trovare un DB che funzioni in modo efficiente con quella struttura o se è necessario implementare il proprio RDBMS a propria scelta, non posso dire.
Neil Slater,

Risposte:


9

Vedi Lucene NGramTokenizer

Sei sicuro di non poter usare solo lucene o tecniche di indicizzazione simili?

Gli indici invertiti memorizzeranno il n-grammo una sola volta, quindi solo gli ID del documento che contengono il ngram; non lo memorizzano come testo non elaborato altamente ridondante.

Per quanto riguarda la ricerca di ngram che contengono la tua query sub-n-gram, vorrei costruire un indice sugli ngram osservati, ad esempio usando un secondo indice di lucene o qualsiasi altro indice di sottostringa come un albero di trie o suffisso. Se i tuoi dati sono dinamici, probabilmente lucene è una scelta ragionevole, usando query a frase per trovare i tuoi n-grammi.


3

Fondamentalmente per questa attività è possibile utilizzare in modo efficiente qualsiasi database SQL con un buon supporto degli indici basati su alberi B + (MySQL si adatta perfettamente alle tue esigenze).

Crea 3 tabelle:

  1. Tabella dei documenti, colonne: id / documento
  2. Tabella N-grammi: n_gram_id / n_gram
  3. Mappatura tra n-grammi e documenti: document_id / n_gram_id

Crea indici su N-gram table / n_gram string e Mapping table / n_gram_id, anche le chiavi primarie verranno indicizzate di default.

Le tue operazioni saranno efficienti:

  1. Inserimento del documento: basta estrarre tutti gli n-grammi e inserirli nella tabella dei documenti e nella tabella degli N-grammi
  2. La ricerca di in_gram sarà rapida con il supporto dell'indice
  3. Interrogazione per tutti gli n-grammi che contengono un sotto-n-grammo: in 2 passaggi - basta eseguire una query in base all'indice di tutti gli n-grammi che contengono un sotto-n-grammo dalla seconda tabella. Quindi - recupera tutti i documenti corrispondenti per ciascuno di questi n-grammi.

Non è nemmeno necessario utilizzare i join per realizzare tutte queste operazioni, quindi gli indici aiuteranno molto. Inoltre, se i dati non si inseriscono in una macchina, è possibile implementare uno schema di sharding, come la memorizzazione di n_grams avviati da un server e oz su un altro o altro schema adatto.

Inoltre puoi usare MongoDB, ma non sono sicuro di come esattamente devi implementare lo schema di indicizzazione. Per MongoDB otterrai uno schema di sharding gratuito in quanto è già integrato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.