模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)
作者:作者不详  发布日期:2020/03/08 15:39:24
  模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)

模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)

最近在研究模拟百度搜索以及自动中文分词算法,从数据库查询到相关关键词结果,最后是渲染HTML页面的关键词,关键词部分采用黄色背景红色字体高亮显示。

最后在渲染HTML页面的关键词高亮环节出现小问题,没有正确渲染关键词,如下图:

贴图图片-模拟百度搜索渲染HTML关键词高亮排序算法1


高亮关键词失败原因:

关键词高亮是根据自动分词系统分解的关键词顺序进行的,比如上图的关键词分词结果:api,webapi,程序首先高亮渲染api关键词,那么webapi关键词被强行拆分了!!!

HTML Code:

web<span class="search-highlight">api</span>


当程序高亮webapi关键词的时候,HTML内容已经无法匹配到webapi关键词!


解决方案:对关键词的包含关系重新分组排序!!!

逻辑推理:首先高亮webapi关键词,然后高亮api

HTML Code:

<span class="search-highlight">webapi</span>

//来源:C/S框架网(www.csframework.com) QQ:23404761




贴图图片-模拟百度搜索渲染HTML关键词高亮排序算法2



渲染HTML页面关键词高亮分组排序算法:


C# Code:

/// <summary>
/// 渲染HTML页面关键词高亮分组排序算法
/// </summary>
public class KeywordSort
{
  
  
/// <summary>
  
/// 关键词分组排序算法
  
/// </summary>
  
/// <param name="keyWords"></param>
  
/// <returns></returns>
  
public static string SortKeywords(string keyWords)
  {
    
try
    {
      
#region 按每个关键词包含关系分组
      
      SortedList groups
= new SortedList();
      
string[] keys = keyWords.Split(',');
      
foreach (string key in keys)
      {
        
if (String.IsNullOrEmpty(key)) continue;
        
        ArrayList sort
= new ArrayList();
        
foreach (string s in keys)
        {
          
if (s.IndexOf(key) >= 0) sort.Add(s);
        }
        
if (sort.Count > 1) sort.Sort(new SortComapre());//按包含关系排序
        
groups.Add(key, sort);
      }
      
      
#endregion
      
      
#region 重新组合关键词 - 按关键词分组关系重新组合
      
      ArrayList result
= new ArrayList();
      
      
foreach (DictionaryEntry g in groups)
      {
        
foreach (string s in (g.Value as ArrayList))
        {
          
if (!result.Contains(s)) result.Add(s);
        }
      }
      
      
#endregion
      
      
//输出关键词组合,逗号分开
      
StringBuilder sb = new StringBuilder();
      
foreach (string s in result) sb.Append(s + ",");
      
      
return sb.ToString();
    }
    
catch (Exception ex)
    {
      
return keyWords;
    }
  }
  
}


//来源:C/S框架网(www.csframework.com) QQ:23404761



C# Code:

/// <summary>
/// 排序比较。被包含的词置后。比如:api,webapi 输出==> webapi,api, api被包含,排序放后面
/// </summary>
public class SortComapre : IComparer
{
  
public int Compare(object x, object y)
  {
    
if (x == null && y == null) return 0;
    
if (x == null && y != null) return -1;
    
if (x != null && y == null) return 1;
    
    x
= x.ToString().ToLower();
    y
= y.ToString().ToLower();
    
    
if (x.ToString() == y.ToString())
    
return 0;
    
else if (x.ToString().Contains(y.ToString()))
    
return -1;
    
else if (y.ToString().Contains(x.ToString()))
    
return 1;
    
else
    
return 0;
  }
  
}


//来源:C/S框架网(www.csframework.com) QQ:23404761



参考文章:


模拟搜索引擎中文自动分词算法精华(CSFramework特别提供C#源码)


C#模拟百度搜索长词自动语义匹配,使用分词算法抽取关键词


C#使用分词算法从文本字符串中抽取关键词模拟百度搜索






扫一扫加微信:
 

上一篇 下一篇