PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL, bát quái và sự tương tự

Khái niệm về sự tương tự của bát quái dựa vào việc có bất kỳ câu nào được chia thành "bát quái" (chuỗi ba chữ cái liên tiếp) và coi kết quả là một BỘ (tức là:thứ tự không quan trọng và bạn không có giá trị lặp lại). Trước khi câu được xem xét, hai dấu cách trống được thêm vào ở đầu và một ở cuối và các dấu cách đơn được thay thế bằng dấu cách kép.

Hình bát quái là một trường hợp đặc biệt của N-gram .

Bộ bát quái tương ứng với "Chateau blanc" được tìm thấy bằng cách tìm tất cả các chuỗi gồm ba chữ cái xuất hiện trên đó:

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

Sắp xếp chúng và loại bỏ các lần lặp lại giúp bạn:

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

Điều này có thể được PostgreSQL tính bằng hàm show_trgm :

SELECT show_trgm('Chateau blanc') AS A

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

... trong đó có 14 bát quái. (Kiểm tra pg_trgm ).

Và bộ bát quái tương ứng với "Chateau Cheval Blanc" là:

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]

... có 19 bát quái

Nếu bạn đếm xem có bao nhiêu bát quái có chung cả hai bộ, bạn sẽ thấy rằng chúng có những bộ sau:

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

và tổng số những thứ họ có là:

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

Tức là cả hai câu đều có chung 14 bát quái và tổng cộng là 19 bát quái.
Điểm giống nhau được tính là:

 similarity = 14 / 19

Bạn có thể kiểm tra nó bằng:

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

và bạn sẽ thấy rằng bạn nhận được: 0.736842

... giải thích cách thức tính tương tự và tại sao bạn nhận được những giá trị mà bạn nhận được.

LƯU Ý:Bạn có thể tính giao điểm và liên hợp bằng:

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 ;

Và đây là một cách để khám phá sự giống nhau của các cặp câu khác nhau:

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 ;

Bạn có thể kiểm tra nó tại 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. Django / PostgreSQL varchar thành UUID

  2. Lỗi PostGres Khi Sử dụng Khác biệt:Postgres LỖI:không thể xác định một toán tử đặt hàng cho bản ghi loại

  3. Heroku - kết xuất và tải một bảng vào cơ sở dữ liệu postgres được chia sẻ

  4. SQL nhóm mối quan tâm / hàng chồng chéo

  5. Kết nối Excel với PostgreSQL qua VBA