与Django(汉明距离)的自定义比较

时间:2015-10-04 16:59:13

标签: python django django-queryset django-orm hamming-distance

我有以下代码,允许我找到相等的图像(相同),但是说我想找到一定数量下汉明距离的图像,可以将其合并到django查询集中,或者原始sql以某种方式?我不想获取所有内容并与python进行比较,因为这非常慢并且我有很多图像。

当前代码:

def duplicates(request):
    duplicate_images = []
    images = Image.objects.all()
    for image in images:
        duplicates = Image.objects.filter(hash=image.hash).exclude(pk=image.pk)
        for duplicate in duplicates:
            duplicate_images.append([image, duplicate])
        if len(duplicate_images) > 1000:
            break

1 个答案:

答案 0 :(得分:0)

以下是使用postgres扩展程序实现此目的的方法:

https://github.com/eulerto/pg_similarity

安装:

$ git clone https://github.com/eulerto/pg_similarity.git
$ cd pg_similarity
$ USE_PGXS=1 make
$ USE_PGXS=1 make install
$ psql mydb
psql (9.3.5)
Type "help" for help.

mydb=# CREATE EXTENSION pg_similarity;
CREATE EXTENSION

不能使用自定义“WHERE”子句创建django查询集以使用hamming_text函数

image = Image.objects.get(pk=1252) # the image you want to compare to
similar = Image.objects.extra(where=['hamming_text(hash,%s)>=0.88'],
                              params=[image.hash])

瞧,它有效!

注意:此处的汉明距离会自动归一化,因此0表示完全不同,1表示相同。