你知道任何用于文本算法的.NET库吗? 特别是我对字符串匹配和像
这样的全文搜索算法很感兴趣我知道我提到的那个代码非常简单,但有数百种文本算法,我不想自己编写代码。
如果没有已知的这样的.NET库,你可以提一下C,C ++库,编码包装器比从零编码更容易。
答案 0 :(得分:18)
您可能有兴趣查看Google代码上的google-diff-match-patch库。他们有Myer的diff算法的实现,它声称也“实现”了Bitap算法。
它有你正在寻找的C#源代码以及Java,C ++,Lua&蟒蛇。虽然我对如何在实践中使用Bitap没有最好的理解(Google Code项目中有演示),但我认为你最感兴趣的是从current version的第1476行开始的匹配函数。
更新:
有点挖掘在CodeProject上找到了Levenshtein in C#的实现。
此外,this C# class file包含SourceForge上的Levenshtein实现。该实现是Corsis(又名Tenka Text)项目的一部分。作者声称,YetiLevenshtein方法(第741行)比上面引用的算法的CodeProject版本中使用的实现快2到10倍。
更新#2:
我刚刚发现了wikibook Algorithm implementation和它的Levenshtein距离的C#版本,并且必须包含它,因为它看起来非常直观而且非常重要。这个wikibook看起来像一个很好的参考,一般保持在手。
Levenshtein Distance in C# (由Wikibooks提供)
private Int32 levenshtein(String a, String b)
{
if (string.IsNullOrEmpty(a))
{
if (!string.IsNullOrEmpty(b))
{
return b.Length;
}
return 0;
}
if (string.IsNullOrEmpty(b))
{
if (!string.IsNullOrEmpty(a))
{
return a.Length;
}
return 0;
}
Int32 cost;
Int32[,] d = new int[a.Length + 1, b.Length + 1];
Int32 min1;
Int32 min2;
Int32 min3;
for (Int32 i = 0; i <= d.GetUpperBound(0); i += 1)
{
d[i, 0] = i;
}
for (Int32 i = 0; i <= d.GetUpperBound(1); i += 1)
{
d[0, i] = i;
}
for (Int32 i = 1; i <= d.GetUpperBound(0); i += 1)
{
for (Int32 j = 1; j <= d.GetUpperBound(1); j += 1)
{
cost = Convert.ToInt32(!(a[i-1] == b[j - 1]));
min1 = d[i - 1, j] + 1;
min2 = d[i, j - 1] + 1;
min3 = d[i - 1, j - 1] + cost;
d[i, j] = Math.Min(Math.Min(min1, min2), min3);
}
}
return d[d.GetUpperBound(0), d.GetUpperBound(1)];
}
答案 1 :(得分:4)
我设法使用WikiPedia + Google Code搜索的组合找到了我需要的大多数算法的实现。
http://en.wikipedia.org/wiki/Category:Algorithms_on_strings
http://www.google.com/codesearch
虽然很奇怪没有人在这个主题上创建项目,感兴趣的人可以就此进行合作。
答案 2 :(得分:2)
如果您正在进行字符串匹配,Lucene.Net值得一看。
然而,我知道这并不是你所追求的,虽然你可以用一些C#形式找到大部分算法,但我知道没有包含它们的库(我倾向于保留其中几个)在我的个人图书馆里。)
出于兴趣,为什么你需要多个具有几个阈值参数的完全匹配算法呢?
答案 3 :(得分:1)
这是我为Levenshtein / Damerau-Levenshtein距离实施的一个:
public static int GetDistance(string left, string right, bool isDamerauDistanceApplied)
{
if (left.Length == 0) return right.Length;
if (right.Length == 0) return left.Length;
var lenLeft = left.Length;
var lenRight = right.Length;
var matrix = new int[lenLeft + 1, lenRight + 1];
for (var i = 0; i <= lenLeft; i++)
matrix[i, 0] = i;
for (var i = 0; i <= lenRight; i++)
matrix[0, i] = i;
for (var i = 1; i <= lenLeft; i++)
{
for (var j = 1; j <= lenRight; j++)
{
var cost = (left[i - 1] == right[j - 1]) ? 0 : 1;
matrix[i, j] = Math.Min(Math.Min(matrix[i - 1, j] + 1, matrix[i, j - 1] + 1), matrix[i - 1, j - 1] + cost);
if (isDamerauDistanceApplied)
{
// Fixed for string base 0 index.
if (i > 1 && j > 1 && left[i - 1] == right[j - 2] && left[i - 2] == right[j - 1])
{
matrix[i, j] = Math.Min(matrix[i, j], matrix[i - 2, j - 2] + cost);
}
}
}
}
return matrix[lenLeft, lenRight];
}
答案 4 :(得分:1)
我建议使用SimMetrics库,它有许多不同的字符串匹配算法。也可在NuGet上找到。
简短说明:
SimMetrics是一个相似度量标准库,例如从编辑距离来看 (Levenshtein,Gotoh,Jaro等)其他指标,(例如Soundex, 查普曼)。
GPLv2许可证。
答案 5 :(得分:0)
我发现并使用the following .NET library实现了Tom Petricek的Aho-Corasick文本匹配问题。它对我很有用。