Skip to content

Latest commit

 

History

History
142 lines (120 loc) · 16.1 KB

README_siglestore.md

File metadata and controls

142 lines (120 loc) · 16.1 KB

Uso de vetores no SingleStore

Você encontra aqui:

  • Pesquisa de documentos por Similaridade vetorial
  • Criação de tabela para armazenamento dos vetores
  • Criação de uma procedure de agrupamento de documentos pela similaridade semântica/vetorial
  • Pesquisa vetorial SingleStore - saiba mais

Scripts:

Caso queira dicas de estrutura de índice para o ElasticSearch

  • nesse link ElasticQueries estão disponíveis exemplos de criação de índice e pesquisas no ElasticSearch.

Dicas de inclusão e comparação de vetores no SigleStore

  • exemplo de view para consultar documentos similares:
    create VIEW testes.vw_similares as
    select v1.seq_documento as seq_documento_1, v2.seq_documento as seq_documento_2, v1.pagina as pagina_1, v2.pagina as pagina_2,
           v1.dthr as dthr_1, v2.dthr as dthr_2, dot_product(v1.vetor,v2.vetor) as sim, round(dot_product(v1.vetor,v2.vetor) * 100,2) as sim_100
    from testes.vetores v1, testes.vetores v2 where v1.seq_documento <> v2.seq_documento and dot_product(v1.vetor,v2.vetor)> 0.7
  • usando a view: buscando os documentos mais similares ao documento 42, com similaridade acima de 80%
    select seq_documento_1, pagina_1, seq_documento_2, pagina_2, sim_100
    from testes.vw_similares where sim>0.8 and seq_documento_1=42 
    order by sim desc

exemplo view similaridade

💡 o SingleStore vai retornar um erro caso sejam comparados vetores de dimensôes diferentes, ele não impede inserir vetores de diversas dimensões em uma tabela, mas não consegue compará-los.

  • Criação da tabela desse exemplo:
    create database testes;
    CREATE TABLE testes.vetores (
      seq_documento int(11) NOT NULL COMMENT 'seq_documento' ,
      pagina int(11) NOT NULL COMMENT 'pagina do documento' ,
      vetor blob NOT NULL COMMENT 'vetor criado por algum modelo e inserido no padrão hexadecimal do memsql',
      dthr TIMESTAMP default now() COMMENT 'data de inclusão do vetor na tabela',
      PRIMARY KEY (seq_documento),
      SHARD KEY (seq_documento)
    );
  • Para inserir um vetor na tabela, é necessário usar o método do SingleStore JSON_ARRAY_PACK("[lista de floats]") como no exemplo abaixo:
   insert into testes.vetores(seq_documento, pagina, vetor) values 
   (1,1522,JSON_ARRAY_PACK("[0.29622436059440654, 0.3295083520338847, 0.03051693646308954, 0.33317335819453725, 0.11752939155710365, 0.1427171700446146, 0.17068415021818217, 0.28603840476043374, 0.10785501747400973, 0.1591158711405065, 0.3110699766574472, 0.09797969933472601, 0.10708984600425096, 0.27178365054099046, 0.01997878240363319, 0.3408928615842041, 0.27572629407004984, 0.3336592503497728, 0.014973387837642078, 0.11735723579858952]")),

Geração de vetores com o Doc2VecFacial e armazenamento no SigleStore

  • Para gerar o vetor de um documento com o Doc2VecFacil, use o médodo:
   from util_doc2vec_facil import UtilDoc2VecFacil
   dv = UtilDoc2VecFacil(pasta_modelo='meu_modelo')
   vetor = dv.vetor_sentenca('texto original a ser vetorizado', normalizado=True, epocas = 3)
   seq_doc = 123
   numpagina = 1175
   string_insert_memsql = f'insert into testes.vetores(seq_documento, pagina, vetor) values ({seqdoc},{numpagina},JSON_ARRAY_PACK("{vetor}") ) '
   
   cliente.execsql(string_insert_memsql)

💡 Pode-se definir o número de épocas para gerar cada vetor inferido ao usar o modelo em novos documentos.
Veja a documentação do SingleStore aqui
O SingleStore não é um banco derivado do MySQL, mas é compatível com o cliente MySQL para simplificar o seu uso, conforme informado na documentação.

  • Inserindo alguns vetores para teste da view
/* vetores são inseridos como uma string de uma lista de floats [0.1,0.2,0.11,0.7,0.4]  */
insert into testes.vetores(seq_documento, pagina, vetor) values 
(44,1522,JSON_ARRAY_PACK("[0.29622436059440654, 0.3295083520338847, 0.03051693646308954, 0.33317335819453725, 0.11752939155710365, 0.1427171700446146, 0.17068415021818217, 0.28603840476043374, 0.10785501747400973, 0.1591158711405065, 0.3110699766574472, 0.09797969933472601, 0.10708984600425096, 0.27178365054099046, 0.01997878240363319, 0.3408928615842041, 0.27572629407004984, 0.3336592503497728, 0.014973387837642078, 0.11735723579858952]")),
(114,19970,JSON_ARRAY_PACK("[0.3353996204434718, 0.3398673494806736, 0.0739715239262524, 0.18139385757243318, 0.03305862270559466, 0.215757558517972, 0.08291111308243097, 0.363193875612915, 0.10538960826152374, 0.08508484482171016, 0.2838352367687548, 0.2030352130465033, 0.32154207358073866, 0.14181010442045186, 0.05897249042280951, 0.33771728326596273, 0.19394669685105187, 0.04184566951882402, 0.35421227016689055, 0.03461991806374044]")),
(516,11313,JSON_ARRAY_PACK("[0.15731600783617453, 0.05412586412762664, 0.12266076849328932, 0.2582433464069515, 0.2699780064320107, 0.1990170556349409, 0.28123570719651336, 0.23708209686147097, 0.01305385787908772, 0.05918845718378893, 0.04401406198869518, 0.3629323657640402, 0.306910757603344, 0.06904979222220059, 0.15914833134341502, 0.23096408959659823, 0.3783056801547999, 0.1712512740067226, 0.3903109078101728, 0.05512822961705824]")),
(755,11121,JSON_ARRAY_PACK("[0.22517326484972658, 0.35708879266817917, 0.09159794395599045, 0.2716437405728313, 0.3488823660917893, 0.07364038465155213, 0.3174361230030568, 0.0841462595289304, 0.005331659022152981, 0.30115345923483905, 0.003846986565242538, 0.12497474356550801, 0.07004149078354216, 0.3448620732168598, 0.1736198621029107, 0.1444808376713046, 0.015427894349077823, 0.06492741088949142, 0.30411703609997326, 0.35562014198369285]")),
(487,17524,JSON_ARRAY_PACK("[0.172265048828028, 0.006049496492211493, 0.07869644656790117, 0.3947454050892697, 0.34247381592915244, 0.1333643559950997, 0.038377731987891135, 0.19819825735097085, 0.1252284321041784, 0.046467258114842286, 0.05121812842662073, 0.16397206004516982, 0.12493255941396653, 0.2763882091057356, 0.1180005361872717, 0.07683103846089594, 0.40509500741549553, 0.38853490245112365, 0.14290892933115995, 0.3711870241580806]")),
(146,11274,JSON_ARRAY_PACK("[0.18923882028493627, 0.14084905473872375, 0.22823966108898436, 0.10930660860098512, 0.09826764154793416, 0.018381695620692095, 0.3305325076624465, 0.09721603860643196, 0.37436995677155205, 0.22917908605843862, 0.18428826328763517, 0.32885647390187905, 0.017924473164790837, 0.38233879561063805, 0.36615474577050017, 0.2260448711816779, 0.2523803791523102, 0.03170588279988947, 0.1429668803458817, 0.004085230319098715]")),
(301,3882,JSON_ARRAY_PACK("[0.2809011413203272, 0.06346311211634799, 0.039362114780015445, 0.17712257097048775, 0.2270768336237829, 0.07959451475347303, 0.25647514913651437, 0.28863250821243003, 0.05432875353469895, 0.06680961042513128, 0.19602033237023772, 0.37102356157587996, 0.24192010279258516, 0.3598785250590641, 0.16479454131598556, 0.14473727252708118, 0.29629587193726603, 0.1448083944463425, 0.10424394662133679, 0.371333656406341]")),
(924,2170,JSON_ARRAY_PACK("[0.2673439655615341, 0.007574680123300325, 0.04244842493347119, 0.19566187659893444, 0.09594410977984663, 0.07628146215113073, 0.13498899032557915, 0.19077320116045568, 0.39075783992940194, 0.0029954360428166072, 0.2724905016648937, 0.3730505196083475, 0.0022232251348543045, 0.35734135290273406, 0.29190361505112516, 0.15031654627526392, 0.10929083873044279, 0.17985423508385068, 0.24153005323338486, 0.3383726032253272]")),
(42,5757,JSON_ARRAY_PACK("[0.3605297232517241, 0.1150371270990875, 0.009657112422849428, 0.309330072539095, 0.24035024817765102, 0.09481426892777374, 0.1410435540620977, 0.04638486337386212, 0.3205147981596714, 0.019312029705076863, 0.3211335375949638, 0.2944406665432997, 0.2711010224078545, 0.198160016517292, 0.3088106830065799, 0.1976609141863721, 0.21578016778238354, 0.2687468760554078, 0.07633512777404883, 0.08642224588200415]")),
(983,10470,JSON_ARRAY_PACK("[0.007764882482617089, 0.04095011839569, 0.011058075295102459, 0.26908619817939655, 0.3740441411538188, 0.16660816912141094, 0.43383495221355267, 0.20747400472749983, 0.19420001876363502, 0.16802702256917784, 0.18577150912222226, 0.03570669962963457, 0.07417969623056116, 0.16140356403249614, 0.21696436793694224, 0.2377171635003793, 0.4227009723872715, 0.20757536385929992, 0.09211138691433549, 0.24431532052464214]")),
(817,19969,JSON_ARRAY_PACK("[0.3676437254943031, 0.27373713612018796, 0.2329972673185259, 0.36463719553542, 0.09877945114302582, 0.3154769029781356, 0.26282907825688157, 0.16078761186471882, 0.02755410845866499, 0.11788507975923791, 0.12865925617569815, 0.15067648524768412, 0.28868056149722177, 0.25780378233085155, 0.11531417192895116, 0.07528283545937259, 0.20749356777855302, 0.3575397173993577, 0.05138894670960328, 0.047300327555390154]")),
(982,1959,JSON_ARRAY_PACK("[0.055609364137742374, 0.13821030824816072, 0.3528015752418557, 0.25786917541633203, 0.2894552067307426, 0.0915316548312789, 0.2457897414760268, 0.3797186554921893, 0.016060415284779413, 0.24909186057347663, 0.37769355425066076, 0.0374661757961408, 0.16460611158258237, 0.08047437600260145, 0.2865093726187078, 0.28157544910358484, 0.0804590255695912, 0.2444611365146199, 0.14159860805326294, 0.049892734436660896]")),
(929,7606,JSON_ARRAY_PACK("[0.1270364688838746, 0.003007701485749625, 0.2309434654811585, 0.4183174173053639, 0.01817661882577725, 0.21261435331746195, 0.2287447856004787, 0.2815665012715624, 0.10532854394688689, 0.035767586744625546, 0.43917562776353686, 0.12070796462683785, 0.33344148734209994, 0.29583910521632983, 0.2804493813102484, 0.259606888012388, 0.0492501979246137, 0.09451038813613431, 0.017763675129060037, 0.046316464890603405]")),
(839,3079,JSON_ARRAY_PACK("[0.21782092844675652, 0.000467494680954928, 0.04777148651563239, 0.21484471696308768, 0.044496085900304995, 0.43303302444260594, 0.296990499308052, 0.21377544671188692, 0.19124689809420312, 0.4035990667402825, 0.28723218297926245, 0.40966347389282676, 0.0033445179359394375, 0.11136728849786008, 0.12516621503827507, 0.00032438436498935275, 0.13876373963687158, 0.04267378020239959, 0.23384054214225533, 0.16456066992073404]")),
(878,19937,JSON_ARRAY_PACK("[0.33544379530615476, 0.17565294761486708, 0.19456088268842817, 0.06387652306513356, 0.392161518974914, 0.21318701280143654, 0.13605839016270374, 0.25201206609163374, 0.20936980671655273, 0.07082152735938953, 0.13773078319704551, 0.3404110362812541, 0.27466088011669987, 0.20129528649209993, 0.30165131846303955, 0.060454777999983986, 0.2065609263975741, 0.13525442165896442, 0.2647206388892102, 0.08990161554446822]")),
(481,15865,JSON_ARRAY_PACK("[0.03965867787684049, 0.25488670378848793, 0.2431033457014291, 0.3195862351417284, 0.3324302038776889, 0.20648911026549915, 0.22077258724903498, 0.18596302203863105, 0.02628896265702533, 0.14562659128980524, 0.014589328109682442, 0.3469468458528979, 0.3178314201363228, 0.14807567442021818, 0.11584112545901411, 0.25643613933837334, 0.3009063499243521, 0.053967815752221954, 0.2510042058704128, 0.18625161572143417]")),
(164,2617,JSON_ARRAY_PACK("[0.264205413143274, 0.31096453351932457, 0.2964669997840924, 0.22372836291327786, 0.2515806760973584, 0.25665309565765715, 0.22275096409433023, 0.1510382677979974, 0.19111900057172976, 0.10297324460907306, 0.3129225511110615, 0.11090610082779202, 0.08919157704064502, 0.20183740485288576, 0.32167390098127985, 0.24498965560063052, 0.05887610023336193, 0.07713724709514481, 0.17132086097161572, 0.2926597978834056]")),
(433,3337,JSON_ARRAY_PACK("[0.3517427561279441, 0.2964916562013806, 0.15841562202928341, 0.2966300487601257, 0.030173954091685176, 0.18938974146480336, 0.059069394284951886, 0.29986565699561063, 0.32784323280201394, 0.03520795012151976, 0.20045313217739535, 0.19756038328267883, 0.07977392526788803, 0.12283586904208217, 0.006991247001715607, 0.19909978589743885, 0.34529721625922116, 0.33579587273822653, 0.23929228930918156, 0.08229807439598488]")),
(174,1715,JSON_ARRAY_PACK("[0.03408977990407908, 0.2956950256670329, 0.13517611113386946, 0.09221515906735812, 0.28307045409684656, 0.25451677890230856, 0.3399580436769727, 0.0024481751364894716, 0.20671592044591144, 0.2449710436290856, 0.330926585226881, 0.13898249092084805, 0.2514757938519619, 0.2661914505890695, 0.13416825635659912, 0.0036819701688747927, 0.2387163481312366, 0.3138887456462762, 0.1165834244533205, 0.2671220456123604]")),
(439,11624,JSON_ARRAY_PACK("[0.22298433483656915, 0.2301148081987591, 0.24588601671975943, 0.08631640560714288, 0.11846557529190216, 0.2626954367632294, 0.4069243940319214, 0.005078829890341869, 0.2034471860455145, 0.07020611349277718, 0.025652983690086232, 0.21537371506698205, 0.21976185688825287, 0.3977187100734922, 0.17750445500843268, 0.23722218998322891, 0.34330593739706566, 0.01875538915483548, 0.24899471453349362, 0.11370202981368821]"))

Agrupamento de documentos por similaridade vetorial/semântica

  • criei uma procedure que compara todos os documentos selecionados previamente por uma similaridade definida, criando grupos de documentos usando a comparação vetorial do SingleStore. Segue abaixo o script para criação das tabelas de apoio e o script para criação da procedure.

  • A procedure usa uma tabela de apoio grupos onde são inseridos os sequenciais dos documentos que serão agrupados e é informado o nome de uma sessão de agrupamento, pois vários agrupamentos podem ocorrer ao mesmo tempo.

  • inserindo documentos para agrupamento:

insert into testes.grupos (seq_documento, sessao)
select seq_documento, 'teste' from testes.vetores v
where seq_documento not in (select seq_documento from testes.grupos where sessao='teste')
limit 1000
  • acionando a procedure para agrupar os documentos selecionados com 90% de similaridade:
call testes.agrupar('teste', 90) 

💡 O primeiro parâmetro é o nome da sessão de agrupamento, nome livre utilizado para verificar o resultado do agrupamento ao final do processo. O segundo parâmetro é a similaridade entre 0-100

  • conferindo o resultado do agrupamento:
select * from testes.grupos 
  where grupo >0 and sessao = 'teste'
order by grupo, sim desc 

exemplo procedure agrupamento

💡 A coluna grupo será preenchida com o número do grupo formado. Será usado -1 para documentos não agrupados por não possuírem documentos semelhantes na relação de documentos da sessão de agrupamento. Será usado o grupo -2 caso o seq_documento informado não tenha vetor na tebela de vetores.

  • conferindo um log do agrupamento:
select * from testes.grupos_logs
  where sessao = 'teste'
order by ordem

exemplo log procedure agrupamento

💡 O log contém um resumo do que está ocorrendo durante o agrupamento, podendo ser consultado por uma chamada de callback para atualizar a interface do usuário com o status do agrupamento para sessões muito grandes (dezenas ou centezas de milhares de vetores).

  • testando a procedure: essa chamada permite receber alguns indicadores que a procedure de agrupamento está funcionando. São verificados se todos os registros foram agrupados corretamente, se as melhores similaridades foram usadas e se os melhores centróides foram escolhidos. Serve como curiosidade ou para quando forem feitos ajustes na procedure de agrupamento.
echo testes.testar_grupos('teste',90)

Mais informações sobre comparação vetorial no SingleStore

  • Quer saber um pouco mais sobreo o uso do SingleStore em comparação vetorial, veja esse conteúdo oficial