`

lucene入门系列(一、文档预处理)

阅读更多
package com.heming.lucene.process;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;

/**
 * 文档预处理类
 * 
 * @author 何明
 * 
 */
public class FilePreprocess {

	/**
	 * 文件处理类
	 * 
	 * @param file
	 *            被处理的源文件
	 * @param outputDir
	 *            处理后的文件输出路径
	 */
	public static void preprocess(File file, String outputDir) {

		try {

			splitToSmallFiles(charactorProcess(file, outputDir + "output.all"),
					outputDir);

			File fileDelete = new File(outputDir + "output.all");

			if (fileDelete.exists())

				fileDelete.delete();

		} catch (Exception e) {

			e.printStackTrace();

		}

	}

	/**
	 * 拆分成小文件
	 * 
	 * @param file
	 *            需要拆分的文件
	 * @param outputpath
	 *            小文件路径
	 * @throws IOException
	 *             IO异常
	 */
	public static void splitToSmallFiles(File file, String outputpath)
			throws IOException {

		//文件计数器,用于产生文件名
		int filePointer = 0;

		//定义单个文件的最大长度
		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) {			//如果文本里只有一行那么这里应该这样写了String line = null; while ((line = reader.readerLine()) != 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++;

				//清空缓冲区数据
				buffer = new StringBuffer();
			}

			//如果没有达到文件最大长度,则继续读取下一行
			line = reader.readLine();

		}

		//如果大文件已经读取完毕,直接将缓冲区数据写入文件
		writer = new BufferedWriter(new FileWriter(outputpath + "output"
				+ filePointer + ".txt"));

		writer.write(buffer.toString());

		writer.close();

	}

	/**
	 * 对文件进行字符串进行全角/半角处理
	 * 
	 * @param file
	 *            文件名
	 * @param destFile
	 *            目标文件
	 * @return
	 */
	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) {
			
			//调用replace方法替换所有的全角字符
			String newline = replace(line);
			
			//将替换后的String写入新文件
			writer.write(newline);
			
			//写入行分隔符
			writer.newLine();
			
			line = reader.readLine();
			
		}

		//关闭输入、输出流,将缓冲区数据写入文件
		reader.close();
		
		writer.close();

		//将替换后的文件返回
		return new File(destFile);

	}

	private static String replace(String line) {

		//创建一个HashMap存储全角字符和半角字符之间的对应关系
		//每个entry里的key为全角字符、value为半角字符
		HashMap map = new HashMap();
		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("!", "!");
		map.put("‵", "'");
		map.put("①", "1");
		map.put("②", "2");
		map.put("③", "3");
		map.put("④", "4");
		map.put("⑤", "5");
		map.put("⑥", "6");
		map.put("⑦", "7");
		map.put("⑧", "8");
		map.put("⑨", "9");

		int length = line.length();
		
		for (int i = 0; i < length; i++) {
			
			//逐个取得 长度为1的String作为查询条件
			String charat = line.substring(i, i + 1);
			
			//判断Hashmap的key里面是否出现该String
			if (map.get(charat) != null) {
				
				//如果存在,说明是全角字符,需替换成半角字符
				line = line.replace(charat, (String) map.get(charat));
				
			}
		}

		//将处理后的字符返回
		return line;
	}

	public static void main(String[] args) {

		// 设置需要被预处理的源文件位置
		String inputFile = "d:\\test.txt"; // 此文件25.1k,用记事本打开都比较慢

		// 设置处理后的文件存放位置
		String outputDir = "d:\\test\\";

		// 判断处理后文件存放的文件夹是否存在,如果不存在,则创建文件夹
		if (!new File(outputDir).exists())

			new File(outputDir).mkdirs();
		// 调用preprocess方法进行预处理
		preprocess(new File(inputFile), outputDir);

	}
}

1
0
分享到:
评论

相关推荐

    lucene 入门

    `lucene入门小实例.txt` 文件中可能包含了一个简单的Lucene使用示例,例如: 1. 创建 `Directory` 对象,比如使用 `FSDirectory.open()` 打开一个文件系统的目录来存储索引。 2. 实例化 `Analyzer`,如使用 `...

    lucene 入门资料包

    以上是Lucene入门的基本知识和关键概念,通过深入学习和实践,你可以掌握如何利用Lucene构建强大的全文搜索引擎。记住,实践中遇到的问题往往是最好的学习资源,不断尝试和解决,你将逐渐成为Lucene的专家。

    Lucene 4.8全文检索引擎入门示例文档

    Lucene 的核心功能是创建倒排索引,这是一种数据结构,允许快速查找包含特定词的文档。它通过分析输入文本,将文本拆分成词元(tokens),并为每个词元建立索引。索引包含每个词元的文档频率信息,使得搜索操作能够...

    Lucene入门demo

    4. **分词器(Analyzer)**: 分词器负责将输入文本分解成一系列的关键词(Token)。这一步骤对语言敏感,不同语言可能需要不同的分词策略。 5. **倒排索引(Inverted Index)**: 倒排索引是 Lucene 的核心数据结构...

    lucene入门指南

    4. **搜索(Searching)**: 用户输入查询后,Lucene 使用查询解析器将其转化为一系列的术语和操作符,然后在索引中执行搜索。 5. **评分(Scoring)**: Lucene 根据文档的相关性对搜索结果进行评分,高分表示更相关...

    lucene入门到项目开发.docx

    《Lucene入门到项目开发》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单但功能强大的API,可以帮助开发者快速实现对文本数据的检索和分析。 一...

    Lucene-入门

    **标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...

    Lucene.Net 2.0 源码+文档

    2. **分词器(Tokenizer)**:在Lucene.Net中,分词是预处理的关键步骤,它将输入的文本分割成一个个可搜索的词元。不同的语言和领域可能需要定制化的分词规则,Lucene.Net提供了灵活的分词器接口供开发者自定义。 ...

    lucene3.0.0 入门DEMO

    2. **Analyzer**:Analyzer是Lucene中处理文本的关键组件,它负责将输入的字符串分解成一系列的词元(tokens),并进行标准化,如去除停用词、词形还原等。 3. **Document**:在Lucene中,每个文档都是一个包含多个...

    lucene入门知识

    【Lucene入门知识详解】 Lucene是一个基于Java的全文索引引擎工具包,它并不是一个完整的全文搜索引擎,而是提供了一套构建搜索引擎的基础组件。Lucene的主要目标是方便开发者将其集成到各类应用程序中,以实现高效...

    Lucene 3.0完成入门

    - **索引**:Lucene 的核心是索引,它是一种预处理步骤,将文档内容转换为便于快速搜索的数据结构。 - **分词**:Lucene 使用分词器(Tokenizer)将文档拆分为单独的词汇项(Tokens),这是建立索引的基础。 - **...

    Lucene2.4入门总结

    索引是预处理后的数据结构,用于快速查找文档;文档是信息的最小单位,包含多个字段;字段是文档中的具体信息,如标题、内容等;查询则用于指定我们要在索引中寻找的信息。 2. **工作流程**:使用 Lucene 首先需要...

    lucene 入门整理

    ### Lucene入门精要 #### 一、Lucene概览 Lucene,作为一款高性能的全文检索引擎架构,自诞生以来便因其卓越的性能、易用性和灵活性而在业界获得了广泛的应用与好评。它不仅能够独立运行,更可以无缝集成至各类...

    Lucene入门示例

    **Lucene入门示例** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它是Java语言实现的,但提供了多种语言的接口,包括Python、C#等。本示例将帮助初学者理解Lucene的基本用法,以及如何在实际...

    Lucene 2.4 入门例子

    在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和如何构建一个基本的搜索系统。 ### 一、Lucene 2.4 的改进与性能提升 在Lucene 2.4版本中,主要的改动和性能提升包括: 1. **优化索引构建速度**:...

    Lucene入门源码

    **Lucene入门源码解析** Lucene是一款高性能、全文检索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。它提供了丰富的API,使得开发者可以方便地在应用程序中实现全文检索功能。本篇文章将...

    lucene.net+完全入门教程

    1. **索引(Indexing)**: 在Lucene.Net中,索引是文档的预处理形式,用于加速搜索。它通过分词(Tokenization)和建立倒排索引(Inverted Index)来实现。分词将文本拆分成关键词,倒排索引则将关键词映射到包含...

Global site tag (gtag.js) - Google Analytics