【问题标题】:how to pick most matching string from tupled strings如何从元组字符串中选择最匹配的字符串
【发布时间】:2015-06-30 06:24:46
【问题描述】:

我的程序中有这些代码行。即

var scored = lines.Select(line => 
    Tuple.Create(line, p.calculate_CS(line, summary), summary));
dd.AddRange(scored); 
var top_value = dd.OrderByDescending(x => x.Item2).FirstOrDefault();

我还必须将最相似的匹配写入数据库,所以想要最相似的计算值加上最相似的单词匹配字符串。

if (top_value.Item2 > 0 && top_value != null)
{
    var abstrct = top_value.Item3.ToString();
    var r_field = top_value.Item1.ToString();
    write_To_Database(abstrct, r_field);
}

元组有三个变量,即string line(即匹配373个字符串)double similarity valuestring summary(即单个字符串匹配所有373个)。项目line 与项目summary 匹配。 变量top_valuelinesummary 字符串之间的最高相似度值。 现在的问题是similarity valuesummary 对于line 中的某些字符串变得相同。因此line 中的字符串按字母顺序排序。因此,如果某些字符串的最高值相同,则 top_value 将按字母顺序具有最高值,而它可能与较低的字符串最相似。

所以我希望在 top_value 中具有最高相似值加上最相似的字符串匹配,无论字母顺序排序。

例如,如果summary 是“2001 年的软件工程 - 案例”,则匹配的值是(由这些代码行给出)。

从附加的图像中可以看出,要匹配的字符串包含字符串Software Engineering.........,我在最高top_value 中得到engineering design,而它应该是software engineering。将待匹配字符串和匹配字符串拆分后,根据词项计算相似度值。但是由于line中字符串的字母顺序,我得到engineering design而不是software engineering 任何建议都受到高度赞赏。谢谢

【问题讨论】:

    标签: c# string match similarity


    【解决方案1】:

    如果匹配算法给您带来不想要的匹配,您显然需要更改匹配算法。由于您没有在此处发布您的匹配算法,我将仅使用我自己的示例来说明如何完成此操作。我已经对您的calculate_CS 算法进行了逆向工程,以匹配您在给定输入上的结果,尽管我猜它与您的实现不同。这只是为了说明。此外,我用来更改比赛得分的算法选择是任意的,可能无法满足您的需求。这也只是为了说明。

    void Main()
    {
        var lines = new[] { 
            "engineering design",
            "requirement engineering", 
            "reverse engineering",
            "software engineering",
            "access control policies",
            "active learning", 
            "ad hock network", 
            "agent based reasoning"
            // etc...
        };
    
        var summary = "Software engineering in 2001 - A case";
    
        var dd = new List<Tuple<String, Double, String>>();
        dd.AddRange(lines.Select(line => Tuple.Create(line, calculate_CS(line, summary), summary)));
        var top_value = dd.OrderByDescending(x => x.Item2).FirstOrDefault();
    
        var ddNew = new List<Tuple<String, Double, String>>();
        ddNew.AddRange(lines.Select(line => Tuple.Create(line, calculate_Lcs(line, summary), summary)));
        var top_value_new = ddNew.OrderByDescending(x => x.Item2).FirstOrDefault();
    
        top_value.Dump();
        top_value_new.Dump();
    }
    
    private double calculate_CS(string line, string summary)
    {
        var lineWords = line?.ToLower().Split(' ');
        var summaryWords = summary?.ToLower().Split(' ');
    
        return lineWords?.Intersect(summaryWords).Any() ?? false
            ? 0.110795817239161
            : 0;
    }
    
    private double calculate_Lcs(string line, string summary)
    {  
        // using https://www.nuget.org/packages/DuoVia.FuzzyStrings/
        return line.LongestCommonSubsequence(summary).Item2;
    }
    

    (Download LinqPad Query)

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多