用于文本算法的.NET库?

时间:2010-12-22 10:39:33

标签: c# .net algorithm text full-text-search

你知道任何用于文本算法的.NET库吗? 特别是我对字符串匹配和像

这样的全文搜索算法很感兴趣
  • Bitap算法
  • Levenshtein距离
  • Damerau-Levenshtein距离

我知道我提到的那个代码非常简单,但有数百种文本算法,我不想自己编写代码。
如果没有已知的这样的.NET库,你可以提一下C,C ++库,编码包装器比从零编码更容易。

6 个答案:

答案 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文本匹配问题。它对我很有用。