【问题标题】:Custom comparisons with Django (hamming distance)与 Django 的自定义比较(汉明距离)
【发布时间】:2016-01-01 08:45:42
【问题描述】:

我有以下代码可以让我找到相等的图像(相同),但是说我只想找到汉明距离低于某个数字的图像,可以将其合并到 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

【问题讨论】:

  • 我的数据库中已经有了哈希值,实现一个比较汉明距离的函数很容易,这不是我的问题,但谢谢。

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


【解决方案1】:

下面是如何使用 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 表示相同。

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 2017-09-10
    • 1970-01-01
    • 2015-03-21
    • 2012-03-10
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多