首页
社区
课程
招聘
[原创]挑帖子的程序
2009-1-12 23:35 5937

[原创]挑帖子的程序

2009-1-12 23:35
5937
首先是几个数据
误删率:8%左右
垃圾主题清除率:30%~50%
最终可删除主题:3600+2000
被误删的主题:3600*8%

  标题就很挫,主要原因是我还没给这个项目起名字,放这个项目的文件夹的名字叫“新建文件夹”,笨笨雄问起这个程序就说“那个挑帖子的程序”,于是我也这样叫了。
  在开始介绍之前我要特别感谢笨笨雄,是他把数据挖掘这么好玩的东西介绍了给我。最主要的核心算法也是他写的,虽然他建议我自己写或者根据需要修改,不过那么NB的代码我连注释都不敢加更别谈修改了,他的接口设计的非常合理,用着非常的顺手。每次开始写这个项目之前我都要把他的那个头文件拿出来膜拜一分钟……

下面开始介绍:
 

零、这是个什么程序?
下面是引用笨笨雄当时的说法:
理由:

在没有任何数据支持下,有这么一个猜想.

流量均由用户通过搜索引擎得到页面.

假设用户搜索某个问题的答案,然后他得到看雪某个主题,发现问题没有被解决.OK,下一次依然搜索到看雪论坛的某个主题,他依然去看,假设依然没有找到解答.

问题一: 一个用户数次搜索到看雪论坛的链接, 每次都搜索到没有解答的主题概率是多少.

无论答案是怎么样,以目前的状态,这个概率肯定会越来越大.

问题二:一个用户数次进入看雪论坛的链接,在连续多少次没有得到解答之后会无视所有搜索引擎列出的看雪论坛的主题

无论答案是怎么样,随着没有解答主题的增多,用户的耐性必须趋于无限大,才有可能永远关注看雪论坛

问题三:一个用户在搜索到看雪论坛的链接后也观察看雪论坛精华文章或者其它论坛活动的概率有多大

注册用户(打算长期使用看雪论坛)的在线数和非注册用户(不打算长期使用看雪论坛)的在线数,由两个方面影响,一个是搜索到论坛的用户也关注论坛其它内容概率,以及论坛内容对这些用户是否有用的概率.

通过这个可以不负责任的认为,一个用户带着问题的情况下,搜索到看雪论坛去看跟他问题无关的主题概率不高. 

随着没有回复主题的增加,那些偶尔得到回答的问题是不积累的.最终会被那些没有回复的主题稀释,直到有一天根本就不会有人关注看雪那些曾经被回答的主题 

这个程序就是优化论坛的主题结构,以图留住来自搜索引擎的迷途羔羊。

一、  信息收集
这部分的工作就是把主题的信息和用户的信息从网页里抠出来,放到本地数据库里供后面分析。这个阶段建立了三个表:
Thread表
ID ;帖子ID
nReplys   ;总回复数
nViews   ;总查看数
whoposted   ;参与者列表(表名)
firstreply   ;第一非楼主回复的回复时间(时间差)
postime   ;发表时间
lastreply  ;最后回复时间
activetime   ;活跃时间(lastreply- postime)
jh   ;是否是精华
poster   ;作者ID
-----------------------
PostXXXXXX表 <--参与帖子XXXXXXX的用户ID与参与时间列表
time ;参与时间
ID ;用户ID
-----------------------
User表 <--用户信息
ID
帖子数
精华数
-----------------------
这个阶段有三个我想说的:
1、C语言里的简单正则表达式
sscanf(str, "<td class=\"alt1\" title=\"%[^ ] %[0-9,]%[^ ] %[0-9,]\"", temp, reply, temp, view)

 %[] 你可以在”[]”里添加你要接收的输入。如%[a-f]等价于%[abcdef],这种情况下程序只接收a-f这些输入,^则 是取反的意思,%[^ ]就是接收空格以外的输入。简单,但是足够我把网页里的信息解析出来了。
2、MySQL携带真方便啊,把程序带到网吧去,边DOTA边跑程序,结束把目录一压缩就可以带回来用了。
3、本来1 Collect目录下还有个User文件夹,是用来提取用户信息的,不过我没放进来。因为:1-里面有我的cookie 2-貌似这个程序改一下就可以用来收集会员们的联系方式的,我不想收垃圾邮件。 3-里面并没有什么新东西了

二、  数据分析
1、  Delete1
这一步的目的是删除掉那些发布N久却没人回复的非精华主题,不过后面还需要加一些例外,因为有一些论坛公告是没有回复的。
select ID from thread where (firstreply='0-0-0 0:0:0' or nReplys=0) and postime<'2008-10-1 0:0:0' and jh=0;
    这一步可以干掉2000+

2、  Kill
这一步是要清除那些自己顶自己的帖子。
判断的方法很简单:楼主的回复占总回复数50%以上就判定为Worthless

不过我没有采用,因为误删率的估计很麻烦,没办法估计误删率我就没办法确定对哪个范围的帖子进行处理。
不过可以用这个程序挑出可疑目标进行人肉。

3、  Analysis
这一步是要建立advance表
advance表
ID
entropy   熵,用某公式计算的,可以表示系统的混乱程度
hits     最高连击数(两个相邻的回复之间间隔小于一天则被当成一次连击,连击会因间隔大于一天而中断)
begin DATETIME    最高连击起始时间(与帖子发布时间的时间差)
last DATETIME    最高连击持续时间
rv  reply/view
gmembers   精英会员数
posterscore  发贴者分数score = posts+jh*100

4、  TestData
很明显,这是生成数据的。
我先用它随机生成了1000个测试数据。

有个事情要提一下:
rand()这倒霉孩子产生的数值上限是0x7FFF

5、  HalfKmeaning
啊,终于到核心了,K均值算法登场了。
这个程序根据用户的输入,根据不同的属性组合用K均值算法将提供的数据分成指定数目的类别。

6、  2HTML
将上一步产生的结果转换成网页,查看起来方便些。
产生的网页也可以用来人肉处理结果。效果图如下:
 

7、  GetBsetKind
这一步是把所有的属性组合和分类的数目都跑一遍,以期剔除垃圾属性,找出误删率最低的方案。
这一步的输入是上一步的网页生成的。我把主题分三类:需要保留的、需要删除的和删不删都无所谓的。我和笨笨雄一起人肉了1000个测试数据供这个程序使用。

8、  Use The Centroid
这一步是将上一步里的最低误删率的那个方案的质心拿出来,然后就可以用这些质心来判断一个帖子属于哪个类了

    这是最优质心方案的信息:
7    Keep  Kill    Ignore
Kind0 0.500000 0.214286 0.285714
Kind1 0.465753 0.441096 0.093151
Kind2 0.571429 0.171429 0.257143
Kind3 0.574899 0.340081 0.085020
Kind4 0.750000 0.000000 0.250000
Kind5 0.448276 0.258621 0.293103
Kind6 0.111913 0.765343 0.122744

这一步可以删掉3600+

大家新年快乐哈 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2009-1-12 23:41
2
0
看来你没有太多时间整理你的工作并写出文档。。。。
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
escript 2009-1-12 23:56
3
0
看牛贴受益
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wenyurs 2009-1-13 00:08
4
0
学习了
雪    币: 191
活跃值: (85)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
yigeren 2009-1-13 10:24
5
0
无他,唯膜拜尔
雪    币: 709
活跃值: (2265)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2009-1-13 10:59
6
0
看不懂~
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 7 2009-1-14 08:34
7
0
终于知道牛人是怎么练成的了....时间和耐心,加天赋.
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shco 2009-1-14 12:51
8
0
膜拜之 再膜拜之
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wowzjj 2009-1-16 19:46
9
0
牛贴,学习,再学习。
游客
登录 | 注册 方可回帖
返回