deerchao的blog

Be and aware who you are.

2007年5月11日

关于通过标签取得相关文章的算法

比如有10000篇文章,每篇可能有0-10个标签,不同的标签共有1000个,用什么算法能最快地获取与指定文章相关度最高的其它文章?

用一个1000bit(归约为1024bit)数据类型来记录每篇文章包含了哪些标签,然后对这个数据进行与运算,以结果里出现的1的个数为标准排序即可。

规模大约为:
数据传输:1024bit=128Byte, 128Byte*10000=128B*10K=1MB(可以缓存,不是太大)
数据运算:比较次数为10000,每次比较1024bit。

得写个示例程序测试一下可行性。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;

public class Test
{
 
static readonly int tagsCount=3000;
 
static readonly int articleCount=30000;
 
static List<BitArray> articleTags=new List<BitArray>(articleCount);


 
public static void Main()
 {
  Stopwatch sw
=new Stopwatch();
  sw.Start();
  
for(int i=0; i<articleCount; i++)
  {
    articleTags.Add(
new BitArray(tagsCount));
  }
  List
<CountAndIndex> countsAndIndex=new List<CountAndIndex>(articleCount);
  
for(int i=0; i<articleCount; i++)
  {
   countsAndIndex.Add(
new CountAndIndex(Count(articleTags[0].And(articleTags[i])), i));
  }
  countsAndIndex.Sort();
  sw.Stop();
  Console.WriteLine(sw.Elapsed);
 }

 
static int Count(BitArray bits)
 {
  
int result=0;
  
foreach(bool bit in bits)
  {
   
if(bit)
    
++result;
  }
  
return result;
 }
}

struct CountAndIndex : IComparable<CountAndIndex>
{
 
public int Count;
 
public int Index;

 
public CountAndIndex(int count, int index)
 {
  Count
=count;
  Index
=index;
 }

 
public int CompareTo(CountAndIndex other)
 {
  
return this.Count.CompareTo(other.Count);
 }
}

1K Tags * 10K articles: 00:00:00.4684715
2K Tags * 20K articles: 00:00:01.7932927
3K tags * 30K articles: 00:00:04.0203271
10K tags * 100K articles: 00:00:44.2125127

基本上与问题规模成线性比例。

规模小于1K*10K时可以即时运算;
大一点可以提供后台运行的服务,异步延迟加载;
大于3K*30K就得在数据库里缓存结果了。

posted @ 2007-05-11 04:17 deerchao 阅读(349) | 评论 (0)编辑

<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

公告

给网络添加价值,就是让自己增加价值.

本博客所有内容,均为原创或对互联网已有资源的再加工,希望对你有用.在声明原作者的前提下,你可以任意使用,但本人对其正确性,使用的后果等不做任何担保,也不负任何责任.

正则表达式30分钟入门教程 v2.21 2007-8-3

I Want Spec#!

与我联系

搜索

 

常用链接

留言簿(66)

我管理的小组

我的标签

随笔档案(127)

文章分类(9)

文章档案(9)

新闻档案(9)

Links

积分与排名

最新评论

评论排行榜