http://www.vanjor.org/blog/2011/05/rs-collaborative-filtering/
集体的力量如钢铁,世人的聪明如日月协同过滤(Collaborative Filtering)是现今推荐体系中应用最为成熟的一个推荐算法系类,它哄骗爱好相投、拥有共同经验之群体的爱好来推荐应用者感爱好的资讯,小我透过合作的机制赐与资讯相当程度的回应(如评分)并记录下来以达到过滤的目标进而帮助别人筛选资讯(参考wiki,文字有点生硬,不过却很好的描述了协同过滤的一个互动性:用户参与用户获益)。
边收拾边写了整整一天o(╯□╰)o
一、靠山
1.1 根蒂根基思惟
简单来说:
- 和你爱好合得来的伴侣喜好的,你也很有可能喜好;
- 喜好一件器材 A,而另一件器材 B 与这件十分类似,就很有可能喜好 B;
- 大师都斗劲合意的,人人都追着抢的,我也就很有可能喜好。
三者均反应在协同过滤的评级(rating)或者群体过滤(social filtering)这种行动特点上。
1.2 相干研究组织
协同过滤上斗劲经典有名的组织贸易有:
- Tapestry(1992):电子邮件分类过滤,解决Xerox公司在Palo Alto的研究中间资讯过载题目。
- GroupLens(1994):推荐体系,在线社区,移动及普适技巧,数字藏书楼,和地理信息体系,见大名鼎鼎的MovieLens电影评分推荐。
- Netflix:研究影视视频在线推荐 。
- Amazon:亚马孙收集书城,为亚马逊每年供献二三十个百分点的创收。
1.3 优毛病
长处:首要从应用者角度来看:
- 可以或许过滤机械难以主动内容解析的资讯,如艺术品,音乐等。也就是基于用户标识等,可以主动归类;
- 共用其他人的经验,避免了内容解析的不完全或不正确,并且可以或许基于一些错杂的,难以表述的概念(如资讯品德、小我咀嚼)进行过滤,直接后天间接性持续进步前辈经验;
- 有推荐新资讯的才能。可以发明内容上完全不类似的资讯,应用者对推荐资讯的内容事先是预感不到的。可以发明应用者潜伏的但本身尚未发明的爱好偏好。(基于类似用户推荐很好的能做到)
- 推荐个性化、主动化程度高。可以或许有效的哄骗其他类似应用者的回馈资讯。加快个性化进修的速度。
毛病:首要从设计与实现的角度
- 新应用者题目(New User Problem): 体系开端时推荐品德较差 ;
- 新项目题目(New Item Problem) :品德取决于汗青材料集 ;
- 稀少性题目(Sparsity):体系汗青数据过少,难以进行正确的模式查找匹配推荐 ;
- 体系延长性题目(Scalability):新加User或者Item时,体系须要增长策画负荷量大。
1.4 对于当前推荐体系的题目的一些测验测验解决
本末节参考《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions》的2.2节翻译。
新用户题目
为了使推荐体系加倍正确,体系必须从用户的评分中学惯用户的偏好,有很多办法测验测验这方面研究,它们大多半应用混淆推荐模型,包含了基于内容以及协同过滤推荐办法。别的的一种办法是发掘一些条目供给给新用户来进行评级,以便快速学惯用户的偏好。这些发掘条目标技巧是基于项目标风行度,项目标熵,用户个性化,以及以上技巧的糅合。
新项目题目
新的项目会经常添加到推荐体系中,协同过滤根蒂根基上是经由过程用户的偏好进行推荐,如许,直到新的项目被足够数量的用户进行评级,推荐体系才有可能推荐它,这个题目同样是经由过程混淆推荐办法来解决。
数据稀少性
在很多推荐体系中,已经获获得的评级数据比拟全部待猜测的项只是很小的一项目组,那么从一个很小的样例数据集中高效的猜测评分是很首要的。同样推荐体系的成功在于拥有足够数量的用户,列于,在电影推荐体系中,有很多电影只被小项目组用户评级,并且这些电影会很少被推荐,即使那小项目组用户赐与很高评级。同样,对于那些有着不合咀嚼的小众群体,找不到雷同特定同口味的用户,也导致较差的推荐成果了。
一个降服数据稀少性题目的办法,是经由过程应用用户材料信息来策画用户类似度。也就是,两个用户会被认为类似不只单在雷同的电影评级类似,并且也有可能属于同一小我口统计区块(demographic),比如,用户的性别,春秋,居住地,教导景象,工作信息。这种基于传统协同过滤的扩大办法称为demographic filtering。详见M. Pazzani, 《A Framework for Collaborative, Content-Based, and Demographic Filtering, Artificial Intelligence Rev》
别的的一个测验测验在于发掘被推荐出的用户之间的类似性,在客户的汗青交易和反馈数据中,经由过程接洽关系检索框架,以及相干传播扩散算法来发明客户间的可传递性接洽关系。
别的的一个路子解决思路是,是经由过程一种降维技巧( dimensionality reduction ),奇怪值分化(SVD:Singular Value Decomposition ),来降落稀少矩阵的维度。SVD是今朝一个已知的矩阵分化技巧,来为原始矩阵求的最好的低维近似。详见B. Sarwar, 的《Application of Dimensionality Reduction in Recommender Systems—A Case Study》
二、分类概述
2.1 推荐体系概况
协同过滤作为推荐体系中的一个主流办法路子,在推荐体系中所处地位是怎么样的呢,下面首要对推荐体系的办法类别进行介绍,从两种不合的角度上,推荐体系中办法技巧分类首要有以下两种分类:
从研究对象办法上的一种分类
起首参考Adomavicius, G的论文《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions》
推荐体系中的总体办法有:
- 基于内容的推荐(Content-based recommendations):体系会基于用户前次喜好的一个项目推荐类似的项目;
- 协同过滤推荐(Collaborative recommendations):基于寻找雷同评为与偏好的人群进行推荐;
- 混淆推荐(Hybrid approaches):融合基于内容以及协同过滤推荐办法。
并且论文中总结的近况技巧分类概述如下图:
从应用算法架构上分类
参考Carleton College, Northfield, MN.官方网站上:
- 启发式推荐算法(Memory-based algorithms):是体系过滤思惟中的一种算法,每次推荐都须要调用这全部评级数据库的内容,即对于一个用户,策画与其他所有其他用户的类似度,对于用户没有碰到的新项目,将会哄骗类似度权重及其他用户的评分加权猜测当前用户对于这个新项目标潜伏评分。但这种每次策画量过大
- 基于模型推荐算法(Model-based algorithms):从评级数据集中建树一个模型,也就是从数据库中抽取一个模型数据,然后每次推荐都是基于模型数据进行策画并推荐,如许不消每次都调用全部数据库,进步了速度与体系伸缩性。大致包含:
- Item-based collaborative filtering
- Personality Diagnosis
- SVD
- 接洽关系规矩算法(Association Rules):接洽关系规矩测验测验发明不合项目之间的因果关系,一个关键规矩本质上是一种(A1, A2, A3, … =>B1, B2, B3,…) 的情势,测验测验显现一个序列决意别的的一个序列。首要由两项目组构成:一个是接洽关系决定计划,一个是对应的置信度。
- 接洽关系决定计划:即若是A => B, C, 那么若是Item A呈如今或人的汗青记录里面,那么可以揣度B和C也很可能呈如今那边。
- 置信度:注解对应的接洽关系决定计划有多么靠得住,局限为[0, 1]的一个区间,若是置为1,那么申明上述决定计划总能成立,若是为0,注解这个决定计划从来不会正确。
2.2 协同过滤基本分类
协同过滤实际上与推荐体系中的其他办法是交错叠加的,没有一个明白的界线,推荐体系的办法测验测验都有连络协同过滤的思惟身分去实现,参考wiki百科中协同过滤大体可以分为三类:
- 基于用户协同过滤(User – based):基于策画类似用户用以推荐
- 基于项目协同过滤(Item – based):基于策画类似项目用以推荐
- 基于模型协同过滤(Model- based):基于原始数据中抽取出模型,基于模型策画并用以推荐
三、协同过滤三大分类
3.1 基于用户协同过滤(User-based)
用类似统计的办法获得具有类似爱好或者爱好的相邻应用者,最早是在1994年由来自美国Minnesota大学Paul Resnick等人揭晓的《GroupLens: An Open Architecture for Collaborative Filtering of Netnews》一文中提出的。
办法根蒂根基步调
1. 收集应用者资讯
收集可以代表应用者爱好的资讯。概括首要分为两类:
- 主动评分(显式评分):基于用户的直接打分数据,如评分,爱好等级,like/dislike
- 被动评分(隐式评分):是按照顾用者的行动模式由体系庖代应用者完成评价,不须要应用者直接打分或输入评价材料,如电子商务中的购买记录,视频网站用户观察迟疑记录、收藏记录,甚至是评论文本概念定见发掘等进行广泛深度的数据发掘。
2. 比来邻搜刮(Nearest neighbor search, NNS)
以应用者为根蒂根基(User-based)的协同过滤的出发点是与应用者爱好爱好雷同的另一组应用者,就是策画两个应用者的类似度。
例如:寻找n个和A有类似爱好应用者,把他们对M的评分作为A对M的评分猜测。一般会按照材料的不合选择不合的算法。
今朝较多应用的类似度算法有:
- 皮尔森相干系数:Person Correlation Coefficient
- 余弦类似度:Cosine-based Similarity
- 改正余弦类似度:Adjusted Cosine Similarity
3. 产生推荐成果
有了比来邻凑集,就可以对目标应用者的爱好进行猜测,产生推荐成果。
根据推荐目标不合情势的推荐,较常见的推荐成果有Top-N 推荐和接洽关系推荐。
- Top-N 推荐:是针对个别应用者产生,对每小我产生不一样的成果,例如:透过对A应用者的比来邻应用者进行统计,选择呈现频率高且在A应用者的评分项目中不存在的,作为推荐成果。
- 接洽关系推荐:对比来邻应用者的记录进行接洽关系规矩(association rules)发掘。
优毛病
- 长处:在数据集完美,内容雄厚下,正确率较高,并且可以或许避开项目内容上的发掘进行正确推荐,对够对项目接洽关系性,用户偏好进行隐式透明的发掘。
- 毛病:跟着应用者数量的增多,策画的时候就会变长,新用户题目,以及数据稀少性题目是导致效力与伸缩性上均不足
3.2 基于项目协同过滤(Item-based)
鉴于基于用户的协同推荐算法跟着应用者数量的增多,策画的时候就会变长,最早是在2001年由Sarwar提出了基于项目标协同过滤推荐算法《Item-based Collaborative Filtering Algorithms》中所提出的。
基于项目协同过滤在于透过策画项目之间的类似性来庖代应用者之间的类似性。
所建树的一个根蒂根基的假设:”可以或许引起应用者爱好的项目,必然与其之前评分高的项目类似”,通俗的来说:根蒂根基上喜好《长尾理论》的人,都邑去看《世界是平的》,不知道你怎么想,反正豆瓣推荐体系就是这么认为的。
办法步调:
1. 收集应用者资讯
同以应用者为根蒂根基(User-based)的协同过滤。
2. 针对项目标比来邻搜刮
先策画己评价项目和待猜测项目标类似度,并以类似度作为权重,加权各已评价项目标分数,获得待猜测项目标猜测值。
例如:要对项目 A 和项目 B 进行类似性策画,要先找出同时对 A 和 B 打过分的组合,对这些组合进行类似度策画,常用的算法同基于应用者(User-based)的协同过滤。
3. 产生推荐成果
在用户应用评价一个商品感爱好后,会主动搜寻改商品类似度最大的前N项条目。
优毛病:
长处:以项目为根蒂根基的协同过滤不消推敲应用者间的差别,所以精度斗劲差。然则却不须要应用者的汗青材料,或是进行应用者辨认。对于项目来讲,它们之间的类似性要稳定很多,是以可以离线完成工作量最大的类似性策画步调,从而降落了线上策画量,进步推荐效力,尤其是在应用者多于项目标景象下尤为明显。
毛病:但其仍有很多题目须要解决,最典范的有稀少题目(Sparsity)和冷启动题目(Cold-start),开端时结果较差。此外还有新应用者题目和算法结实性等题目。
3.3 基于模型的协同过滤(Model- based)
以应用者为根蒂根基(User-based)的协同过滤和以项目为根蒂根基(Item-based)的协同过滤统称为以记忆为根蒂根基(Memory based)的协同过滤技巧,他们共有的毛病是材料稀少,难以处理惩罚大数据量下的即时成果,是以成长出以模型为根蒂根基的协同过滤技巧。
以模型为根蒂根基的协同过滤(Model-based Collaborative Filtering)是先用汗青材料获得一个模型,再用此模型进行猜测。以模型为根蒂根基的协同过滤广泛应用的技巧包含Latent Semantic Indexing、Bayesian Networks…等,按照对一个样本的解析获得模型。
四、类似度策画算法
4.1 概述
类似度策画算法可以用于策画用户或者项目类似度。
以项目类似度策画(Item Similarity Computation)为列,通性在于都是从评分矩阵中,为两个项目i,j遴选出共同的评分用户,然对这个配实用户的评分向量,进行策画类似度si,j,
由参考1,参考2如下图:行代表用户,列代表项目
(重视到是从i,j向量中抽出共有的评论,构成的一对向量,进行类似度策画),
-
- 皮尔森相干系数:Person Correlation Coefficient
- 余弦类似度:Cosine-based Similarity
- 改正余弦类似度:Adjusted Cosine Similarity
4.2 皮尔森相干系数
皮尔森相干系数也是一种基于相干系数的类似度策画办法,一般为了使策画成果正确,须要找出共同评分的用户。
记用户集U为既评论了 i 又评论了 j 的用户集,那么对应的皮尔森相干系数策画公式为:
(此中Ru,i 为用户u 对项目 i 的评分,对应带横杠的为这个用户集U对项目i的评分评分)
4.3 余弦类似度
两个项目 i ,j 视作为两个m维用户空间向量,类似度策画经由过程策画两个向量的余弦夹角,那么,对于m*n的评分矩阵,i ,j 的类似度sim( i , j ) 策画公式:
(此中 " · "记做两个向量的内积)
4.4 改正余弦类似度
余弦类似度策画并没有推敲到不合的用户的评分标准差别性,也就是说有的用户评分更宽容广泛打分较高,有的用户评分更严格,广泛打分较低。改正余弦类似度正式为了降服这一毛病,经由过程求出每位用户的均匀打分,调剂评分向量为评分误差向量,再进行求解余弦类似度。
(此中带横杠的为第u个用户的均匀评分)
4.5 基于项目类似度与基于用户类似度的差别
上述三个类似度公式是基于项目类似度场景下的,而实际上,基于用户类似度与基于项目类似度策画的一个根蒂根基的差别是,基于用户类似度是基于评分矩阵中的行向量类似度求解,基于项目类似度策画式基于评分矩阵中列向量类似度求解,然后三个公式分别都可以实用,如下图:
(此中,为0的默示未评分)
- 基于项目类似度策画式策画如Item3,Item4两列向量类似度;
- 基于用户类似度策画式策画如User3,User4量行向量类似度。
终极的策画公式办法均雷同。具体可具体参考《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions》2.2节
4.6 类似度策画不足与改进
基于评分矩阵类似度策画所面对的一个机能题目,数据稀少下,精度很差,因为类似度策画是基于寻找拥有配实用户评分的项目或者共同项目评分的用户,在数据稀少下,两个向量中空值过多,导致策画共同评分维度过低,甚至就没有共同评分。
对于数据稀少性这种景象下,一个测验测验的路子是进行对评分矩阵进行填充。
填充规矩有很多,一种通用的办法是,填充均分,具体如下两种:
- 基于用户均分:填充对应用户的均匀打分
- 基于项目均分:基于对应项目标均匀打分
(基于用户均分填充) (基于项目均分填充)
五、协同过滤急迅实践
5.1 概述
起首参考Slope one的wiki百科的一段话(此章节遵守Slope one的wiki百科从头收拾):
当可以对一些项目评分的时辰,比如人们可以对一些器材给出1到5星的评价的时辰,协同过滤意图基于一个个别畴昔对某些项目标评分和(重大的)由其他用户的评价构成的数据库,来猜测该用户对未评价项目标评分。
In this context, item-based 协同过滤体系[按照其它项目标评分来猜测某项目标分值,一般办法为 线性回归 (f(x) = ax + b). 于是,当有1000个项目时,须要列多达1,000,000个线性回归方程, 以及多达2,000,000个回归量。除非我们只选择某些用户共同评价过的项目对,不然协同过滤会碰到过适 题目。
别的一种更好的办法是应用更简单一些的式子,比如 f(x) = x + b:实验证实当应用一半的回归量的时辰,该式子(称为Slope One)的发挥解析有时优于[2] 线性回归方程。该简化办法也不须要那么多存储空间和延迟。
基于奥卡姆剃刀原则:“切勿浪费较多器材,去做‘用较少的器材,同样可以做好的工作’。”
基于项目类似度协同过滤的一种简化的思惟Slope One算法也就反应出了加倍实用之处。
附带一句,关于推荐体系等算法,急迅开辟实现,可以测验测验看下《集体聪明编程》(Programming Collective Intelligence),Python实现。
5.2 Slope One算法
为了大大削减过适的产生,提拔算法简化实现, Slope One 系列易实现的Item-based协同过滤算法被提了出来。本质上,该办法应用更简单情势的回归表达式(f(x) = x + b) 和单一的参数,而不是一个项目评分和另一个项目评分间的线性回归 (f(x) = ax + b)。 该参数只不过就是两个项目评分间的均匀差值。甚至在某些实例傍边,它比线性回归的办法更正确[2],并且该算法只须要一半(甚至更少)的存储量。
基起原根蒂根基理
如下图评分矩阵:
基于UserA对Item1与Item2的评分,以及UserB对Item1的打分,Slope One算法思惟对于UserB对于Item2的猜测评分为 2 +(1.5-1)=2.5.
从这里可以看出,Slope One的思惟是,每次只着眼两点,因为两点断定一条直线嘛,并且对于这两点Item 1与Item2,User A都经过,User B经过此中1点,Slope One思惟假设User B与User A这条直线发挥解析同一斜率:
应用处景
如下图评分矩阵
要猜测Lucy对项目1的评分:
- 项目1与项目2间的均差值(5-3)+(3-4)/2 =0.5,(John线与Mark线)
- 项目1与项目3间的均差值(5-2)/1 =3(John线)
那么Lucy对于项目1的评分猜测可以基于项目1与项目2,以及项目1与项目3的两个均差值,3项线来猜测,项线几道对应均差值的权重上。也就有
rate(lucy,项目1)=((0.5+2)*2+(3+5)*1)/(2+1)=4.33
想要实现 Slope One,只须要策画并存储“n”对评分间的均匀差值和评价数量即可。
算法错杂度
设有“n”个项目,“m”个用户,“N”个评分。策画每对评分之间的差值须要n(n-1)/2 单位的存储空间,最多须要 m*n*n步.
假设用户已经评价了最多 y 个项目, 那么策画不跨越n*n+m*y*y个项目间策画差值是可能的。
若是一个用户已经评价过“x”个项目,猜测单一的项目评分须要“x“步,而对其所有未评分项目做出评分猜测须要最多 (n-x)x 步. 当一个用户已经评价过“x”个项目时,当该用户新增一个评价时,更新数据库须要 x步。
可以经由过程分别数据(参照分别和稀少存储(没有共同评价项目标用户可以被忽视)来降落存储请求。
还不想亲身实现?找开源吧
开源的Slope one的法度包
Python:
http://www.serpentine.com/blog/2006/12/12/collaborative-filtering-made-easy/
Java:
http://taste.sourceforge.net/
http://www.daniel-lemire.com/fr/documents/publications/SlopeOne.java
http://www.nongnu.org/cofi/
PHP:
http://sourceforge.net/projects/vogoo
http://www.drupal.org/project/cre
http://www.daniel-lemire.com/fr/documents/publications/webpaper.txt Slope one算法作者写的,简单了然。
5.3 Amazon的item-to-item专利算法
在加倍广泛的场景中,人们并不老是能给出评分,当用户只供给二元数据(购买与否)的时辰,就无法应用Slope One 和其它基于评分的算法。然则却有一个更简单更简单的办法:Amazon的 item-to-item 专利算法
item-to-item算法是二元 item-based协同过滤应用的例子之一,该算法顶用二元向量默示用户-项目购买关系的矩阵,并策画二元向量间的cosine相干系数。
如以下应用处景:
- 在本例傍边,项目1和项目2间的cosine相干系数为:
- 项目1和项目3间的cosine相干系数为:
- 而项目2和项目3的cosine相干系数为:
于是,浏览项目1的顾客会被推荐买项目3,而浏览项目2的顾客会被推荐买项目3,浏览了项目3的会被推荐买1(并由1推荐2)。该模型只应用了每对项目间的一个参数(cosine相干系数)来产生推荐。是以,若是有n个项目,则须要策画和存储 n(n-1)/2次cosine相干系数。
六、算法评价指标
推荐体系,协同过滤范畴,在科学研究上的一些评价指标首要有MAE,AUC,MAP,P@N,P·R·F曲线。而实际应用中还要推敲到体系伸缩性,算法错杂度,等等,那些就不说了,P·R·F指标参考我之前的一篇文章:《信息检索根蒂根基评价指标-P·R·F》
以下指标具体界定参考论文《Mining mood-specific movie similarity with matrix factorization for context-aware recommendation》及《New Approaches to Mood-based Hybrid Collaborative Filtering》
6.1 均匀绝对误差 MAE(Mean Absolute Error)
经由过程策画猜测的用户评分与实际的用户评分之间误差来怀抱。首要连络交叉验证来实现,公式如下:
(此中,g(authentic)为真实评分,g(prediction)为猜测评分,Gtest,为全部待猜测用户评分集)
6.2均匀正确率MAP(Mean Aaverage Precision)
MAP是信息检索中解决P·R·F指标的不足,而提出的,其规范的定义是,设P(R)为体系在召回率为R时的正确率。
单个主题的均匀正确率是每篇相干文档检索出后的正确率的均匀值。主凑集的均匀正确率(MAP)是每个主题的均匀正确率的均匀值。 MAP 是反应体系在全部相干文档上机能的单值指标。体系检索出来的相干文档越靠前(rank 越高),MAP就可能越高。
一个简单的比方就是(参考):
设有两个主题,主题1有4个相干网页,主题2有5个相干网页。某体系对于主题1检索出4个相干网页,其rank分别为1, 2, 4, 7;对于主题2检索出3个相干网页,其rank分别为1,3,5。
对于主题1,均匀正确率为(1/1+2/2+3/4+4/7)/4=0.83。
对于主题 2,均匀正确率为(1/1+2/3+3/5+0+0)/5=0.45。
则MAP= (0.83+0.45)/2=0.64。
应用与协同过滤中的衡量时,也便是测量体系返回推荐项目对应真实用户爱好偏好的排名的均匀正确率。公式如下:
此中:U为测试用户集,|U|默示用户集的数量,| Ri |默示用户 ui 相干的项目(如电影)数据, ri,j 默示体系为用户ui 推荐的第 j 个相干项目对于用户 ui 实际的偏好排名。
6.3 P@n测度
测量对于给定用户ui,前n推荐项目中相干项所占比率。如下公式
6.4 AUC(Area Under Curve)
对于用户u,推荐机能AUC 衡量指标策画公式如下:
此中h(x)是一个指标函数,即若参数值x>0或者逻辑真,着函数值为1,不然为0,Pair(u)是一组用户u待策画的配对集值:
此中Tr(u)是练习集顶用户u已经有的项目集,Ts(u)为测试集顶用户实际预期应当被推荐的项目,实际上,这里面的 n 也就是测试集不该该被推荐的项目。AUC取值[0,1],最好的就是1了。
其实以上可以看出,AUC是相对其他正确率测度最不直接的一个,来由是AUC涉及到所有配对,包含相干的项目以及不相干的项目(那些即不呈如今练习集,也不呈如今测试集中),尽管如此,因为凡是数据集中不相干的项目比相干项目多得多,注解了AUC可以对于项目排序的变更没有那么敏感。
一些参考:
- http://zh.wikipedia.org/zh-cn/%E5%8D%94%E5%90%8C%E9%81%8E%E6%BF%BE
- http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/
- http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/svd.html
- http://wenku.baidu.com/view/e12b10ea81c758f5f61f67fb.html
- http://zh.wikipedia.org/wiki/Slope_one
- http://www.kuqin.com/algorithm/20080903/16387.html
- http://www.cnblogs.com/kuber/archive/2008/06/10/1216846.html
- 更多参照文章中的链接