作者Yaowei (成就你的大事)
看板perl
标题[问题] 好像一个有点难度的问题= =?
时间Thu Mar 29 22:37:50 2007
假设我有以下的资料:
T1 T2 T3 T4 T5
Doc1 1 2 0 0 1
Doc2 3 1 2 3 0
Doc3 3 0 0 0 1
Doc4 2 1 0 3 0
Doc5 2 2 1 5 1
但我想计算哪几个词是相似的,因此我使用两个词之间的计算出来的分数
来决定它们之间是否相似(假设如果大於一个给定的值10的话)
1st:
由於一开始没有决定谁与谁相似,因此,我先指定T1自己为一组==>C1={T1}
2nd:
因此,接下来会进行C1与T2的计算,计算如下:
C1 = <1, 3, 3, 2, 2>, T2 = <2, 1, 0, 1, 2>.
SIM(T2, C1) = 1*2 + 3*1 + 3*0 + 2*1 + 2*2 = 11
由於SIM(T2, C1) = 11 >10,因此T2被认定与C1同一组
所以,现在变成C1 = {T1, T2} 为一组,但由於T1,T2同一组後,要重新计算其权重值
因此,新的权重值为:
C1 = <(1+3)/2, (3+1)/2, (3+0)/2, (2+1)/2, (2+2)/2> = <3/2, 4/2, 3/2, 3/2, 4/2>
3rd:
接下来又去计算与T3的相似程度以决定是否要归在同组
SIM(T3, C1) = 0 + 8/2 + 0 + 0 + 4/2 =
6 <10
所以T3和C1不同组
==>C1 = {T1, T2} C2 = {T3}
4th:
接下计算T4与C1 及 T4与C2的相似度计算,以决定T4要分至C1或C2去
SIM(T4, C1) = <0, 3, 0, 3, 5> . <3/2, 4/2, 3/2, 3/2, 4/2>
= 0 + 12/2 + 0 + 9/2 + 20/2 = 20.5
SIM(T4, C2) = <0, 3, 0, 3, 5> . <0, 2, 0, 0, 1>
= 0 + 6 + 0 + 0 + 5 = 11
由於皆大於10,因此取最大的,并将其分至最大的那组去
C1 = {T1, T2, T4}
C2 = {T3}
再重新计算C2的权重值,但由於C2没加入任何的东西,因此即是T3的权重
C2 = <0, 2, 0, 0, 1>
由於C1新增了T4,因此,将T1, T2, T4的相加後除以3
C1 = <3/3, 7/3, 3/3, 6/3, 9/3>
不好意思麻烦大家了= =,写了好久还是没什麽头绪出来,
好像需要用到很多不同的资料结构及技巧才能写的出来的样子= =
不知道是否有高手可以补充说明,要怎麽写会比较好呢?感谢你罗^^
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.141.125
1F:推 david220:问的有点偏,这是演算法设计的问题,不是perl的问题吧 03/29 23:20
2F:推 Yaowei:是有点像演算法啦= =只是好像需要用到Hash一堆有的没的= = 03/29 23:59
3F:→ Yaowei:就是有些小地方可能需要大家的建议会想的比较快Orz 03/30 00:01
4F:推 Yaowei:所以才会问说若是用perl来写 怎麽表达比较好^^|| 03/30 00:07
5F:推 Yaowei:因为有想过用矩阵 但perl中好像没有,然後二维阵列好像也没 03/30 00:14
6F:→ Yaowei:实在是写的有点乱了= =才上来请教大家:) 03/30 00:15
7F:推 imce:=.=要算新权重....一整个类神经网路0rz......不好的回忆 03/30 00:19
8F:推 reizarc:看到有要带公式作法的东西 ... 第一件事请洽 CPAN :p 03/30 00:19
9F:推 reizarc:不过看起还好像只要简单的向量或是矩阵运算就够了 03/30 00:23
10F:推 Yaowei:cpan上面好像没有可用的套件 我也有想过orz 03/30 00:26
11F:推 Yaowei:恩恩 如r大大所讲好像只要简单的向量 但perl不清楚有? 03/30 00:40
12F:推 LiloHuang:一整个algorithms ~_~" 03/30 01:01
13F:推 reizarc:vector matrix 定有的阿 不过再看起来好像只用到 dot 03/30 01:07
14F:→ reizarc:所以自己写搞不好比较快 ...另外多维阵列 Perl 是没问题的 03/30 01:09