Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 类Levenstein距离度量中的最近邻搜索_Algorithm_Metrics_Nearest Neighbor - Fatal编程技术网

Algorithm 类Levenstein距离度量中的最近邻搜索

Algorithm 类Levenstein距离度量中的最近邻搜索,algorithm,metrics,nearest-neighbor,Algorithm,Metrics,Nearest Neighbor,我有一套单词(“字典”),我必须从字典中找到最接近的单词,给定一个新词。(我使用“word”作为关键字,因为它实际上是一个长度可变的抽象“字母”序列) 我使用Levenstein距离的推广作为度量-我需要推广的原因是我需要交换两个给定字母的特定“成本”-例如,我需要将“a”与“b”交换,以使“a”与“c”交换的成本更低。我想我还是要说服自己,我的泛化仍然是一个度量 目前我正在使用朴素的线性搜索,即迭代字典中的所有单词并跟踪最小距离,我正在寻找一种更有效的方法 我开始阅读关于最近邻搜索的方法,但对

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

我使用Levenstein距离的推广作为度量-我需要推广的原因是我需要交换两个给定字母的特定“成本”-例如,我需要将“a”与“b”交换,以使“a”与“c”交换的成本更低。我想我还是要说服自己,我的泛化仍然是一个度量

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

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


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

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

您已经有了一个算法,给定两个单词,就可以给出它们之间的距离。它基于这些单词之间的路径的Levenstein距离,并对成本进行了一些修改。你想找到与给定单词最接近的单词,而不必搜索整本词典

我会尝试的最简单的事情是从你的单词开始,搜索所有可能的修改集,直到你在字典中找到最接近的单词。您需要修改宽度优先搜索。将
(0,您的单词)
存储为某种类型(堆很容易实现)中的唯一条目,获取到随机字典单词的距离作为当前最佳解决方案,然后只要优先级队列不为空:

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
这将导致从原始单词开始的搜索集呈指数级增长。但是如果字典里有一个附近的单词,它应该很快就能找到。如果你走这条路线,你可能希望给它的搜索空间设置一个上限,然后放弃


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

谢谢,我将尝试并报告。