Do seu esclarecimento -
Por banco de dados, digamos que exista uma lista enorme do modelo ngram que representa o documento
Você faria bem em fazer algo um pouco mais estruturado e colocar os dados em um banco de dados relacional. Isso permitiria que você fizesse análises muito mais detalhadas com mais facilidade e rapidez.
Eu acho que quando você diz "ngram", você quer dizer "1gram". Você pode estender a análise para incluir 2 gramas, 3 gramas, etc., se desejar.
Eu teria uma estrutura de tabela que se parece com isso -
1Grams
ID
Value
Docs
ID
DocTitle
DocAuthor
etc.
Docs1Grams
1GramID
DocID
1GramCount
Portanto, no registro da tabela Docs1Grams, quando 1GramID aponta para o 1gram "the" e o DocID aponta para o documento "War and Peace", o 1GramCount retém o número de vezes que o 1gram "the" aparece em War and Peace.
Se o DocID de 'Guerra e paz "for 1 e o DocId de" Senhor dos anéis "for 2, calcule a pontuação de similaridade de 1 grama para esses dois documentos, você faria esta consulta -
Select count(*) from Docs1Grams D1, Docs1Grams D2
where D1.DocID = 1 and
D2.DocID = 2 and
D1.1GramID = D2.1GramID and
D1.1GramCount > 0 and
D2.1GramCount > 0
Ao generalizar e expandir a consulta, isso pode ser facilmente alterado para selecionar automaticamente a pontuação / contagem mais alta, comparando o documento escolhido com todos os outros.
Ao modificar / expandir a D1.1GramCount > 0 and D2.1GramCount > 0
parte da consulta, você pode facilmente tornar a comparação mais sofisticada, por exemplo, adicionando 2Grams, 3Grams, etc. ou modificando a correspondência simples para pontuar de acordo com a porcentagem de correspondência por ngram.
Portanto, se o documento do assunto tiver 0,0009% dos 1 gramas sendo "o", o documento 1 tiver 0,001% e o documento 2 tiver 0,0015%, o documento 1 terá uma pontuação mais alta no "the" porque o módulo da diferença (ou qualquer outra medida que você escolher) usar) é menor.