看板 Perl 關於我們 聯絡資訊
假設我有以下的資料: 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
david220:問的有點偏,這是演算法設計的問題,不是perl的問題吧 03/29 23:20
Yaowei:是有點像演算法啦= =只是好像需要用到Hash一堆有的沒的= = 03/29 23:59
Yaowei:就是有些小地方可能需要大家的建議會想的比較快Orz 03/30 00:01
Yaowei:所以才會問說若是用perl來寫 怎麼表達比較好^^|| 03/30 00:07
Yaowei:因為有想過用矩陣 但perl中好像沒有,然後二維陣列好像也沒 03/30 00:14
Yaowei:實在是寫的有點亂了= =才上來請教大家:) 03/30 00:15
imce:=.=要算新權重....一整個類神經網路0rz......不好的回憶 03/30 00:19
reizarc:看到有要帶公式作法的東西 ... 第一件事請洽 CPAN :p 03/30 00:19
reizarc:不過看起還好像只要簡單的向量或是矩陣運算就夠了 03/30 00:23
Yaowei:cpan上面好像沒有可用的套件 我也有想過orz 03/30 00:26
Yaowei:恩恩 如r大大所講好像只要簡單的向量 但perl不清楚有? 03/30 00:40
LiloHuang:一整個algorithms ~_~" 03/30 01:01
reizarc:vector matrix 定有的阿 不過再看起來好像只用到 dot 03/30 01:07
reizarc:所以自己寫搞不好比較快 ...另外多維陣列 Perl 是沒問題的 03/30 01:09