Python 在数据库django中查找类似数据

Python 在数据库django中查找类似数据,python,django,database,similarity,Python,Django,Database,Similarity,对于我的大学项目,我正在开发一个网站,你可以搜索一本书,它会显示类似的书。我正在使用Django,我需要帮助查找相似项,尤其是在字符串字段中 from django.db import models class Genre(models.Model): name = models.CharField(max_length = 100) def __str__(self): return self.name class Book(models.Model):

对于我的大学项目,我正在开发一个网站,你可以搜索一本书,它会显示类似的书。我正在使用Django,我需要帮助查找相似项,尤其是在字符串字段中

from django.db import models

class Genre(models.Model):
    name = models.CharField(max_length = 100)

    def __str__(self):
        return self.name

class Book(models.Model):
    titleid = models.CharField(max_length = 100)
    title= models.CharField(max_length = 500)
    rating = models.IntegerField(blank=True, null=True)
    genre = models.ManyToManyField(Genre)


    def __str__(self):
        """Unicode representation of Film."""
        return self.primarytitle
我只想为我的项目总共增加100本书,但如果我能以一种未来我能增加1000本书的方式来开发它,而且速度还是一样的话,那就太完美了。 对于评级,它是一个评级数(从0到5)*投赞成票的人数。我从古德雷兹那里得到这些数据。例如,如果一本书的分数为5,10人投票,这与一本书的分数为5,100万票不同。第一个评级为50,第二个评级为500万。从其他帖子中,我了解到,对于整数,我可以从它们的评级中得到差值的绝对值,并以这种方式进行排序。因此,一本拥有450万和100万张选票的书比一本得分为5但拥有50万张选票的书更接近上述书,因为评级分别为450万和250万

但是我不希望评级是唯一要考虑的事情。我也要考虑体裁。例如,一本有500万级评级和恐怖、幻想类型的书与一本有450万级评级的书《恐怖、幻想、成熟》比一本有500万级评级但属于成人类型的书《浪漫》更为相似

我怎样才能创造出能找到这种相似性的东西呢?如果我能做到这一点的体裁,然后我可以添加其他功能,如作者以及。但是我不知道如何根据一个字符串的类型来找到相似性

对于我写的绝对值:

import csv
from collections import OrderedDict
source = csv.DictReader(open('sample.tsv','r',encoding='utf-8'),delimiter ='\t')
bookdict= {}

for row in source:
    totalscore = float(row['avgRating'])* int(row['numVotes'])
    bookdict[row['bookid']] = int(totalscore)

absdict ={}

for key in bookdict:
    diff =int(abs(#specific book rate#- bookdict[key]))
    absdict[key] = diff

simlarbooks = OrderedDict(sorted(absdict.items(), key=lambda t: t[1]))

for book in simlarbooks :
    print(book ,simlarbooks[book])

如果您能为我提供有关音乐类型和其他弦乐部分的建议,我将不胜感激。

看看搜索引擎是否更好?就像Haystack+Whoosh(作为开始,也要复杂得多——Solr和ElasticSearch)。@Chiefir非常感谢。我查看了他们的网站。据我所知,他们根据文本的相似性搜索这些数据。正如他们提到的,我应该将相关对象,如多对多关系,转换为字符串。因此,一本以幻想、恐怖为题材的书变成了一连串的“幻想、恐怖”,根据我的理解,“幻想、恐怖”与“恐怖、幻想”并不是百分之百的匹配,后者是错误的。它是。这也是我使用difflib时遇到的问题。对于“恐怖,幻想”和“幻想,恐怖”,它并没有给我100%的匹配。我应该如何解决?1)可能会尝试强制转换
.lower()
?2) 我使用了H+W,发现它的
更像
提供了出色的匹配结果,所以可以测试它吗?也可以在我的个人资料中搜索我关于比较字符串相似性的问题(我现在来自智能手机,可以通过应用程序找到链接)-可能这也会对您有所帮助。第二种情况下-如果您有短字符串-可能会尝试拆分它们,然后使用
itertools.permutations
(如果我没记错的话)检查任何组合是否与给定查询匹配。