2013-04-01 65 views
1

我是R的初學者。下面是公式我試圖找到最大化一些bigrams的日誌可能性的lambda。當找不到bigrams時,P_b(bigram)函數失敗,但P_u(unigram)函數應提供unigram結果(lambda = 0)。R程序不斷獲取數字(0)答案

它適用於找到的bigrams。當他們沒有找到時,我只能得到數字(0),而不是單字符結果。因爲索引的,所以我不願意發佈,但是當被發現的二元語法,它的工作

enter image description here

p.mix <- function(w2, w1) { 

    (1-lambda) * uni.dfrm$prob[uni.dfrm$token==w2] + lambda * p.bi(w2,w1) 

} 

的p.bi()函數看起來複雜。它只是查看w出現在w後面的次數,並將它除以w出現的次數,但我必須經過另一個詞彙單詞向量,所以它看起來很醜。

當在w之後從未發現w',而不是零計數時,根本沒有行,這顯然導致了數字(0)結果。這就是混合模型應該解決的問題,但我無法實現。任何想法如何可以工作?

回答

1

您可以添加一個用於測試的情況下w2numeric(0)例如:

p.mix <- function(w2, w1) { 
    if(length(w2)>0){ 
    res <- (1-lambda) * uni.dfrm$prob[uni.dfrm$token==w2] + 
       lambda * p.bi(w2,w1) 
    }else res <- 0 

    res 
} 

編輯

p.mix <- function(w2, w1) { 
    if(length(w2) && length(uni.dfrm$prob[uni.dfrm$token==w2]) > 0) 
    (1-lambda) * uni.dfrm$prob[uni.dfrm$token==w2] + lambda * p.bi(w2,w1) 
    else 0 
} 
+0

這是不太它應該工作...的方式p.mix應該給出一個數字,是否找到了兩個bigram,所以如果沒有找到bigram,唯一的結果是當lambda = 0時,所以結果應該是第二個單詞的一元概率,而不是零。 但我明白你在說什麼。我已經嘗試過在p.bi函數中... hit enter too fast,oops ... if(identical(bigram.w2,numeric(0))){ result < - 0 } else result < - bigram.w2 $ w.ij/w1 bigram.w2返回一行:w,w'和w.ij,或計數w'| w。但是,這一切只有在找到二元論時纔有效。 – punstress

+0

看來,添加到數字(0)的任何東西都等於數字(0)。而且我無法在沒有找到時使bigram成爲普通的舊零而不是數字(0)。我可以重構混合模型,但我認爲這將很難計算出正確的lambda。也許R對此不是一種好語言,但是應該有辦法做到這一點。 – punstress

+0

@punstress我編輯我的答案。 – agstudy