2017-08-19 14 views
-2

私はホテルの予約システムに取り組んでいます。私の仕事は、ホテルの名前が間違って入力されたときに適切な提案をするアルゴリズムを実装することです。たとえば、ユーザーが実際のホテル名 "MOVENPICK"ではなく "MOFENBICK"としてホテルの名前を入力した場合、私のアルゴリズムは "MOVENPICKを意味しました"と提案する必要があります。私はMachine Learning Ideasを使ってそれを実装するつもりです。この問題のために機能の良い選択は何でしょうか?ホテル名の入力時に提案を実装

+0

可能な重複[Googleが「?もしかして、」どのようにアルゴリズム動作しますか?](https://stackoverflow.com/質問/ 307291/google-did-you-mean-algorithm-work) – m7913d

+0

GNU OctaveまたはMATLABにホテル予約システムを実装していますか?私は、例えば、https://octave.sourceforge.io/strings/function/editdistance.htmlのように、leventhsteinを見るでしょう。検索のキーワードは "あいまい検索"かもしれません。https://en.wikipedia.org/wiki/Approximate_string_matching – Andy

+0

最初にOctaveでプロトタイプを実装する予定です。私は最初から開発したいと思っています。私がしようとしているのは、ニューラルネットワークを作成するか、線形回帰を使ってデータセットを学習させ、テストセットや検証セットからの出力を予測できるようにすることです。私は機械学習の初心者であるため、ニューラルネットワークや線形回帰モデルの機能を選択するのは難しいです。 –

答えて

1

ニューラルネットワークを実装する必要はありません。それはこの特定の仕事のために残忍です。

推奨されるように、Levenshtein-distanceを使用します。 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.反復処理になります/与えられた入力とホテル名 3間のレーベンシュタイン距離が最小編集距離

を生成する名前を選んで計算 2を設定しますこれは小さなセットではうまく動作しますが、BKツリーを使用してこれをさらに最適化することができます。

読み物:の

+0

ありがとうございました。私はこれを実装しようとします。しかし、私は機械学習でも自分のスキルを発揮したいので、ニューラルネットワークを使って解決策を作るつもりです。だから、ニューラルネットワークを使ってこれを実装しようとすると、各入力の入力フィーチャは、おそらく私に良い学習曲線を与えるでしょうか? –

+0

それ以外にも、ユーザーが作成しエントリーするたびに数千になるすべてのホテル名を計算するには計算コストがかかりませんか? MLのパラメータを得ることができれば、パラメータ行列との乗算が必要であり、シグモイドをとり、最高のインデックスを特定のクラスにマッピングするだけです。私はプログラミングの初心者です。私の議論は間違っているかもしれません。 –

+0

@Joris:GNU Octaveのための本当の実装がたくさんある場合、なぜ疑似コードを追加するのか不思議です。たとえば、https:// sourceforgeの上にリンクしたものがあります。net/p/octave/strings/ci/default/tree/inst/editdistance.mまた、odepkgには距離があります – Andy

関連する問題