确定单词顺序的算法

时间:2013-10-11 11:50:25

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

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

例如:

  

示例一:

     

DB值:Lorem Ipsum

     

用户输入:Ipsum Lorem

     

示例2:

     

DB值:Lorem Ipsum Dolo

     

用户输入:Dolo Lorem Ipsum(除了可能的组合之外)   确切的db值)

我会对空格进行分割并比较匹配单词的索引,但总有可能出现拼写错误。例如:

  

DB值: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

2 个答案:

答案 0 :(得分:0)

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

  1. 检查单词的安排
  2. 为拼写错误添加摆动空间
  3. 两者都可以通过使用Levenshtein距离算法来解决,但有一个转折:

    1. 您正在查看模糊搜索或近似字符串匹配。有许多算法,但从我的头脑,Damerau-Levenshtein Distance AlgorithmBitap Algorithm。他们都是以Levenshtein为基础的。您可以为您的应用程序搜索更好的算法。
    2. 拼写错误 - Levenshtein距离可能更容易实现和使用;并且可能也很有效率。
    3. HTH

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

      E.g。在DB中,你有一个句子'Lorem Ipsum',并且保留一个单词表,我们将有一个名为'words'的表,有2条记录:

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

      创建Stored Procedure实施Levenshtein Distance并传递测试语句数组(用户输入)说[Ipsum, Lorem]

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

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

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

      HTH

答案 1 :(得分:0)

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

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