gpt4 book ai didi

c# - C# 中的查询扩展逻辑

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:10:02 26 4
gpt4 key购买 nike

我必须编写用于扩展 solr 搜索引擎查询的逻辑。我正在使用
Dictionary<string, string> dicSynon = new Dictionary<string, string>();
.

每次我都会得到像“2 ln ca”这样的字符串。在我的字典中,ln 和 ca 的同义词是 lane 和 california。现在我需要将所有字符串组合传递给 solr。像这样

2 ln ca
2 lane ca
2 lane california
2 ln california

请帮我建立逻辑....

最佳答案

这是一个使用组合学和 Linqs SelectMany 的练习:

首先你必须自己编写一些函数来给你一个给定单词的同义词序列(包括单词,所以“2”将导致(“2”)) - 让我们称之为'Synonmys' - 使用字典它可以看起来像这样:

private Dictionary<string, IEnumerable<string>> synonyms = new Dictionary<string, IEnumerable<string>>();

public IEnumerable<string> GetSynonmys(string word)
{
return synonyms.ContainsKey(word) ? synonyms[word] : new[]{word};
}

(你必须自己填写字典...)

有了这个,您的任务就相当容易了——只要想一想。您必须将一个词的每个同义词与您在其余词上执行任务时获得的所有组合结合起来——这正是您可以使用 SelectMany 的地方(我只粘贴其余部分,用空格分隔——也许您应该重构一下) - 算法本身就是你的标准递归组合算法 - 如果你知道这种问题,你会看到很多:

public string[] GetWords(string text)
{
return text.Split(new[]{' '}); // add more seperators if you need
}

public IEnumerable<string> GetCombinations(string[] words, int lookAt = 0)
{
if (lookAt >= words.Length) return new[]{""};

var currentWord = words[lookAt];
var synonymsForCurrentWord = GetSynonmys(currentWord);
var combinationsForRest = GetCombinations(words, lookAt + 1);

return synonymsForCurrentWord.SelectMany(synonym => combinationsForRest.Select(rest => synonym + " " + rest));
}

这是一个完整的例子:

class Program
{
static void Main(string[] args)
{
var test = new Synonmys(Tuple.Create("ca", "ca"),
Tuple.Create("ca", "california"),
Tuple.Create("ln", "ln"),
Tuple.Create("ln", "lane"));

foreach (var comb in test.GetCombinations("2 ln ca"))
Console.WriteLine("Combination: " + comb);
}
}

class Synonmys
{
private Dictionary<string, IEnumerable<string>> synonyms;

public Synonmys(params Tuple<string, string>[] syns )
{
synonyms = syns.GroupBy(s => s.Item1).ToDictionary(g => g.Key, g => g.Select(kvp => kvp.Item2));
}

private IEnumerable<string> GetSynonmys(string word)
{
return synonyms.ContainsKey(word) ? synonyms[word] : new[]{word};
}

private string[] GetWords(string text)
{
return text.Split(new[]{' '}); // add more seperators if you need
}

private IEnumerable<string> GetCombinations(string[] words, int lookAt = 0)
{
if (lookAt >= words.Length) return new[]{""};

var currentWord = words[lookAt];
var synonymsForCurrentWord = GetSynonmys(currentWord);
var combinationsForRest = GetCombinations(words, lookAt + 1);

return synonymsForCurrentWord.SelectMany(synonym => combinationsForRest.Select(rest => synonym + " " + rest));
}

public IEnumerable<string> GetCombinations(string text)
{
return GetCombinations(GetWords(text));
}

}

如果这里有什么地方不是很清楚,请随时发表评论;)

关于c# - C# 中的查询扩展逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9732369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com