有没有适用于C#的模糊搜索或字符串相似度函数库?

70

有类似的问题,但与我可以在源代码中使用的C#库无关。

感谢大家的帮助。

我已经看过Lucene,但我需要一些更容易搜索相似字符串且没有索引部分的开销。

我标记的答案有两个非常简单的算法,其中一个还使用了LINQ,所以非常完美。


7
为什么这是不相关的问题,我不明白。OP正在询问是否有一个库中的函数得到SO的深入支持。 - 101010
8个回答

35

Levenshtein距离的实现:

我有一个.NET 1.1项目,我在其中使用后者。它很简单,但完全符合我的需求。据我记得,它需要进行一些微调,但没有任何不明显的问题。


2
为什么你说“使用LINQ”?这些实现都没有使用LINQ... - Thomas Levesque
1
实际上这些实现是相同的,只不过后者使用了 Substring,这比使用索引器要慢得多,因为它每次都会创建新的字符串实例... - Thomas Levesque
确实,你是正确的。我本来以为它里面有一些LINQ的东西,或者至少标题声称它是LINQy或类似的东西。 - George Mauer
如果我有 100,000 条条目要搜索,每次都想显示前 20 名候选人怎么办? - Hamish Grubijan
死链接可能现在在这里:http://www.dotnetperls.com/levenshtein - Roman

32

你还可以查看非常出色的库,名为Sam's String Metrics https://github.com/StefH/SimMetrics.Net,其中包含许多算法。

  • 汉明距离
  • Levenshtein距离
  • Needleman-Wunch距离或Sellers算法
  • Smith-Waterman距离
  • Gotoh距离或Smith-Waterman-Gotoh距离
  • 块距离或L1距离或城市街区距离
  • Monge Elkan距离
  • Jaro距离度量
  • Jaro Winkler
  • SoundEx距离度量
  • Matching Coefficient
  • Dice系数
  • Jaccard相似度或Jaccard系数或Tanimoto系数
  • Overlap系数
  • 欧几里得距离或L2距离
  • 余弦相似性
  • 变差距离
  • Hellinger距离或Bhattacharyya距离
  • 信息半径(Jensen-Shannon散度)
  • 调和平均数
  • 偏斜散度
  • 混淆概率
  • Tau
  • Fellegi和Sunters(SFS)度量
  • TFIDF或TF/IDF
  • FastA
  • BlastP
  • 最大匹配
  • q-gram算法
  • Ukkonen算法

14
这个答案中的链接给我返回了403错误。你可以使用Wayback Machine代替。 - Paul Ruane
我相信上面提到的库的.NET版本在这里。在我将它转换为Visual Studio 2010并更新了NUnit引用后,它可以构建。它还通过了87个测试。 - dalenewman
1
我在 SimMetrics.Net on GitHub 上找到了这个库的 .net 版本。与 @dalenewman 的建议相同,只是在 Github 上而已? - Spiralis

14

1
这些都是预先制作好的类,你只需要将它们放入你的项目中即可。这是最简单的方法。 - cjbarth
现在代码已经上传到GitHub上了,链接为https://github.com/tylerjensen/duovia-fuzzystrings。 - DanO
博客文章的更新链接:http://www.tsjensen.com/blog/post/2011/05/27/Four+Functions+For+Finding+Fuzzy+String+Matches+In+C+Extensions.aspx - Good Night Nerd Pride

2
你看过 Lucene.net 吗?它是将 Java Lucene 搜索引擎 API 移植到 .Net 平台上的库。该库提供了许多搜索功能。我大约一年前曾尝试过它,所以不要认为我的建议基于丰富的经验。我在书籍 Windows Developer Power Tools 中发现了它并进行了测试。你可以查看他们的 API 文档,看是否有你所需的模糊搜索功能。

请问如何使用Lucene获取相似度度量? - Eugeniu Torica
抱歉,我没有在专业领域使用过它。正如我在帖子中提到的那样,我只是大约在2007/2008年左右玩过它。 - Jason Jackson
也许书籍Lucene in Action, 2ed可以告诉我们如何获取相似度的程度。 - AechoLiu

1

1

0

Linux的Beagle项目是用C#(mono)编写的,类似于Google桌面搜索工具。它可能有一些用于这种字符串匹配的代码。

如果我没记错的话,它使用Lucene库进行搜索和检索数据。也许这对你的项目也有用。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接