import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.util.HashMap; /** * 类名:FilePreprocess 方法: 功能:完成使用lucene进行索引前的预处理,即:半角全角转化、大文件切分; * */ public class FilePreprocess { /** * 参数:File file被处理的源文件 String outputDir处理后的文件输出路径 */ public static void preprocess(File file, String outputDir) { try { splitToSmallFiles(charactorProcess(file, outputDir + "output.all"), outputDir); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static File charactorProcess(File file, String destFile) throws Exception { // 创建一个输出流,用于写新文件 BufferedWriter writer = new BufferedWriter(new FileWriter(destFile)); // 创建一个输入流,用于读取文件 BufferedReader reader = new BufferedReader(new FileReader(file)); String line = reader.readLine(); while (line != null) { if (!line.equals("\r\n")) { // 调用replace方法替换所有全角字符 String newline = replace(line); // 将替换后的String写入新文件 writer.write(newline); // 写入行分隔符 writer.newLine(); } line = reader.readLine(); } // 关闭输入输出流,将缓冲区数据写入文件 reader.close(); writer.close(); return new File(destFile); } /** * 方法名:replace 参数:String line传入需要处理的行字符串 功能: 全角半角转换 * * @author MzyAiLqq * */ private static String replace(String line) { // 创建一个HashMap用来存储全角字符和半角字符的对应关系 // 每个entry中的key为全角字符,value为半角字符 HashMap<String, String> map = new HashMap<String, String>(); map.put(",", ","); map.put("。", "."); map.put("〈", "<"); map.put("〉", ">"); map.put("|", "|"); map.put("《", "<"); map.put("》", ">"); map.put("[", "["); map.put("]", "]"); map.put("?", "?"); map.put(""", "\""); map.put(":", ":"); map.put("﹑", ","); map.put("(", "("); map.put(")", ")"); map.put("【", "["); map.put("】", "]"); map.put("-", "-"); map.put(" ̄", "~"); map.put("!", "!"); map.put("`", "`"); map.put("1", "1"); map.put("2", "2"); map.put("3", "3"); map.put("4", "4"); map.put("5", "5"); map.put("6", "6"); map.put("7", "7"); map.put("8", "8"); map.put("9", "9"); int length = line.length(); for (int i = 0; i < length; i++) { // 每次截取一个字符进行判断 String charat = line.substring(i, i + 1); if (map.get(charat) != null) { line = line.replace(charat, (String) map.get(charat)); } } // 返回转换后的字符行 return line; } /** * 方法名:splitToSmallFiles 参数:File file,String outputpath 功能:把文件拆分成小文件 * */ public static void splitToSmallFiles(File file, String outputpath) throws Exception { // 文件计数器,用来产生文件名 int filePointer = 0; // 定义单个文件的最大长度 final int MAX_SIZE = 10240; // 创建文件输出、输入流 BufferedWriter writer = null; BufferedReader reader = new BufferedReader(new FileReader(file)); // 建立字符串缓冲区,存储大文件中读取的数据 StringBuffer buffer = new StringBuffer(); String line = reader.readLine(); // 循环遍历读取的每行字符串 while (line != null) { // 如果读取的字符串不为空,则将字符串加入缓冲区并在末尾加上回车换行 buffer.append(line).append("\r\n"); // 判断缓冲区长度是否达到定义的单个文件最大长度 if (buffer.toString().getBytes().length >= MAX_SIZE) { // 如果打到最大长度,则将缓冲区的数据写入文件 // filePointer是文件名前缀的一部分 writer = new BufferedWriter(new FileWriter(outputpath + "output" + filePointer + ".txt")); writer.write(buffer.toString()); writer.close(); // 文件计数器自加1 filePointer++; // 清空StringBuffer中的数据 buffer = new StringBuffer(); } // 如果没有达到最大长度,则继续读取下一行 line = reader.readLine(); System.out.println(filePointer); } // 如果大文件已经读取完毕,直接将缓冲区的数据写入文件 writer = new BufferedWriter(new FileWriter(outputpath + "output" + filePointer + ".txt")); writer.write(buffer.toString()); reader.close(); writer.close(); } /** * 测试主方法 * */ public static void main(String args[]) { String inputFile = "E:\\办公\\Java 开发\\" + "电子书_学习资源\\java电子书\\[JAVA学习手册].handbook.chm"; String outputDir = "E:\\testFolder\\"; if (!new File(outputDir).exists()) new File(outputDir).mkdirs(); FilePreprocess filePreprocess = new FilePreprocess(); filePreprocess.preprocess(new File(inputFile), outputDir); } }
相关推荐
针对中文检索的Lucene改进策略 为了提高基于Lucene中文检索系统的检索精度和效率,通过...理模块中采用提取特定数量的特征词来替代文档的方法能够有效提高Lucene检索系统的效率和精度,增强Lucene检索系统中文 的性能。
学习全文检索的最佳入门之原始代码(非 Lucene)。全文检索系统的实现技术分为三个方面:关系型全文检索系统、层次型全文检索系统、面向对象的全文检索系统及自动标引技术。 针对全文数据系统的构建,提出全文检索...
使用Lucene检索和使用java.lang.String内置方法进行检索的效率比较 安装:直接在Eclipse中选取“import->Existing Project” Eclipse工程/ch7:原书第七章和第九章的Eclipse工程文件 使用PDFBox解析PDF文件 使用...
使用Lucene检索和使用java.lang.String内置方法进行检索的效率比较 安装:直接在Eclipse中选取“import->Existing Project” Eclipse工程/ch7:原书第七章和第九章的Eclipse工程文件 使用PDFBox解析PDF文件 使用...
本文主要是承接上一个项目文本预处理(资源中已经给出)的数据来作为支撑进行设计与实现的文本搜索引擎,采用的是Lucene工具包来进行实现的,同时还进行了余弦相似度的检测以及K-Means聚类分析,本报告是比较详细的...
(由于lucene是java库,所以pyLucene库的安装极其麻烦,因此选用Python原生库Whoosh实现,并使用jieba进行中文分词。) 搜索网页界面用django实现,页面模板套用BootCDN。 以下是检索的基本要求:可以利用lucene、...
大二暑假参与时空数据检索项目,我做数据预处理部分,该项目是数据预处理,包括构建数据模型、去除固定词语表情、分词、去停用词、选择语言、生成用户词典、计算tf-idf、Lucene索引部分
使用Lucene检索和使用java.lang.String内置方法进行检索的效率比较 安装:直接在Eclipse中选取“import->Existing Project” Eclipse工程/ch7:原书第七章和第九章的Eclipse工程文件 使用PDFBox解析PDF文件 使用...
使用排名算法进行搜索,以根据文档的相似性对文档集合进行排序,以根据用户的查询检索最佳结果。 使用的库: Apache Lucene lucene-core-8.2.0-用于索引和搜索文本文档 jsoup-1.12.1-用于解析HTML文档 输出
Web信息检索与处理课程实验1——一个简易的搜索引擎 实验内容 利用Lucene等工具建立简单的搜索引擎: 1.网页预处理 2.创建索引(使用中科院中文分词工具ICTCLAS) 3.查询(实现简单的查询界面) 实验环境 编译...
搜索引擎功能设计主要包括,信息资源的集成,查询扩展模块,Lucene检索模块,结果可视化。信息资源的集成主要使用网络爬虫技术,利用java语言的regex包和selenium插件实现模拟登录以获取新浪微博,豆瓣电影,百度...
将已经下载的Web资源按学科分类存储在Web主题资源库中,通过全局信息库建立索引,接入通用接口进行依主题检索。依赖数字图书馆各方面特点,提出支持多线程主题爬行器的设计,并提出一种新颖的URL主题相关性剪切算法...
中文参数预处理 索引重建 Reindex API 索引别名实现零停机 检索关键字包含特殊字符 保留字消义 检索关键字个数太多报错 权限控制&监控 中文姓名检索不准确 参考(Copy)内容 简介 ElasticSearch是一个基于Lucene(路...
主要内容: 1、一个中文的slide,首先介绍了搜索引擎体系解构,然后,完整的介绍了从网页采集,预处理,索引,检索实现,到最终用户接口的实现采用的工具和方法。 2、一些基本的库和代码。