溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用ClickHouse快速判斷兩個(gè)集合的相似度

發(fā)布時(shí)間:2021-07-09 09:29:43 來(lái)源:億速云 閱讀:956 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么用ClickHouse快速判斷兩個(gè)集合的相似度”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么用ClickHouse快速判斷兩個(gè)集合的相似度”吧!

在業(yè)務(wù)中我們經(jīng)常會(huì)遇到查重的需求,例如給定一個(gè)文本字符串,判斷在已有的文檔中,是否存在與其相似的。

想要實(shí)現(xiàn)這類功能的方式有很多種,一種高效的方式是先利用 SinHash 將數(shù)據(jù)降維壓縮成一串哈希值,再利用海明距離(Hamming Distance) 來(lái)比較兩者之間的相似度。

SinHash 是一種局部敏感性哈希算法,特別適合在海量數(shù)據(jù)下的場(chǎng)景使用。

恰好在 ClickHouse 中現(xiàn)在已經(jīng)內(nèi)置了 MinHash 和 海明距離的相關(guān)函數(shù),相關(guān)PR在此: 

https://github.com/ClickHouse/ClickHouse/pull/7649。

接下來(lái)就找個(gè)例子來(lái)體驗(yàn)一下吧。

準(zhǔn)備4個(gè)文本字符串,用 SimHash 函數(shù)計(jì)算它們的哈希值: 

SELECT    ngramSimHash('傳統(tǒng)的hash算法只負(fù)責(zé)將原始內(nèi)容盡量均勻隨機(jī)地映射為一個(gè)簽名值,原理上相當(dāng)于偽隨機(jī)數(shù)產(chǎn)生算法。') AS sh2,    ngramSimHash('傳統(tǒng)的hash算法只負(fù)責(zé)將原始內(nèi)容盡量均勻隨機(jī)地映射為一個(gè)簽名值,原理上相當(dāng)于偽隨機(jī)數(shù)產(chǎn)生算法。') AS sh3,    ngramSimHash('傳統(tǒng)的hash算法只負(fù)責(zé)將原始內(nèi)容盡量均勻隨機(jī)地映射為一個(gè),原理上相當(dāng)于偽隨機(jī)數(shù)產(chǎn)生算法。') AS sh4,    ngramSimHash('SimHash本身屬于一種局部敏感哈希算法,它產(chǎn)生的Hash簽名在一定程度上可以表征原內(nèi)容的相似度。') AS sh5
Query id: 7cf4a1d1-266f-4638-a75c-88ab1d93dbdf
┌──────sh2─┬──────sh3─┬──────sh4─┬───────sh5─┐│ 20645847 │ 20645847 │ 54200087 │ 957490773 │└──────────┴──────────┴──────────┴───────────┘
1 rows in set. Elapsed: 0.004 sec.

從哈希值直觀的來(lái)看,sh2 和 sh3 是兩段完全相同的文本,而 sh4 和 sh5 與 sh2 是有差異的,但是直接通過(guò)哈希值我們并不能判斷它們的相似程度,這個(gè)時(shí)候就需要利用海明距離了。

使用 bitHammingDistance 函數(shù)計(jì)算哈希值之間的差異距離:

SELECT    bitHammingDistance(sh2, sh3) AS `1and2`,    bitHammingDistance(sh2, sh4) AS `1and3`,    bitHammingDistance(sh2, sh5) AS `1and4`FROM (    SELECT        ngramSimHash('傳統(tǒng)的hash算法只負(fù)責(zé)將原始內(nèi)容盡量均勻隨機(jī)地映射為一個(gè)簽名值,原理上相當(dāng)于偽隨機(jī)數(shù)產(chǎn)生算法。') AS sh2,        ngramSimHash('傳統(tǒng)的hash算法只負(fù)責(zé)將原始內(nèi)容盡量均勻隨機(jī)地映射為一個(gè)簽名值,原理上相當(dāng)于偽隨機(jī)數(shù)產(chǎn)生算法。') AS sh3,        ngramSimHash('傳統(tǒng)的hash算法只負(fù)責(zé)將原始內(nèi)容盡量均勻隨機(jī)地映射為一個(gè),原理上相當(dāng)于偽隨機(jī)數(shù)產(chǎn)生算法。') AS sh4,        ngramSimHash('SimHash本身屬于一種局部敏感哈希算法,它產(chǎn)生的Hash簽名在一定程度上可以表征原內(nèi)容的相似度。') AS sh5)
Query id: c5b24238-cf85-4eb0-a77c-0b82a888a439
┌─1and2─┬─1and3─┬─1and4─┐│     0 │     3 │    10 │└───────┴───────┴───────┘
1 rows in set. Elapsed: 0.004 sec.

從結(jié)果可得知:

  • sh2 和 sh3 的海明距離是0,所以它們沒(méi)有差異;

  • sh2 和 sh4 的距離是3,根據(jù)經(jīng)驗(yàn),距離在3以內(nèi)的兩段文本相似度就算很高了;

  • sh2 和 sh5 的距離是10,遠(yuǎn)大于3,所以它們是不同的。

到此,相信大家對(duì)“怎么用ClickHouse快速判斷兩個(gè)集合的相似度”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI