我確定有一篇關於此的文章,但我找不到一個問這個確切的問題。考慮以下幾點:Word預測算法
- 我們有可用的
- 單詞詞典,我們被送到的話很多段落,我希望能夠預測中給出該輸入句子的一個單詞。假設我們有幾句話,比如「你好,我的名字是湯姆」,「他的名字是傑瑞」,「他去沒有水的地方」。如果存在單詞,我們檢查一個哈希表。如果沒有,我們爲它分配一個唯一的ID並將其放入散列表中。通過這種方式,我們不必將單詞的「鏈」存儲爲一串字符串,而只需要一個uniqueID列表。以上,我們將有例如(0,1,2,3,4),(5,2,3,6)和(7,8,9,10,3,11,12)。請注意,3是「是」,我們在發現新單詞時添加了新的唯一標識。所以說我們被給了一句「她的名字是」,這將是(13,2,3)。鑑於這種情況,我們想知道下一個詞應該是什麼。這是我想到的算法,但我不認爲它是有效的:我不知道它的有效性: 3,6,2,7,8。
- 每條鏈的平均大小爲M,其中M爲平均句子長度
- 我們給出了一個新的鏈S, 13,2,3,我們希望知道最可能的下一個詞是什麼?
算法:
首先掃描鏈對於那些誰包含完整的S輸入的整個列表(13,2,3,在這個例子中)。由於我們必須掃描N個鏈,每個長度爲M,並且一次比較S個字母,因此它的O(N * M * S)。
如果在我們的掃描中沒有鏈具有完整的S,那麼通過刪除最不重要的單詞(即第一個,所以刪除13)進行下一次掃描。現在,在最壞的情況O(N * M * S)中掃描(2,3)爲1,這實際上是S-1。
繼續以這種方式掃描,直到我們得到的結果> 0(如果有的話)。
收集我們收集的所有剩餘鏈中的下一個單詞。我們可以使用一個哈希表,每次添加時都會計數,並跟蹤最多的單詞。 O(N)最差的情況下,O(1)找到最大的單詞。
- 找到的最大單詞是最有可能的,所以請將其退回。
每次掃描都需要O(M * N * S)最壞的情況。這是因爲有N個鏈,每個鏈有M個號碼,我們必須檢查S號來覆蓋匹配。我們掃描S次最壞的情況(13,2,3,然後2,3,然後3 3次掃描= S)。因此,總的複雜度是O(S^2 * M * N)。
所以,如果我們有10萬條鏈,平均句子長度爲10個單詞,我們正在尋找1,000,000 * S^2來獲得最佳單詞。顯然,N >> M,由於句子長度並不總是隨觀察句子數量成比例,所以M可以是一個常數。然後我們可以將複雜度降低到O(S^2 * N)。 O(S^2 * M * N)可能更有助於分析,因爲M可能是一個相當大的「常量」。
這可能是完全錯誤的方法來採取這種類型的問題,但我想分享我的想法,而不是公然要求幫助。掃描我的方式的原因是因爲我只想掃描儘可能多的東西。如果什麼都沒有完整的S,只是保持修剪S,直到一些鏈條匹配。如果他們從來不匹配,我們不知道下一個字是什麼預測!關於較少時間/空間複雜解決方案的任何建議?謝謝!
想到什麼閱讀您的問題後發現的是一個字短語/段落的基於後綴的數組。例如http://projectile.sv.cmu.edu/research/public/tools/salm/tutorial.pdf – hatchet
我沒有直接的解決方案,但有一些很棒的閱讀:http:// en .wikipedia.org/wiki/N-gram http://www.codeproject.com/Articles/20423/N-gram-and-Fast-Pattern-Extraction-Algorithm http://aclweb.org/anthology-new/Q /Q13/Q13-1010.pdf –