如何从元组字符串

时间:2015-06-30 06:24:47

标签: c# string match similarity

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

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

元组有三个vairables,即string line(即数字匹配的字符串373)double similarity valuestring summary(即单个字符串与所有373匹配)。商品line与商品summary相匹配。 变量top_valuelinesummary字符串之间最高的相似度值。 现在问题是similarity value的{​​{1}}对于summary中的某些字符串变得相同。因此line中的字符串按字母顺序排序。因此,如果某些字符串的最高值相同,则top_value将按字母顺序排列最高值,而与较低字符串最相似。

所以我想在top_value中获得最高的相似值以及最相似的字符串匹配,无论按字母顺序排序顺序。

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

Results of scoring lines and summary matches

从附图中可以看出,要匹配的字符串包含字符串summary,其中Software Engineering.........位于最高engineering design,而top_value应该是software engineering。在分割要匹配的字符串和匹配字符串之后,基于术语计算相似度值。但是由于line中字符串按字母顺序排序,我得到了engineering design而不是software engineering 任何建议都非常感谢。感谢

1 个答案:

答案 0 :(得分:0)

如果匹配算法给你不想要的匹配,你显然需要更改它。由于您未在此处发布匹配算法,因此我将使用自己的示例来说明如何完成此操作。我反向设计了您的calculate_CS算法以匹配给定输入的结果,但我猜它与您的实现不一样。这仅仅是为了说明。此外,用于更改匹配评分的算法I的选择是任意的,可能无法满足您的需求。它也只是为了说明。

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

结果:

Comparison of the results of applying different matching algorithms to the lines and summary input