【问题标题】:Implementing suggestions when a hotel name is typed in在输入酒店名称时实施建议
【发布时间】:2017-08-19 08:57:25
【问题描述】:

我正在开发酒店预订系统。我的任务是实现一个算法,当酒店名称输入错误时,它会给出正确的建议。例如,如果用户键入酒店的名称为“MOFENBICK”而不是其真实名称“MOVENPICK”,那么我的算法应该建议“您的意思是 MOVENPICK”。我计划使用机器学习理念来实现它。对于这个问题,什么是好的功能选择?

【问题讨论】:

  • 您正在使用 GNU Octave 或 MATLAB 实现酒店预订系统?我会看看 leventhstein,例如 octave.sourceforge.io/strings/function/editdistance.html 要搜​​索的关键字可能是“模糊搜索”en.wikipedia.org/wiki/Approximate_string_matching
  • 我打算先在 Octave 中实现一个原型。我希望从头开始发展。我打算做的是制作一个神经网络或使用线性回归来训练数据集,以便它可以预测来自测试或验证集的输出。由于我是机器学习的新手,我很难为神经网络或线性回归模型选择特征。
  • m7913d 为您提供了 google 的链接。但是你可能没有谷歌必须使用某种神经网络的训练数据,这对我来说没有意义。你读过我之前给你的适当字符串匹配的链接吗?

标签: matlab machine-learning octave


【解决方案1】:

你不需要去实现神经网络那么远。对于这个特定的任务来说,这太过分了。

按照建议,使用 Levenshtein-distance。 Levenshtein distance 背后的想法是它定义了字符串的度量。简单来说,它允许计算机算法说“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. 计算给定输入和酒店名称之间的 Levenshtein 距离 3. 选择产生最小编辑距离的名称

虽然这对于小型集合来说效果很好,但您可以使用 BK-Tree 进一步优化它。

阅读材料:

【讨论】:

  • 非常感谢。我将尝试实现这一点。但我也打算使用神经网络来解决问题,因为我也想发展我在机器学习方面的技能。因此,如果我使用神经网络来实现这一点,那么每个输入中的哪些输入特征可能会给我带来良好的学习曲线?
  • 此外,每次用户创建和进入时,迭代所有酒店名称会不会太昂贵?如果我们能够获得 ML 参数,我们所需要的只是与参数矩阵相乘,并采用 sigmoid 并将最高索引映射到特定类。我是编程新手。所以我的论点可能是错误的。
  • @Joris:我很好奇如果 GNU Octave 有这么多真正的实现,为什么你要添加伪代码,例如我在上面链接的 sourceforge.net/p/octave/strings/ci/default/tree/inst/… 也 odepkg 有 levenshtein 距离
  • @Fawaz.A.R:迭代这样一个列表的计算成本很高。这就是为什么我的帖子建议您使用 BK-tree。
  • @Andy:我总是尝试在我的答案中提供代码示例。它不仅可以帮助用户进行链接农场,还可以帮助用户。它还为用户节省了一些时间,因为我已经选择了我认为最有用的实现。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 2023-03-26
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2018-10-12
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多