PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL, ट्रिगर और समानता

ट्रिग्राम समानता की अवधारणा किसी भी वाक्य को "ट्रिग्राम" (लगातार तीन अक्षरों के अनुक्रम) में विभाजित करने और परिणाम को एसईटी के रूप में मानने पर निर्भर करती है (यानी:ऑर्डर कोई फर्क नहीं पड़ता, और आपके पास दोहराए गए मान नहीं हैं)। वाक्य पर विचार करने से पहले, शुरुआत में दो रिक्त स्थान जोड़े जाते हैं, और एक अंत में, और एकल रिक्त स्थान को दोहरे द्वारा प्रतिस्थापित किया जाता है।

ट्रिग्राम N-grams के विशेष मामले हैं ।

"शैटो ब्लैंक" के अनुरूप ट्रिग्राम सेट उस पर दिखाई देने वाले तीन अक्षरों के सभी अनुक्रमों को ढूंढकर पाया जाता है:

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

उन्हें क्रमबद्ध करना, और दोहराव निकालना आपको मिलता है:

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

इसकी गणना PostgreSQL द्वारा फ़ंक्शन show_trgm . के माध्यम से की जा सकती है :

SELECT show_trgm('Chateau blanc') AS A

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

... जिसमें 14 ट्रिगर हैं। (pg_trgm चेक करें )।

और "चेटो शेवाल ब्लैंक" के अनुरूप ट्रिग्राम सेट है:

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]

... जिसमें 19 ट्रिगर हैं

यदि आप गणना करते हैं कि दोनों सेटों में कितने ट्रिगर समान हैं, तो आप पाएंगे कि उनमें निम्नलिखित हैं:

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

और उनके पास कुल मिलाकर ये हैं:

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

यानी, दोनों वाक्यों में 14 त्रिकोण समान हैं, और कुल मिलाकर 19 हैं।
समानता की गणना इस प्रकार की जाती है:

 similarity = 14 / 19

आप इसकी जांच कर सकते हैं:

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

और आप देखेंगे कि आपको मिलता है:0.736842

... जो बताता है कि कैसे समानता की गणना की जाती है, और क्यों आपको वे मूल्य मिलते हैं जो आपको मिलते हैं।

नोट:आप चौराहे और संघ की गणना निम्न के द्वारा कर सकते हैं:

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 ;

और यह विभिन्न युग्म वाक्यों की समानता का पता लगाने का एक तरीका है:

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 ;

आप इसे 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. PostgreSQL में current_time कैसे काम करता है

  2. पंक्ति कक्षों को नए स्तंभों के रूप में चुनें

  3. ऑफ़सेट सीमा वाली क्वेरी का चयन बहुत धीमा है

  4. एकाधिक पर्यायवाची शब्दकोश पूर्ण-पाठ खोज में मेल खाते हैं

  5. PostgreSQL में डेटस्टाइल कैसे बदलें?