PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL, trygramy i podobieństwa

Pojęcie podobieństwa trygramów polega na podzieleniu dowolnego zdania na „trygramy” (sekwencje trzech kolejnych liter) i potraktowaniu wyniku jako SET (tzn. kolejność nie ma znaczenia i nie ma powtarzających się wartości). Przed rozpatrzeniem zdania, dwie spacje są dodawane na początku i jedna na końcu, a pojedyncze spacje są zastępowane podwójnymi.

Trygramy są szczególnym przypadkiem N-gramów .

Zestaw trygramów odpowiadający "Chateau blanc" można znaleźć, znajdując wszystkie sekwencje trzech liter, które się na nim pojawiają:

  chateau  blanc
---                 => '  c'
 ---                => ' ch'
  ---               => 'cha'
   ---              => 'hat'
    ---             => 'ate'
     ---            => 'tea'
      ---           => 'eau'
       ---          => 'au '
        ---         => 'u  '
         ---        => '  b'
          ---       => ' bl'
           ---      => 'bla'
            ---     => 'lan'
             ---    => 'anc'
              ---   => 'nc '

Sortowanie ich i usuwanie powtórzeń daje Ci:

'  b'
'  c'
' bl'
' ch'
'anc'
'ate'
'au '
'bla'
'cha'
'eau'
'hat'
'lan'
'nc '
'tea'

Może to zostać obliczone przez PostgreSQL za pomocą funkcji show_trgm :

SELECT show_trgm('Chateau blanc') AS A

A = [  b,  c, bl, ch,anc,ate,au ,bla,cha,eau,hat,lan,nc ,tea]

... który ma 14 trygramów. (Sprawdź pg_trgm ).

A zestaw trygramów odpowiadający „Chateau Cheval Blanc” to:

SELECT show_trgm('Chateau Cheval Blanc') AS B 

B = [  b,  c, bl, ch,anc,ate,au ,bla,cha,che,eau,evl,hat,hev,la ,lan,nc ,tea,vla]

... który ma 19 trygramów

Jeśli policzysz, ile trygramów łączy oba zestawy, okaże się, że mają one następujące:

A intersect B = 
    [  b,  c, bl, ch,anc,ate,au ,bla,cha,eau,hat,lan,nc ,tea]

a te, które mają w sumie to:

A union B = 
    [  b,  c, bl, ch,anc,ate,au ,bla,cha,che,eau,evl,hat,hev,la ,lan,nc ,tea,vla]

Oznacza to, że oba zdania mają 14 trygramów wspólnych, a łącznie 19.
Podobieństwo jest obliczane jako:

Podobieństwo
 similarity = 14 / 19

Możesz to sprawdzić:

SELECT 
    cast(14.0/19.0 as real) AS computed_result, 
    similarity('Chateau blanc', 'chateau cheval blanc') AS function_in_pg

a zobaczysz, że otrzymasz:0.736842

... co wyjaśnia, jak podobieństwo jest obliczane i dlaczego otrzymujesz wartości, które otrzymujesz.

UWAGA:Przecięcie i sumę można obliczyć za pomocą:

SELECT 
   array_agg(t) AS in_common
FROM
(
    SELECT unnest(show_trgm('Chateau blanc')) AS t 
    INTERSECT 
    SELECT unnest(show_trgm('chateau chevla blanc')) AS t
    ORDER BY t
) AS trigrams_in_common ;

SELECT 
   array_agg(t) AS in_total
FROM
(
    SELECT unnest(show_trgm('Chateau blanc')) AS t 
    UNION 
    SELECT unnest(show_trgm('chateau chevla blanc')) AS t
) AS trigrams_in_total ;

A to jest sposób na zbadanie podobieństwa różnych par zdań:

WITH p AS
(
    SELECT 
      'This is just a sentence I''ve invented'::text AS f1,
      'This is just a sentence I''ve also invented'::text AS f2
),
t1 AS
(
    SELECT unnest(show_trgm(f1)) FROM p
),
t2 AS
(
    SELECT unnest(show_trgm(f2)) FROM p
),
x AS
(
    SELECT
        (SELECT count(*) FROM 
            (SELECT * FROM t1 INTERSECT SELECT * FROM t2) AS s0)::integer AS same,
        (SELECT count(*) FROM 
            (SELECT * FROM t1 UNION     SELECT * FROM t2) AS s0)::integer AS total,
        similarity(f1, f2) AS sim_2
FROM
    p 
)
SELECT
    same, total, same::real/total::real AS sim_1, sim_2
FROM
    x ;

Możesz to sprawdzić na Rextester



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PG::Error:ERROR:nieprawidłowa sekwencja bajtów do kodowania UTF8:0xfc

  2. Liczenie według najwcześniejszej daty znalezionej w sprzężeniu wewnętrznym?

  3. Jak zadeklarować tablicę typu rowtype w funkcji PostgreSQL?

  4. narzędzie do porównywania postgres

  5. Django JSONField wewnątrz ArrayField