我的程序中有这些代码行。即。
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 value
和string summary
(即单个字符串与所有373匹配)。商品line
与商品summary
相匹配。
变量top_value
是line
和summary
字符串之间最高的相似度值。
现在问题是similarity value
的{{1}}对于summary
中的某些字符串变得相同。因此line
中的字符串按字母顺序排序。因此,如果某些字符串的最高值相同,则top_value将按字母顺序排列最高值,而与较低字符串最相似。
所以我想在top_value中获得最高的相似值以及最相似的字符串匹配,无论按字母顺序排序顺序。
例如,如果line
是“2001年的软件工程 - 案例”,则匹配的值(由这些代码行给出)。
从附图中可以看出,要匹配的字符串包含字符串summary
,其中Software Engineering.........
位于最高engineering design
,而top_value
应该是software engineering
。在分割要匹配的字符串和匹配字符串之后,基于术语计算相似度值。但是由于line
中字符串按字母顺序排序,我得到了engineering design
而不是software engineering
任何建议都非常感谢。感谢
答案 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;
}
结果: