【发布时间】:2010-03-11 15:32:54
【问题描述】:
我想遍历文档数据库并计算成对比较分数。
一个简单的、天真的方法会将一个循环嵌套在另一个循环中。这将导致程序比较文档两次,并将每个文档与其自身进行比较。
是否有有效执行此任务的算法名称? 这种方法有名称吗?
谢谢。
【问题讨论】:
标签: python mysql database logic
我想遍历文档数据库并计算成对比较分数。
一个简单的、天真的方法会将一个循环嵌套在另一个循环中。这将导致程序比较文档两次,并将每个文档与其自身进行比较。
是否有有效执行此任务的算法名称? 这种方法有名称吗?
谢谢。
【问题讨论】:
标签: python mysql database logic
假设所有项目都有一个编号 ItemNumber
简单的解决方案——总是让第二个元素的 ItemNumber 大于第一个元素。
例如
for (firstitem = 1 to maxitemnumber)
for (seconditem = firstitemnumber+1 to maxitemnumber)
compare(firstitem, seconditem)
视觉说明:如果您将比较视为一个矩阵(一个轴上的项目编号,另一个轴上的另一个项目),则会查看其中一个三角形。
........
x.......
xx......
xxx.....
xxxx....
xxxxx...
xxxxxx..
xxxxxxx.
【讨论】:
我认为它不够复杂,不足以获得一个名字。
您可以通过强制比较不同行之间可能不同的任何值来避免重复对 - 主键是一个明显的选择,例如
独特的配对:
SELECT a.item as a_item, b.item as b_item
FROM table AS a, table AS b
WHERE a.id<b.id
可能有很多方法可以使用比较操作来生成数据摘要,从而识别潜在的相似项目 - 对于单个单词,soundex 是一个明显的选择 - 但是你没有说你的比较指标是什么是。
C.
【讨论】:
您可以跟踪已比较过的文档,例如(带数字;))
compared = set()
for i in [1,2,3]:
for j in [1,2,3]:
pair = frozenset((i,j))
if i != k and pair not in compared:
compare.add(pair)
compare(i,j)
另一个想法是首先创建文档组合并对其进行迭代。但是为了生成它,您必须遍历两个列表,然后再次遍历结果列表,所以我认为它没有任何优势。
更新:
如果您的文件已经在列表中,那么 Hogan 的答案确实更好。但我认为它需要一个更好的例子:
docs = [1,2,3]
l = len(docs)
for i in range(l):
for j in range(i+1,l):
compare(l[i],l[j])
【讨论】:
set 和frozenset。我认为,一个集合可以访问 O(1),因为它是作为字典键实现的。
这样的?
src = [1,2,3]
for i, x in enumerate(src):
for y in src[i:]:
compare(x, y)
或者您可能希望生成一个配对列表:
pairs = [(x, y) for i, x in enumerate(src) for y in src[i:]]
【讨论】: