2017-08-19 16 views
-2

我正在開發酒店預訂系統。我的任務是實現一個算法,當酒店的名稱輸入錯誤時,它會給出正確的建議。例如,如果用戶輸入酒店名稱爲「MOFENBICK」而不是真名「MOVENPICK」,那麼我的算法應該顯示「您的意思是MOVENPICK」。我計劃使用機器學習理念來實現它。這個問題有什麼好的功能選擇?在酒店名稱輸入時實施建議

+0

的可能的複製[如何在谷歌「嗎?你的意思是」算法的工作?](https://stackoverflow.com/問題/ 307291/how-do-google-did-you-mean-algorithm-work) – m7913d

+0

您正在GNU Octave或MATLAB中實施酒店預訂系統嗎?我會看看leventhstein,例如https://octave.sourceforge.io/strings/function/editdistance.html關鍵詞搜索可能是「模糊搜索」https://en.wikipedia.org/wiki/Approximate_string_matching – Andy

+0

我計劃首先在Octave中實現一個原型。我希望從頭開始。我打算做的是建立一個神經網絡或使用線性迴歸來訓練數據集,以便它可以預測測試或驗證集的輸出。由於我是機器學習的新手,我很難選擇神經網絡或線性迴歸模型的特徵。 –

回答

1

你不需要去執行一個神經網絡。這對於這個特殊的任務來說太過分了。

建議使用Levenshtein距離。 Levenshtein距離背後的想法是它定義了一個字符串度量。簡單來說,它允許計算機算法說「mofenbick」和「movenpick」在距離2(因爲2個字母被改變)。

一些僞代碼來計算Levennshtein:

function LevenshteinDistance(char s[1..m], char t[1..n]): 

    // create two work vectors of integer distances 
    declare int v0[n + 1] 
    declare int v1[n + 1] 

    // initialize v0 (the previous row of distances) 
    // this row is A[0][i]: edit distance for an empty s 
    // the distance is just the number of characters to delete from t 
    for i from 0 to n: 
     v0[i] = i 

    for i from 0 to m-1: 
     // calculate v1 (current row distances) from the previous row v0 

     // first element of v1 is A[i+1][0] 
     // edit distance is delete (i+1) chars from s to match empty t 
     v1[0] = i + 1 

     // use formula to fill in the rest of the row 
     for j from 0 to n-1: 
      if s[i] = t[j]: 
       substitutionCost := 0 
      else: 
       substitutionCost := 1 
      v1[j + 1] := minimum(v1[j] + 1, v0[j + 1] + 1, v0[j] + substitutionCost) 

     // copy v1 (current row) to v0 (previous row) for next iteration 
     swap v0 with v1 

    // after the last swap, the results of v1 are now in v0 
    return v0[n] 

一旦你有超過字符串定義的指標,你需要一個快速的方法來查詢課程的酒店名單。 天真的實施將 1.疊代數據庫中的所有酒店名稱/設定 2.計算給定的輸入和酒店名稱 3之間的Levenshtein距離挑選產生最小編輯距離

名稱雖然這對小集合來說工作得很好,但您可以使用BK-Tree進一步優化它。

閱讀材料:

+0

非常感謝。我會盡力實現這一點。但我也打算使用神經網絡來制定解決方案,因爲我希望發展我的機器學習技能。因此,如果我使用神經網絡來實現這一點,那麼每個輸入中的輸入特徵可能會給我帶來良好的學習曲線? –

+0

除此之外,在遍歷所有酒店名稱時,計算上每次用戶輸入時都會有數千個酒店名稱,這在計算上會花費太多嗎?如果我們可以得到ML參數,我們需要的是與參數矩陣相乘,並將sigmoid和map最高索引映射到特定的類。我是編程的新手。所以我的論點可能是錯誤的。 –

+0

@Joris:我很好奇爲什麼你要添加僞代碼,如果有這麼多真正的GNU Octave實現,例如我在https:// sourceforge上面鏈接了什麼。net/p/octave/strings/ci/default/tree/inst/editdistance.m此外,odepkg具有levenshtein距離 – Andy