.NET字符串解析性能改进 - 可能的代码嗅觉

Ste*_*ard 6 .net c# linq

下面的代码旨在获取一个字符串并删除任何被认为对搜索短语不重要的任意单词.

我没有编写代码,但需要将其合并到其他内容中.它有效,这很好,但我感觉不对.但是,我似乎无法理解这种方法已经创造出来考虑另一种方法.

也许我只是让它变得比它需要的更复杂,但我觉得这可能更清洁,使用不同的技术,也许使用LINQ.

我欢迎任何建议; 包括我过度思考并且现有代码非常清晰,简洁和高效的建议.

那么,这是代码:

private string RemoveNonEssentialWords(string phrase)
{
    //This array is being created manually for demo purposes.  In production code it's passed in from elsewhere.
    string[] nonessentials = {"left", "right", "acute", "chronic", "excessive", "extensive", 
                                    "upper", "lower", "complete", "partial", "subacute", "severe",
                                    "moderate", "total", "small", "large", "minor", "multiple", "early",
                                    "major", "bilateral", "progressive"};
    int index = -1;

    for (int i = 0; i < nonessentials.Length; i++)
    {
        index = phrase.ToLower().IndexOf(nonessentials[i]);
        while (index >= 0)
        {
            phrase = phrase.Remove(index, nonessentials[i].Length);
            phrase = phrase.Trim().Replace("  ", " ");
            index = phrase.IndexOf(nonessentials[i]);
        }
    }

    return phrase;
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

干杯,

史蒂夫

Aar*_*ght 11

这似乎是用于从搜索短语中删除停用词的算法.

这里有一个想法:如果这实际上是用于搜索,你是否需要结果短语是原始的完美表示(所有原始空白都完好无损),但删除了停用词,或者它是否"足够接近" "这样结果仍然有效吗?

一种方法是将短语标记(使用您选择的方法 - 可以是正则表达式,我将使用简单的拆分),然后在删除停用词的情况下重新组装它.例:

public static string RemoveStopWords(string phrase, IEnumerable<string> stop)
{
    var tokens = Tokenize(phrase);
    var filteredTokens = tokens.Where(s => !stop.Contains(s));
    return string.Join(" ", filteredTokens.ToArray());
}

public static IEnumerable<string> Tokenize(string phrase)
{
    return string.Split(phrase, ' ');
    // Or use a regex, such as:
    //    return Regex.Split(phrase, @"\W+");
}
Run Code Online (Sandbox Code Playgroud)

这不会给你完全相同的结果,但我敢打赌,它足够接近,它肯定会更有效地运行.实际搜索引擎使用与此类似的方法,因为所有内容都是在单词级别而不是字符级别进行索引和搜索.

  • @qstarin:考虑到一个搜索短语不太可能超过,大约10个字左右,我怀疑它会带来一个重大问题.为`stop`参数传递一个`HashSet <string>`,这个数字变成O(N); 担心超出这一点的性能成为IMO的过早优化.瞄准干净,可读的代码,首先*合理地执行*; 那么,如果这还不够好,你可以开始进行微观优化. (2认同)

Ach*_*him 5

我想你的代码并没有做你想做的事情.如果我是对的,"主持"将被转换为"d".要获得一个好的解决方案,您必须更详细地指定您的要求.我可能会使用Replace或正则表达式.