最近邻搜索Levenshtein-distance-like metric

时间:2011-04-26 14:31:14

标签: algorithm metrics nearest-neighbor

我有一组单词('字典'),我必须在字典中找到最接近的单词,给出一个新单词。 (我使用'word'作为关键字,因为它实际上是一个可变长度的抽象'字母'序列)。

我使用Levenstein距离的推广作为度量 - 我需要概括的原因是我需要交换两个给定字母的特定'成本' - 例如,我需要用'b'交换'a' '与'c'交换'a'可以降低成本。我想我仍然必须说服自己,我的概括仍然是一个指标。

目前我正在使用天真的线性搜索,即迭代字典中的所有单词并跟踪最小距离,我正在寻找一种更有效的方法。

我开始阅读有关最近邻搜索的方法,但对我来说主要的概念上的困难是我的'点'(单词)没有嵌入我可以想象的空间中,并且它们不是具有维度等的向量。

考虑到这一点,我想听听一些关于要查找哪种算法的建议。

1 个答案:

答案 0 :(得分:1)

让我重新描述你的问题,并给你一个可能的答案。如果没有看到您的数据集,我不知道哪个更适合您。

你已经有了一个算法,给定两个单词,给出它们之间的距离。它基于Levenstein距离来表示这些词之间的路径,并对成本进行了一些修改。并且您希望找到与给定单词最接近的单词而无需搜索整个字典。

我要尝试的最简单的事情是从你的单词开始,并搜索所有可能的修改集,直到你找到字典中最接近的单词。您想要修改广度优先搜索。将(0, your_word)存储为某种http://en.wikipedia.org/wiki/Priority_queue中的唯一条目(堆很容易实现),抓住与随机字典单词的距离作为当前最佳解决方案然后只要优先级队列是不是空的:

Take the lowest cost element out.
If it is more expensive than your best solution:
    stop, return your best.
For each possible one step modification of that word:
    if the new word is in the dictionary and is lower cost than your best:
        improve best estimate
    else:
        store (new_cost, new_word) in the priority queue

这将导致以原始单词开头的指数级增长的搜索集。但如果字典中有附近的单词,它应该会很快找到。如果你走这条路线,你可能希望在它放弃的搜索空间上加上一个上限。

这可能远非最佳解决方案,但编程和尝试应该不会太难。

相关问题