lunece 用的高亮类

本文介绍了一种简单的高亮实现方法,使用JE分词结合正则表达式进行关键字高亮处理。该方法通过分词将关键字拆分,并逐一匹配文档中的相应部分进行高亮显示。

网上有很多高亮的类,但我觉得太负责了(也许他们觉得这样性能更高),我写了一个很简单采用je分词+正则解决高亮问题,实际使用下来还是不错的:

java 代码
  1. import java.util.Iterator;   
  2. import java.util.List;   
  3.   
  4. /**  
  5.  * @author edwardpro  
  6.  *   
  7.  */  
  8. public class HighlightProcess {   
  9.   
  10.     /**  
  11.      *   
  12.      */  
  13.     private String str;   
  14.   
  15.     private String key;   
  16.   
  17.     private static final String HIGH_LIGHT = ";   
  18.   
  19.     public HighlightProcess(String str, String key) {   
  20.         // TODO Auto-generated constructor stub   
  21.         this.str = str;   
  22.         this.key = key;   
  23.     }   
  24.   
  25.     /**  
  26.      * @return the str  
  27.      */  
  28.     public String getStr() {   
  29.         return str;   
  30.     }   
  31.   
  32.     /**  
  33.      * @param str  
  34.      *            the str to set  
  35.      */  
  36.     public void setStr(String str) {   
  37.         this.str = str;   
  38.     }   
  39.   
  40.     public String getResult() {   
  41.   
  42.         List list = WordsManager.splitStrToList(key);   
  43.         for (Iterator it = list.iterator(); it.hasNext();) {   
  44.             String target = (String) it.next();   
  45.             this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);   
  46.         }   
  47.         return this.str;   
  48.     }   
  49.   
  50. }  

分词这边使用了一个工厂方法,用来装载词库的,返回的是JE分词对象:

java 代码
  1. import java.io.File;   
  2. import java.io.FileNotFoundException;   
  3. import java.io.FileReader;   
  4. import java.io.IOException;   
  5. import java.util.ArrayList;   
  6. import java.util.Iterator;   
  7. import java.util.List;   
  8. import java.util.StringTokenizer;   
  9.   
  10. import jeasy.analysis.MMAnalyzer;   
  11.   
  12. import org.apache.log4j.Logger;   
  13.   
  14.   
  15. public class WordsManager {   
  16.   
  17.     private static final Logger logger = Logger.getLogger(WordsManager.class);   
  18.   
  19.     private static MMAnalyzer mmanalyzer;   
  20.   
  21.     private static final String DEF_SPT = "<>";   
  22.   
  23.     static {   
  24.         init();   
  25.     }   
  26.   
  27.     private static void init() {   
  28.         reload();   
  29.         mmanalyzer = new MMAnalyzer();   
  30.     }   
  31.   
  32.     public static void reload() {   
  33.         if (AppInit.getScb().getExtDic() != null  
  34.                 && !AppInit.getScb().getExtDic().equalsIgnoreCase("")) {   
  35.             File dir = new File(AppInit.getScb().getExtDic());   
  36.             File[] dics = dir.listFiles();   
  37.             // add dict file   
  38.             for (int i = 0; i < dics.length; i++) {   
  39.                 try {   
  40.                     MMAnalyzer.addDictionary(new FileReader(dics[i]));   
  41.                 } catch (FileNotFoundException e) {   
  42.                     // TODO Auto-generated catch block   
  43.                     logger.error("Read File Error", e);   
  44.                 }   
  45.             }   
  46.         }   
  47.     }   
  48.   
  49.     /**  
  50.      * @return the mmanalyzer  
  51.      */  
  52.     public static MMAnalyzer getMmanalyzer() {   
  53.         return mmanalyzer;   
  54.     }   
  55.   
  56.     /**  
  57.      * @param mmanalyzer  
  58.      *            the mmanalyzer to set  
  59.      */  
  60.     public static void setMmanalyzer(MMAnalyzer mmanalyzer) {   
  61.         WordsManager.mmanalyzer = mmanalyzer;   
  62.     }   
  63.   
  64.     public static String[] splitStrToArray(String source) {   
  65.         try {   
  66.             String target = mmanalyzer.segment(source, DEF_SPT);   
  67.             String[] ts = target.split(DEF_SPT);   
  68.             return ts;   
  69.         } catch (IOException e) {   
  70.             // TODO Auto-generated catch block   
  71.             e.printStackTrace();   
  72.         }   
  73.         return null;   
  74.     }   
  75.   
  76.     public static List splitStrToList(String source) {   
  77.         List ret = new ArrayList();   
  78.         try {   
  79.             String target = mmanalyzer.segment(source, DEF_SPT);   
  80.             StringTokenizer st = new StringTokenizer(target, DEF_SPT);   
  81.             for (; st.hasMoreTokens();) {   
  82.                 ret.add(st.nextToken());   
  83.             }   
  84.         } catch (IOException e) {   
  85.             // TODO Auto-generated catch block   
  86.             logger.error("segment error", e);   
  87.         }   
  88.         return ret;   
  89.   
  90.     }   
  91.   
  92.     public static void removeTag(String content) {   
  93.         MMAnalyzer.removeWord(content);   
  94.     }   
  95. }   

正则方法:

java 代码
  1. String reg="$1";  
java 代码
  1. public static String regxReplace(String str, String key, String rep) {   
  2.     Pattern p = Pattern.compile("(" + key + ")", Pattern.CASE_INSENSITIVE);   
  3.     Matcher m = p.matcher(str);   
  4.     return m.replaceAll(rep);   
  5. }  

原理很简单,利用分词分开,然后用这则一个个匹配掉目标中的关键字,由于实际中大部分都是替换标题和200字的描述所以并没有使用流方法,下次有时间改用流或者stringbuffer或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖

       public HighlightProcess(String str, String key) {            // TODO Auto-generated constructor stub            this.str = str;            this.key = key;        }           /**        * @return the str        */       public String getStr() {            return str;        }           /**        * @param str        *            the str to set        */       public void setStr(String str) {            this.str = str;        }           public String getResult() {               List list = WordsManager.splitStrToList(key);            for (Iterator it = list.iterator(); it.hasNext();) {                String target = (String) it.next();                this.str = RegxTools.regxReplace(this.str, target, HIGH_LIGHT);            }            return this.str;        }       }  

分词这边使用了一个工厂方法,用来装载词库的,返回的是JE分词对象:

java 代码
  1. import java.io.File;   
  2. import java.io.FileNotFoundException;   
  3. import java.io.FileReader;   
  4. import java.io.IOException;   
  5. import java.util.ArrayList;   
  6. import java.util.Iterator;   
  7. import java.util.List;   
  8. import java.util.StringTokenizer;   
  9.   
  10. import jeasy.analysis.MMAnalyzer;   
  11.   
  12. import org.apache.log4j.Logger;   
  13.   
  14.   
  15. public class WordsManager {   
  16.   
  17.     private static final Logger logger = Logger.getLogger(WordsManager.class);   
  18.   
  19.     private static MMAnalyzer mmanalyzer;   
  20.   
  21.     private static final String DEF_SPT = "<>";   
  22.   
  23.     static {   
  24.         init();   
  25.     }   
  26.   
  27.     private static void init() {   
  28.         reload();   
  29.         mmanalyzer = new MMAnalyzer();   
  30.     }   
  31.   
  32.     public static void reload() {   
  33.         if (AppInit.getScb().getExtDic() != null  
  34.                 && !AppInit.getScb().getExtDic().equalsIgnoreCase("")) {   
  35.             File dir = new File(AppInit.getScb().getExtDic());   
  36.             File[] dics = dir.listFiles();   
  37.             // add dict file   
  38.             for (int i = 0; i < dics.length; i++) {   
  39.                 try {   
  40.                     MMAnalyzer.addDictionary(new FileReader(dics[i]));   
  41.                 } catch (FileNotFoundException e) {   
  42.                     // TODO Auto-generated catch block   
  43.                     logger.error("Read File Error", e);   
  44.                 }   
  45.             }   
  46.         }   
  47.     }   
  48.   
  49.     /**  
  50.      * @return the mmanalyzer  
  51.      */  
  52.     public static MMAnalyzer getMmanalyzer() {   
  53.         return mmanalyzer;   
  54.     }   
  55.   
  56.     /**  
  57.      * @param mmanalyzer  
  58.      *            the mmanalyzer to set  
  59.      */  
  60.     public static void setMmanalyzer(MMAnalyzer mmanalyzer) {   
  61.         WordsManager.mmanalyzer = mmanalyzer;   
  62.     }   
  63.   
  64.     public static String[] splitStrToArray(String source) {   
  65.         try {   
  66.             String target = mmanalyzer.segment(source, DEF_SPT);   
  67.             String[] ts = target.split(DEF_SPT);   
  68.             return ts;   
  69.         } catch (IOException e) {   
  70.             // TODO Auto-generated catch block   
  71.             e.printStackTrace();   
  72.         }   
  73.         return null;   
  74.     }   
  75.   
  76.     public static List splitStrToList(String source) {   
  77.         List ret = new ArrayList();   
  78.         try {   
  79.             String target = mmanalyzer.segment(source, DEF_SPT);   
  80.             StringTokenizer st = new StringTokenizer(target, DEF_SPT);   
  81.             for (; st.hasMoreTokens();) {   
  82.                 ret.add(st.nextToken());   
  83.             }   
  84.         } catch (IOException e) {   
  85.             // TODO Auto-generated catch block   
  86.             logger.error("segment error", e);   
  87.         }   
  88.         return ret;   
  89.   
  90.     }   
  91.   
  92.     public static void removeTag(String content) {   
  93.         MMAnalyzer.removeWord(content);   
  94.     }   
  95. }   

正则方法:

java 代码
  1. String reg="$1";  
java 代码
  1. public static String regxReplace(String str, String key, String rep) {   
  2.     Pattern p = Pattern.compile("(" + key + ")", Pattern.CASE_INSENSITIVE);   
  3.     Matcher m = p.matcher(str);   
  4.     return m.replaceAll(rep);   
  5. }  

原理很简单,利用分词分开,然后用这则一个个匹配掉目标中的关键字,由于实际中大部分都是替换标题和200字的描述所以并没有使用流方法,下次有时间改用流或者stringbuffer或者其他更接近分词的方法来做下看看,有什么问题,欢迎大家拍砖

成都市作为中国西部地区具有战略地位的核心都市,其人口的空间分布状况对于城市规划、社会经济发展及公共资源配置等研究具有基础性数据价值。本文聚焦于2019年度成都市人口分布的空间数据集,该数据以矢量格式存储,属于地理信息系统中常用的数据交换形式。以下将对数据集内容及其相关技术要点进行系统阐述。 Shapefile 是一种由 Esri 公司提出的开放型地理空间数据格式,用于记录点、线、面等几何要素。该格式通常由一组相互关联的文件构成,主要包括存储几何信息的 SHP 文件、记录属性信息的 DBF 文件、定义坐标系统的 PRJ 文件以及提供快速检索功能的 SHX 文件。 1. **DBF 文件**:该文件以 dBase 表格形式保存与各地理要素相关联的属性信息,例如各区域的人口统计数值、行政区划名称及编码等。这类表格结构便于在各类 GIS 平台中进行查询与编辑。 2. **PRJ 文件**:此文件明确了数据所采用的空间参考系统。本数据集基于 WGS84 地理坐标系,该坐标系在全球范围内广泛应用于定位与空间分析,有助于实现跨区域数据的准确整合。 3. **SHP 文件**:该文件存储成都市各区(县)的几何边界,以多边形要素表示。每个多边形均配有唯一标识符,可与属性表中的相应记录关联,实现空间数据与统计数据的联结。 4. **SHX 文件**:作为形状索引文件,它提升了在大型数据集中定位特定几何对象的效率,支持快速读取与显示。 基于上述数据,可开展以下几类空间分析: - **人口密度评估**:结合各区域面积与对应人口数,计算并比较人口密度,识别高密度与低密度区域。 - **空间集聚识别**:运用热点分析(如 Getis-Ord Gi* 统计)或聚类算法(如 DBSCAN),探测人口在空间上的聚集特征。 - **空间相关性检验**:通过莫兰指数等空间自相关方法,分析人口分布是否呈现显著的空间关联模式。 - **多要素叠加分析**:将人口分布数据与地形、交通网络、环境指标等其他地理图层进行叠加,探究自然与人文因素对人口布局的影响机制。 2019 年成都市人口空间数据集为深入解析城市人口格局、优化国土空间规划及完善公共服务体系提供了重要的数据基础。借助地理信息系统工具,可开展多尺度、多维度的定量分析,从而为城市管理与学术研究提供科学依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安全性与鲁棒性。该模型通过Matlab代码实现,具备较强的工程应用价值和学术参考意义,适用于电力系统风险评估、脆弱性分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真与复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模与风险评估研究;②支撑高水平论文(如EI/SCI)的模型复现与算法验证;③为电网安全分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求解,提升科研效率。; 阅读建议:建议读者结合提供的网盘资源,下载完整代码与案例进行实践操作,重点关注双层优化结构与场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值