我想检查数据库值和用户输入之间的单词顺序。
例如:
示例一:
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
答案 0 :(得分:0)
所以你有两个问题需要解决:
两者都可以通过使用Levenshtein距离算法来解决,但有一个转折:
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 Algorithm
,Bitap Algorithm
,Smith-Waterman Algorithm
,Needleman-Wunsch Algorithm
。事实上,我建议你实施2-3个,然后比较哪个更适合你的情况。
HTH
答案 1 :(得分:0)
我认为这可以通过将用户输入和db记录分成单词数组,然后计算每对的levenshtein距离来解决。然后你需要弄清楚哪一组配对可以最小化得分。
然后,用户输入中的每组单词将与db记录中的单词匹配,这样您就可以根据它们是否处于相同位置来计算分数