【问题标题】:Levenshtein Distance for a List of Thousands of Similar Entries of Cryptocurrencies数以千计的类似加密货币条目列表的 Levenshtein 距离
【发布时间】:2018-09-11 17:51:10
【问题描述】:

我有一个按字母顺序排列的超过一千种不同加密货币的列表。如果用户查询“BTC”,那么问题就在这里,他们会将 BTCA(Bitair)从列表中删除,因为 BTCA 出现在比特币之前。或者,输入比特币会给你“AntiBitcoin”,因为它出现在比特币之前。原来是因为我用了.Contains(),这不正确,所以现在我改用Levenshtein进行除法。

我正在设置一个像这样的简单循环:

foreach (String s in crypto.currencies)
{
    if (Crypto.LevenshteinDistance(s,currency) <= (Stuck on the right way to do this now))
    {
        //foo
    }
    Console.WriteLine(s + " is not a match. Continuing.");
}

但是我非常坚持我应该如何真正去获得用户想要的合适的项目。我正在尝试做的事情可能看起来完全愚蠢,但我必须正确地查询这个列表(另外,我是手动输入的,哎哟)

【问题讨论】:

  • 我不确定您是如何显示结果的。但大多数搜索 UI 都是通过显示搜索词的前几个结果来工作的。为什么不显示包含给定搜索字符串的所有硬币而不是“单一最佳匹配”?更好的是,然后通过访问 coinmarketcap 或类似 API 按搜索结果的当前市值对这些结果进行排序。
  • 我只需要显示一个。这就是问题:(
  • 理想的 Levenshtein 距离为 0 以实现完美匹配。越接近0越好。如果这不能产生良好的匹配,您必须调整定义插入、删除等点数的权重。

标签: c# arrays levenshtein-distance querying


【解决方案1】:

您可以按照与目标货币的 Levenshtein 距离排序,然后选择最上面的一个:

var closestMatch = crypto.currencies
    .OrderBy(s => Crypto.LevenshteinDistance(s, currency))
    .First();

【讨论】:

  • 完美无瑕。谢谢!我会支持你,但是,我只有 1 个代表 :(
猜你喜欢
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2013-04-23
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多