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.
Respuestas:
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.
fuente
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:
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:
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.
fuente
No he hecho esto antes, pero parece un trabajo para una base de datos de gráficos dada la funcionalidad que desea. Aquí hay una demostración en neo4j .
fuente