模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)
模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)
最近在研究模拟百度搜索以及自动中文分词算法,从数据库查询到相关关键词结果,最后是渲染HTML页面的关键词,关键词部分采用黄色背景红色字体高亮显示。
最后在渲染HTML页面的关键词高亮环节出现小问题,没有正确渲染关键词,如下图:

高亮关键词失败原因:
关键词高亮是根据自动分词系统分解的关键词顺序进行的,比如上图的关键词分词结果: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
//来源:C/S框架网(www.csframework.com) QQ:23404761

渲染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
/// 渲染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
/// 排序比较。被包含的词置后。比如: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#使用分词算法从文本字符串中抽取关键词模拟百度搜索

:


参考文档:
System.Web.HttpUtility 对URL/HTML字符串进行编码|C#源码
HtmlAgilityPack编程 - 使用DocumentNode.InnerText去除HTML标签-C/S开发框架
使用HtmlAgilityPack.HtmlDocument彻底清除HTML标签-C/S开发框架
HtmlAgilityPack编程 - 替换样式(style)的值-C/S开发框架
HtmlAgilityPack编程 - HtmlDocument删除html的样式-C/S开发框架
C#使用正则表达式移除所有的Html标记,返回纯文本-C/S开发框架
[电子商务]全诚商城生成HTML门户版 v4.0_mhv4-源码下载
[电子商务]全诚商城生成HTML多用户版店中店系统 V5.0_dyhmf-源码下载
[电子商务]全诚商城生成HTML第三版普通版_qcshop3-源码下载
[电子商务]全诚商城生成HTML第三版免虚拟目录版_mxqcshop3
软件开发与设计 - BBS-电子布告栏系统-CCS v2.0 免安装html版数据库表结构
软件开发与设计 - EMS-电子商城系统-全诚商城生成HTML多用户版店中店系统 V5.0
ASP.NET Web Forms - HTML 页面
C# 从html中通过正则找到IP地址信息(只支持ipv4地址)
C# CodeHighlighter生成的高亮着色HTML源码格式化
C#使用正则表达式移除所有的Html标记,返回纯文本
System.Web.HttpUtility 对URL/HTML字符串进行编码|C#源码
HtmlAgilityPack编程 - 使用DocumentNode.InnerText去除HTML标签-C/S开发框架
使用HtmlAgilityPack.HtmlDocument彻底清除HTML标签-C/S开发框架
HtmlAgilityPack编程 - 替换样式(style)的值-C/S开发框架
HtmlAgilityPack编程 - HtmlDocument删除html的样式-C/S开发框架
C#使用正则表达式移除所有的Html标记,返回纯文本-C/S开发框架
[电子商务]全诚商城生成HTML门户版 v4.0_mhv4-源码下载
[电子商务]全诚商城生成HTML多用户版店中店系统 V5.0_dyhmf-源码下载
[电子商务]全诚商城生成HTML第三版普通版_qcshop3-源码下载
[电子商务]全诚商城生成HTML第三版免虚拟目录版_mxqcshop3
软件开发与设计 - BBS-电子布告栏系统-CCS v2.0 免安装html版数据库表结构
软件开发与设计 - EMS-电子商城系统-全诚商城生成HTML多用户版店中店系统 V5.0
ASP.NET Web Forms - HTML 页面
C# 从html中通过正则找到IP地址信息(只支持ipv4地址)
C# CodeHighlighter生成的高亮着色HTML源码格式化
C#使用正则表达式移除所有的Html标记,返回纯文本
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
