PostgreSQL,三元组和相似性

PostgreSQL,三元组和相似性,第1张

概述只是在我的Mac上测试PostgreSQL 9.6.2并使用Ngrams. 假设酿酒厂有一个GIN三元组指数. 相似性的限制(我知道这已被弃用): SELECT set_limit(0.5); 我正在2,3M行表上构建一个trigram搜索. 我的选择代码: SELECT winery, similarity(winery, 'chateau chevla blanc') AS similarit 只是在我的Mac上测试Postgresql 9.6.2并使用Ngrams.
假设酿酒厂有一个GIN三元组指数.

相似性的限制(我知道这已被弃用):

SELECT set_limit(0.5);

我正在2,3M行表上构建一个trigram搜索.

我的选择代码:

SELECT winery,similarity(winery,'chateau chevla blanc') AS similarity FROM usr_wines WHERE status=1 AND winery % 'chateau chevla blanc'  ORDER BY similarity DESC;

我的结果(在我的Mac上329毫秒):

Chateau ChevL Blanc 0,85Chateau Blanc   0,736842Chateau Blanc   0,736842Chateau Blanc,736842Chateau Cheval Blanc    0,727273Chateau Cheval Blanc    0,727273Chateau Cheval Blanc (7)    0,666667Chateau Cheval Blanc Cbo    0,64Chateau Du Cheval Blanc 0,64

好吧,我不明白“Chateau blanc”有什么相似性>在这种情况下“Chateau Cheval Blanc”?据我所知,这两个词是完全相同的“城堡”和“blanc”,但没有其他词语“cheval”.

还有为什么“Chateau ChevL Blanc”是第一个?缺少一个字母“a”!

好吧,我的目标是在给出酒厂名称时匹配所有可能的重复项,即使它被拼错了.我错过了什么 ?

解决方法 三元组相似性的概念依赖于将任何句子分为“三元组”(三个连续字母的序列),并将结果视为一个SET(即:顺序无关紧要,并且您没有重复的值).在考虑句子之前,在开头添加两个空格,在末尾添加一个空格,单个空格用双精度空格替换.

Trigrams是N-grams的特例.

对应于“Chateau blanc”的三元组通过查找出现在其上的三个字母的所有序列来找到:

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 AA = [  b,c,bl,ch,anc,ate,au,bla,cha,eau,hat,lan,nc,tea]

……有14个三卦. (检查pg_trgm).

对应于“Chateau Cheval Blanc”的三元组是:

SELECT show_trgm('Chateau Cheval Blanc') AS B B = [  b,che,evl,hev,la,tea,vla]

……有19个三卦

如果计算三个三元组共有多少个三元组,你会发现它们有以下几个:

A intersect B =     [  b,tea]

他们总共拥有的是:

A union B =     [  b,vla]

也就是说,两个句子共有14个三元组,总共19个.
相似度计算如下:

similarity = 14 / 19

您可以查看:

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

你会看到你得到:0.736842

…解释了如何计算相似度,以及为什么得到你得到的值.

注意:您可以通过以下方式计算交集和并集:

SELECT    array_agg(t) AS in_commonFROM(    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_totalFROM(    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_2FROM    p )SELECT    same,total,same::real/total::real AS sim_1,sim_2FROM    x ;

你可以在Rextester查看

总结

以上是内存溢出为你收集整理的PostgreSQL,三元组和相似性全部内容,希望文章能够帮你解决PostgreSQL,三元组和相似性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1162464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存