public IActionResult SearchProblems([FromForm] ProblemSearch search) { var li = _Repository.GetAllProblems(); var tags = search.Tags.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries); if (!string.IsNullOrEmpty(search.ProblemDescription)) { // 先筛有题目描述的题 li = li.Where(p => !string.IsNullOrEmpty(p.ProblemDescription)); li = li.OrderByDescending(p => { var tagW = SimilarityTool.TagSim(p.Tags, tags); var desW = SimilarityTool.LDistanceSim(search.ProblemDescription, p.ProblemDescription); return(SimilarityTool.CalculateWeight(tagW, desW)); }); } else { // 没有题目描述 li = li.OrderByDescending(p => SimilarityTool.TagSim(p.Tags, tags)); } _Logger.LogInformation("Successfully search!"); return(Ok(li)); }
public DataTable StringComparisonResult(DataTable ColumnList1, DataTable ColumnList2, string Type, string Cloumn1 = "", string Cloumn2 = "", int index = 0) { try { DataTable dataTable = new DataTable(); dataTable.Columns.Add(Cloumn1); dataTable.Columns.Add(Cloumn2); if (index == 0) { dataTable.Columns.Add(Cloumn1 + "%" + Cloumn2); } else { dataTable.Columns.Add("Similarity " + index); } for (int listi = 0; listi < ColumnList1.Rows.Count; listi++) { SimilarityTool similarityTool = new SimilarityTool(); if (ColumnList1.Rows[listi][0] == null) { ColumnList1.Rows[listi][0] = ""; } if (ColumnList2.Rows[listi][0] == null) { ColumnList2.Rows[listi][0] = ""; } string kevin = Regex.Replace(ColumnList1.Rows[listi][0].ToString(), @"\s+", "").ToUpper(); string kevyn = Regex.Replace(ColumnList2.Rows[listi][0].ToString(), @"\s+", "").ToUpper(); if (kevin.Length == 0 || kevyn.Length == 0) { dataTable.Rows.Add(kevin, kevyn.ToString(), "0"); } else { var lMatched1 = new bool[kevin.Length]; var lMatched2 = new bool[kevyn.Length]; var lNumCommon = 0; for (var i = 0; i < kevin.Length; ++i) { var lStart = Math.Max(0, i - kevyn.Length); var lEnd = kevyn.Length; for (var j = lStart; j < lEnd; ++j) { if (lMatched2[j]) { continue; } if (!Comparer.Equals(kevin[i], kevyn[j])) { continue; } lMatched1[i] = true; lMatched2[j] = true; ++lNumCommon; break; } } double intersectPercentage = (lNumCommon * 2 * 100) / (kevin.Length + kevyn.Length); double Percentage; //Console.WriteLine(intersectPercentage); if (intersectPercentage >= 60) { Percentage = JWD_With_Damerau_LevenshteinAlgo.JWD_With_Damerau_Levenshtein(kevin, kevyn) * 100; //Percentage = JaroWinklerDistance.Proximity(kevin, kevyn)*100; //Console.WriteLine(sdsd); } else { Percentage = similarityTool.CompareStrings(kevin, kevyn) * 100; //Console.WriteLine(Number); } dataTable.Rows.Add(ColumnList1.Rows[listi][0].ToString(), ColumnList2.Rows[listi][0].ToString(), Math.Round(Percentage, 2)); } } return(dataTable); } catch (Exception e) { throw; } }