本篇內(nèi)容主要講解“怎么用ClickHouse快速判斷兩個(gè)集合的相似度”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么用ClickHouse快速判斷兩個(gè)集合的相似度”吧!
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出歙縣免費(fèi)做網(wǎng)站回饋大家。
在業(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í)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!