Modelo de banco de dados eficiente para armazenar dados indexados por n-gramas

12

Estou trabalhando em um aplicativo que requer a criação de um banco de dados muito grande de n-gramas que existem em um corpus de texto grande.

Preciso de três tipos de operação eficientes: pesquisa e inserção indexadas pelo próprio n-grama e consulta de todos os n-gramas que contêm um sub-n-grama.

Parece-me que o banco de dados deve ser uma árvore de documentos gigantesca, e os bancos de dados de documentos, como o Mongo, devem ser capazes de fazer o trabalho bem, mas nunca os usei em escala.

Conhecendo o formato da pergunta Stack Exchange, gostaria de esclarecer que não estou pedindo sugestões sobre tecnologias específicas, mas um tipo de banco de dados que eu deveria estar procurando para implementar algo assim em escala.

Phonon
fonte
2
Eu acho que a estrutura que você deseja implementar é uma "tentativa" - se você pode encontrar um banco de dados que funcione com eficiência com essa estrutura ou se precisa rolar o seu próprio no RDBMS de sua escolha, não sei dizer.
Neil Slater

Respostas:

9

Veja Lucene NGramTokenizer

Tem certeza de que não pode usar apenas lucene ou técnicas de indexação semelhantes?

Os índices invertidos armazenam o n-grama apenas uma vez, e apenas os IDs do documento que contêm o ngram; eles não armazenam isso como texto bruto altamente redundante.

Quanto a encontrar ngrams que contenham seu sub-grama de consulta, eu criaria um índice nos ngrams observados, por exemplo, usando um segundo índice lucene ou qualquer outro índice de substring , como uma árvore trie ou sufixo. Se seus dados são dinâmicos, provavelmente o lucene é uma escolha razoável, usando consultas de frase para encontrar seus n-gramas.

Possui QUIT - Anony-Mousse
fonte
3

Basicamente, para esta tarefa, você pode usar eficientemente qualquer banco de dados SQL, com bom suporte de índices baseados em árvore B + (o MySQL fornecerá o que você precisa, perfeito).

Crie 3 tabelas:

  1. Tabela de documentos, colunas: id / documento
  2. Tabela de gramas N: n_gram_id / n_gram
  3. Mapeamento entre n-gramas e documentos: document_id / n_gram_id

Crie índices na tabela N-grama / sequência n_gram e na tabela Mapeamento / n_gram_id, também as chaves primárias serão indexadas também por padrão.

Suas operações serão eficientes:

  1. Inserção de documento: basta extrair todos os n-gramas e inserir na tabela de documentos e na tabela de N-gramas
  2. A pesquisa por in_gram será rápida com o suporte do índice
  3. Consultando todos os n-gramas que contêm um sub-n-grama: em 2 etapas - basta consultar com base no índice todos os n-gramas que contêm sub-n-grama da 2ª tabela. Então - recupere todos os documentos correspondentes para cada um desses n gramas.

Você nem precisa usar junções para realizar todas essas operações, para que os índices ajudem bastante. Além disso, se os dados não se encaixarem em uma máquina - você pode implementar o esquema de sharding, como armazenar n_grams iniciados em um servidor e oz em outro ou em outro esquema adequado.

Além disso, você pode usar o MongoDB, mas não sei exatamente como é necessário implementar o esquema de indexação. Para o MongoDB, você obterá o esquema de sharding gratuitamente, pois ele já está embutido.

Maxim Galushka
fonte