【问题标题】:Algorithm to determine order of words确定单词顺序的算法
【发布时间】:2013-10-11 11:50:25
【问题描述】:

我想检查数据库值和用户输入之间的单词顺序。

例如:

示例一:

数据库值:Lorem Ipsum

用户输入:Ipsum Lorem

示例 2:

数据库值:Lorem Ipsum Dolo

用户输入:Dolo Lorem Ipsum(以及可能的组合,除了 确切的分贝值)

我会在空格上进行拆分并比较匹配单词的索引,但总是有拼写错误的机会。例如:

数据库值:Lorem Ipsum

用户输入:Lorm Ipsm

在我的应用程序中,我必须允许容忍一些拼写错误。有没有其他方法可以查看订单?

我目前正在通过以下方式使用 Levenshtein(Ruby on Rails 代码)

answer = 'Lorem Ipsum'

response = 'Ipsum Lorem'

score = Text::Levenshtein.distance(answer,response)/answer.length.to_f

这是使用 levenshtein 得分的正确方法吗?如果是,我如何确定可接受的分数?有相同的示例数据资源吗?对于上面这个特定的例子,我得到的分数是0.72

【问题讨论】:

  • 你能澄清你想要达到的目标吗?您是否将用户输入与数据库记录匹配而不管顺序并允许拼写错误?
  • 与数据库记录相比,不匹配但在用户输入的词序变化中获得了某种分数。这同时允许拼写错误。
  • 根据这个变化的分数,我会选择将其视为正确输入或不正确。

标签: ruby-on-rails string pattern-matching string-matching


【解决方案1】:

我认为这可以通过将用户输入和数据库记录拆分为单词数组来解决,然后计算每对单词的 levenshtein 距离。然后你需要计算出哪一组配对使分数最小化。

然后,用户输入中的每组单词都将与 db 记录中的一个单词进行匹配,因此您可以根据它们是否处于相同位置来计算分数

【讨论】:

    【解决方案2】:

    所以你有 2 个问题需要解决:

    1. 检查单词的排列
    2. 为拼写错误添加回旋余地

    两者都可以通过使用 Levenshtein 距离算法来解决,但有一点不同:

    1. 您正在查看模糊搜索或近似字符串匹配。那里有很多算法,但在我的脑海中,Damerau-Levenshtein Distance AlgorithmBitap Algorithm。它们都基于 Levenshtein。您可以为您的应用寻找更好的算法。
    2. 拼写错误 - Levenshtein distance 可能更容易实现和使用;并且可能也很有效。

    HTH

    编辑:我要解决的第一件事是在单个单词上实现Levenshtein distance。因为,我们并不真正了解您在这里所说的 DB 是什么意思(可以是包含您的句子的简单文本文件或像 MySQL 这样的实际 DBMS),假设它是一个 DBMS,我将创建一个包含所有单词的字典所有句子。接下来我会写一个Stored Procedure 来实现Levenshtein distance。传递测试语句的单词数组并将存储过程应用于所有单词。然后将 DB 句子中的单词以及您的测试句子中的单词替换为最对齐单词的 ID。

    例如在 DB 中,您有一个句子“Lorem Ipsum”,并保留一个单词表,我们将有一个名为“words”的表,其中包含 2 条记录:

    |---------------------|
    | id | words          |
    |---------------------|
    |  1 | Lorem          |
    |  2 | Ipsum          |
    |---------------------|
    

    创建一个实现Levenshtein DistanceStored Procedure 并传递测试语句数组(用户输入)说[Ipsum, Lorem]

    对于用户输入的每个单词,您至少会得到一个对齐的单词。用表words 中的连续id 替换它们。在我们的示例中,返回的数组可能看起来像 [2,1]

    这样就解决了拼写错误的第二个问题。

    对于模糊搜索,从 DB 中获取一条记录(句子),用表 words 中的 id 替换单词(您已经从先前的存储过程返回了一个 id 数组)并应用任何算法,如 Damerau-Levenshtein Distance AlgorithmBitap AlgorithmSmith-Waterman AlgorithmNeedleman-Wunsch Algorithm。事实上,我建议您实现其中的 2-3 个,然后比较哪个更适合您的情况。

    HTH

    【讨论】:

    • 已经在使用 levenshtein。但是在整个字符串上。用代码更新问题。
    • 在您的情况下,整个字符串上的 Levenshtein 似乎是不必要的,如果字符串太大,肯定会减慢整个系统的速度。我的意思是,您需要以一种有效且高效地将 Levenshtein 对单词的距离和对单词的模糊搜索算法相结合的方式创建一个结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多