我一直在試圖實現愚蠢的退格語言模型(描述可用here,但我相信細節與問題無關)。什麼是減緩這段Python代碼?
事情是,代碼工作併產生預期的結果,但工作速度比我預期的要慢。我想通了,是減緩一切都在這裏(而不是在訓練的一部分)的一部分:
def compute_score(self, sentence):
length = len(sentence)
assert length <= self.n
if length == 1:
word = tuple(sentence)
return float(self.ngrams[length][word])/self.total_words
else:
words = tuple(sentence[::-1])
count = self.ngrams[length][words]
if count == 0:
return self.alpha * self.compute_score(sentence[1:])
else:
return float(count)/self.ngrams[length - 1][words[:-1]]
def score(self, sentence):
""" Takes a list of strings as argument and returns the log-probability of the
sentence using your language model. Use whatever data you computed in train() here.
"""
output = 0.0
length = len(sentence)
for idx in range(length):
if idx < self.n - 1:
current_score = self.compute_score(sentence[:idx+1])
else:
current_score = self.compute_score(sentence[idx-self.n+1:idx+1])
output += math.log(current_score)
return output
self.ngrams是具有n個條目嵌套的字典。這些條目中的每一個都是形式(word_i,word_i-1,word_i-2 .... word_i-n)的詞典:該組合的計數。
self.alpha是一個常數,定義了n-1的懲罰。
self.n是程序在字典self.ngrams中查找的元組的最大長度。它被設置爲3(儘管將其設置爲2或甚至1都不會)。這很奇怪,因爲Unigram和Bigram模型在幾分之一秒內就可以正常工作。
我正在尋找的答案不是我自己的代碼的重構版本,而是一個提示,其中的一部分是計算量最大的代碼(這樣我就可以弄清楚自己如何重寫它並獲得最多解決這個問題的教育收益)。
請耐心等待,我只是一個初學者(進入編程世界兩個月)。謝謝。
UPD: 我使用了time.time()的定時具有相同數據的運行時間:
單字組= 1.9
Bigram = 3.2
笨退避(N = 2)= 15.3
笨退避(N = 3)= 21.6
(它是在一些比原先由於了time.time的更大的數據。精度差)
如果代碼正常工作,並且您只是在尋求同行評審以優化它,那麼您應該詢問[codereview.se]。這個網站是關於您首先獲取代碼的問題。 –
@KenWhite:Stack Overflow的主題是否與代碼生成的結果不正確有關,還是代碼複審的主題。這個問題至少和主題一樣,「爲什麼我的輸出包含額外的空格」或「爲什麼我的列表是空的」問題。我們有一個具體問題 - 運行時間大大超過預期 - 問題是尋找關於導致該問題的具體答案,而不是通用代碼改進。這個問題不需要移動。 – user2357112
@ user2357112:CR是專門爲此創建的。我沒有投票結束;我提出了一個建議。創建CR是爲了優化目的而檢查工作代碼。產生不正確結果的代碼不是工作代碼,也不是產生額外空格的代碼*或空列表*,因此您對它們的引用是不相關的。如果沒有問題適合遷移到CR,爲什麼它首先存在?如果你想要討論它的存在或相關性,那就把它作爲[meta]。 (這裏也沒有*提到的實質上更長的*,只是*比預期的要慢*) –