【问题标题】:Query Expansion logic in C#C# 中的查询扩展逻辑
【发布时间】:2012-03-16 05:27:57
【问题描述】:

我必须为 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

请帮我建立逻辑......

【问题讨论】:

标签: c# algorithm solr


【解决方案1】:

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

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

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));
    }

}

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

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2016-02-11
    相关资源
    最近更新 更多