所以你有2个问题需要解决:
- 检查单词的排列
- 为拼写错误增加回旋余地
两者都可以通过使用 Levenshtein 距离算法来解决,但有一个转折:
- 您正在查看模糊搜索或近似字符串匹配。那里有很多算法,但在我看来,Damerau-Levenshtein Distance Algorithm或Bitap Algorithm。它们都基于 Levenshtein。您可以为您的应用程序搜索更好的算法。
- 拼写错误——Levenshtein distance 可能更容易实现和使用;并且可能也很有效。
高温高压
编辑:我要解决的第一件事是Levenshtein distance
在单个单词上实现。因为,我们并不真正了解您在这里所说的 DB 是什么意思(可能是包含您的句子的简单文本文件或实际的 DBMS MySQL
),假设它是一个 DBMS,我将创建一个包含所有句子中出现的所有单词的字典。接下来我将编写一个Stored Procedure
实现Levenshtein distance
. 传递测试语句的单词数组并将存储过程应用于所有单词。然后用最对齐单词的 ID 替换 DB 句子中的单词以及您的测试句子。
例如,在 DB 中,您有一个句子“Lorem Ipsum”,并保留一个单词表,我们将有一个名为“words”的表,其中包含 2 条记录:
|---------------------|
| id | words |
|---------------------|
| 1 | Lorem |
| 2 | Ipsum |
|---------------------|
创建一个Stored Procedure
实现Levenshtein Distance
并传递测试语句数组(用户输入) say [Ipsum, Lorem]
。
对于用户输入的每个单词,您至少会得到一个对齐的单词。id
用表中的连续替换它们words
。在我们的示例中,返回数组可能看起来像[2,1]
.
这解决了拼写错误的第二个问题。
id
对于模糊搜索,从 DB 中获取一条记录(句子),用from table替换单词words
(您已经有一个从先前存储过程返回的 id 数组)并应用任何算法,如Damerau-Levenshtein Distance Algorithm
, Bitap Algorithm
, Smith-Waterman Algorithm
, Needleman-Wunsch Algorithm
。实际上,我建议您实施其中的 2-3 个,并比较哪种方法更适合您的情况。
高温高压