是否有任何为 C# 编写的模糊搜索或字符串相似函数库? [关闭]
Posted
技术标签:
【中文标题】是否有任何为 C# 编写的模糊搜索或字符串相似函数库? [关闭]【英文标题】:Are there any Fuzzy Search or String Similarity Functions libraries written for C#? [closed] 【发布时间】:2010-09-10 04:07:51 【问题描述】:有类似的问题,但与我可以在源代码中使用的 C# 库无关。
感谢大家的帮助。
我已经看到了 lucene,但我需要一些更容易搜索相似字符串并且没有索引部分开销的东西。
我标记的答案有两个非常简单的算法,一个也使用了LINQ,所以很完美。
【问题讨论】:
为什么这是题外话让我无法理解。 OP 询问库中是否有 SO 深入支持的函数。 【参考方案1】:用于 Linux 的 Beagle Project 是用 c# (mono) 编写的,是一个类似于 google-desktop 的搜索工具。它可能有一些用于这些字符串匹配的代码。
如果我没记错的话,它使用Lucene 库来搜索和检索数据。也许这对您的项目也有用。
【讨论】:
【参考方案2】:你看过Lucene.net吗?它是 Java Lucene 搜索引擎 API 到 .Net 平台的一个端口。该库提供了很多搜索功能。大约一年前我玩过它,所以不要将我的建议视为基于大量经验。我在Windows Developer Power Tools 一书中看到了它,并拿它来试驾。您可以查看他们的API documentation,看看它是否提供了您正在寻找的模糊搜索之类的功能。
【讨论】:
能否请您告诉如何使用 Lucene 获得相似度? 对不起,我没有专业使用过。正如我在帖子中提到的,我大概在 2007/2008 年左右玩过它。 也许Lucene in Action, 2ed这本书可以告诉如何获得相似度。【参考方案3】:这个code project paper 有一个使用Levenshtein distance 的字符串相似函数。
【讨论】:
【参考方案4】:有以下 Levenshtein 距离算法,它为两个字符串的相似性分配一个值(实际上是差异),可用于构建:http://www.merriampark.com/ldcsharp.htm
【讨论】:
【参考方案5】:Levenshtein 距离实现:
Using LINQ(不是真的,见 cmets) Not using LINQ我有一个 .NET 1.1 项目,我在其中使用后者。它很简单,但非常适合我的需要。据我记得,它需要一些调整,但没有什么不明显的。
【讨论】:
为什么说“使用 LINQ”?这些实现都没有使用 Linq... 其实这些实现都是一样的,只不过后者使用的是Substring,比使用indexer慢很多,因为每次都会创建新的String实例…… 确实你是对的。我可以发誓这里面有一些对 LINQ 的喜爱,或者至少标题声称它是 LINQy 之类的。 如果我有 100,000 个条目要搜索,我想每次显示前 20 名候选人怎么办? 死链接现在可能在这里dotnetperls.com/levenshtein【参考方案6】:我使用“C# 中的三元搜索树字典”(http://www.codeproject.com/KB/recipes/tst.aspx) 来搜索相似的字符串。
问候,帕特里西奥
【讨论】:
【参考方案7】:您还可以查看名为 Sam's String Metrics https://github.com/StefH/SimMetrics.Net 的令人印象深刻的库。这包括许多算法。
汉明距离 Levenshtein 距离 Needleman-Wunch 距离或卖方算法 史密斯-沃特曼距离 Gotoh 距离或 Smith-Waterman-Gotoh 距离 街区距离或L1距离或城市街区距离 蒙格埃尔坎距离 Jaro 距离度量 雅罗·温克勒 SoundEx 距离度量 匹配系数 骰子系数 Jaccard 相似度或 Jaccard 系数或 Tanimoto 系数 重叠系数 欧几里得距离或 L2 距离 余弦相似度 变化距离 Hellinger 距离或 Bhattacharyya 距离 信息半径(Jensen-Shannon 散度) 谐波平均值 偏斜发散 混淆概率 头 Fellegi 和 Sunters (SFS) 指标 TFIDF 或 TF/IDF FastA BlastP 最大匹配数 q-gram Ukkonen 算法【讨论】:
这个答案中的链接给了我一个 403 错误。您可以改用Wayback Machine。 我相信上面提到的库的.NET版本是here。在我将它转换为 Visual Studio 2010 并更新 NUnit 引用后,它就构建了。它还通过了 87 项测试。 我在 SimMetrics.Net on GitHub 上找到了这个库的 .net 库版本。与@dalenewman 的建议相同,也许只是在 github 上?【参考方案8】:它们不是我自己的发明,但它们是我的最爱,我刚刚写了一篇关于它们的博客,并在一篇名为 Four Functions for Finding Fuzzy String Matches in C# Extensions 的博客文章中发布了我自己的 Dice Coefficient、Levenshtein Distance、Longest Common Subsequence 和 Double Metaphone 的调整版本.
【讨论】:
这些都是现成的,你可以直接放入你的项目中。这是简单的人要走的路。 代码现在在 GitHub github.com/tylerjensen/duovia-fuzzystrings 更新了博文链接:tsjensen.com/blog/post/2011/05/27/…以上是关于是否有任何为 C# 编写的模糊搜索或字符串相似函数库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章