2017-08-19 19 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