模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)
模拟百度搜索渲染HTML页面关键词高亮分组排序算法(C#)
当程序高亮webapi关键词的时候,HTML内容已经无法匹配到webapi关键词!
C#模拟百度搜索长词自动语义匹配,使用分词算法抽取关键词
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#使用分词算法从文本字符串中抽取关键词模拟百度搜索
扫一扫加微信:
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网