文本相似度算法,优化关注事项



我有一个django博客,我正在为它写一个简单的类似的文本算法。下面的代码是我用博客数据库的一个副本测试的代码。(注意:代码最初是用土耳其语编写的,为了方便,我将变量名改为英语。因此,事情可能看起来很奇怪。)

# -*- coding:utf-8 -*-
from django.utils.html import strip_tags
import os
import sys
import math
import re
PROJECT_FOLDER = os.path.abspath(os.path.dirname(__file__))
UPPER_FOLDER = os.path.abspath(PROJECT_FOLDER + "/../")
sys.path.append(UPPER_FOLDER)
os.environ["DJANGO_SETTINGS_MODULE"] = "similarity.settings"
from blog.models import Post
def getWords(post_object):
    all = post_object.title + " " + post_object.abstract + " " + post_object.post
    all = strip_tags(all.lower())
    regex = re.compile("W+",flags=re.UNICODE)
    return re.split(regex,all)
def count_things(what_to_count,the_set):
    num = 0
    for the_thing in the_set:
        if what_to_count in the_thing[1]:
            num += 1
    return num
a = Post.objects.all()
b = []
for post in a:
    b.append((post.title,getWords(post)))
del(a)
def adjustWeight(the_list,the_word):
    numOccr = the_list.count(the_word)
    if numOccr == 0:
        return 0
    else:
        return math.log(numOccr,1.6)

results = []
uniques = []
for i in range(0,len(b)):
    for a_word in b[i][1]:
        if a_word not in uniques:
            uniques.append(a_word)
for i in range(1,len(b)):
    for j in range(0,i):
        upper_part = 0
        sum1 = 0
        sum2 = 0
        for a_word in uniques:
            adjusted1 = adjustWeight(b[i][1],a_word)
            adjusted2 = adjustWeight(b[j][1],a_word)
            upper_part +=  adjusted1 * adjusted2 * math.log(len(b)/count_things(a_word,b))
            sum1 += adjusted1
            sum2 += adjusted2

        lower_part = math.sqrt(sum1 * sum2)
        results.append((b[i][0], b[j][0], upper_part/lower_part))
results = sorted(results, key = lambda x: x[2])
results.reverse()
print("n".join(["%s and %s => %f" % (x,c,v) for x,c,v in results]).encode("utf-8"))
简而言之,

它的作用是比较所有可能的对并输出相似度报告。现在我想把它和我的博客合并。然而,这是一个非常昂贵的代码,所以需要一些优化。这就是我的想法。

我将有一个python文件的cron作业,它将新添加或修改的文本与所有其他文本进行比较,并将相似度分数存储在数据库中以供使用。

我想到的另一件事是,打开另一个表,并在它上面做一些索引,像这样:"post id"word"出现次数",所以不是阅读帖子,每次计数单词,我只是从数据库中读取数据,其中一切都已经完成了。

我想知道你对此有什么看法。因为我不是这方面的专家,所以我想了解一下其他人的想法。

如果要进行基于文本相似度的搜索,最好使用Sphinx这样的搜索服务器:http://sphinxsearch.com/

最新更新