下面的代码旨在获取一个字符串并删除任何被认为对搜索短语不重要的任意单词.
我没有编写代码,但需要将其合并到其他内容中.它有效,这很好,但我感觉不对.但是,我似乎无法理解这种方法已经创造出来考虑另一种方法.
也许我只是让它变得比它需要的更复杂,但我觉得这可能更清洁,使用不同的技术,也许使用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)
这不会给你完全相同的结果,但我敢打赌,它足够接近,它肯定会更有效地运行.实际搜索引擎使用与此类似的方法,因为所有内容都是在单词级别而不是字符级别进行索引和搜索.
归档时间: |
|
查看次数: |
664 次 |
最近记录: |