Modelo de base de datos eficiente para almacenar datos indexados por n-gramas


12

Estoy trabajando en una aplicación que requiere crear una base de datos muy grande de n-gramos que existen en un corpus de texto grande.

Necesito tres tipos de operaciones eficientes: búsqueda e inserción indexadas por el n-gramo en sí, y consulta de todos los n-gramos que contienen un sub-n-gramo.

Esto me parece que la base de datos debería ser un árbol de documentos gigantesco, y las bases de datos de documentos, por ejemplo, Mongo, deberían poder hacer bien el trabajo, pero nunca las he usado a escala.

Conociendo el formato de pregunta de Stack Exchange, me gustaría aclarar que no estoy pidiendo sugerencias sobre tecnologías específicas, sino más bien un tipo de base de datos que debería estar buscando para implementar algo como esto a escala.


2
Creo que la estructura que desea implementar es un "trie": no puedo decir si puede encontrar una base de datos que funcione de manera eficiente con esa estructura o si necesita rodar la suya en el RDBMS de su elección.
Neil Slater

Respuestas:


9

Ver Lucene NGramTokenizer

¿Estás seguro de que no puedes usar lucene o técnicas de indexación similares?

Los índices invertidos almacenarán el n-gramo solo una vez, luego solo los identificadores del documento que contienen el ngram; no almacenan esto como texto sin procesar altamente redundante.

En cuanto a la búsqueda de ngrams que contengan su consulta sub-n-gram, crearía un índice sobre los ngrams observados, por ejemplo, utilizando un segundo índice de luceno o cualquier otro índice de subcadena , como un árbol trie o sufijo. Si sus datos son dinámicos, probablemente lucene sea una opción razonable, utilizando consultas de frases para encontrar sus n-gramas.


3

Básicamente para esta tarea, puede usar de manera eficiente cualquier base de datos SQL con un buen soporte de índices basados ​​en árboles B + (MySQL se adaptará a sus necesidades).

Crea 3 tablas:

  1. Tabla de documentos, columnas: id / document
  2. Tabla de N-gramos: n_gram_id / n_gram
  3. Mapeo entre n-gramas y documentos: document_id / n_gram_id

Cree índices en la tabla N-gram string / n_gram string y Mapping table / n_gram_id, también las claves primarias se indexarán de manera predeterminada.

Sus operaciones serán eficientes:

  1. Inserción del documento: simplemente extraiga todos los n-gramos e insértelos en la tabla de documentos y en la tabla de N-gramos
  2. La búsqueda de in_gram será rápida con soporte de índice
  3. Consulta de todos los n-gramos que contienen un sub-n-gramo: en 2 pasos: solo consulte en función del índice todos los n-gramos que contienen sub-n-gramo de la segunda tabla. Luego, recupere todos los documentos correspondientes para cada uno de estos n-gramas.

Ni siquiera necesita usar combinaciones para lograr todas estas operaciones, por lo que los índices ayudarán mucho. Además, si los datos no se ajustan en una máquina, puede implementar un esquema de fragmentación, como almacenar n_grams iniciados desde un servidor y oz en otro u otro esquema adecuado.

También puede usar MongoDB, pero no estoy seguro de cómo exactamente necesita implementar el esquema de indexación. Para MongoDB, obtendrá un esquema de fragmentación de forma gratuita, ya que está integrado.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.