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);
}
}
分享到:
相关推荐
`lucene入门小实例.txt` 文件中可能包含了一个简单的Lucene使用示例,例如: 1. 创建 `Directory` 对象,比如使用 `FSDirectory.open()` 打开一个文件系统的目录来存储索引。 2. 实例化 `Analyzer`,如使用 `...
以上是Lucene入门的基本知识和关键概念,通过深入学习和实践,你可以掌握如何利用Lucene构建强大的全文搜索引擎。记住,实践中遇到的问题往往是最好的学习资源,不断尝试和解决,你将逐渐成为Lucene的专家。
Lucene 的核心功能是创建倒排索引,这是一种数据结构,允许快速查找包含特定词的文档。它通过分析输入文本,将文本拆分成词元(tokens),并为每个词元建立索引。索引包含每个词元的文档频率信息,使得搜索操作能够...
4. **分词器(Analyzer)**: 分词器负责将输入文本分解成一系列的关键词(Token)。这一步骤对语言敏感,不同语言可能需要不同的分词策略。 5. **倒排索引(Inverted Index)**: 倒排索引是 Lucene 的核心数据结构...
4. **搜索(Searching)**: 用户输入查询后,Lucene 使用查询解析器将其转化为一系列的术语和操作符,然后在索引中执行搜索。 5. **评分(Scoring)**: Lucene 根据文档的相关性对搜索结果进行评分,高分表示更相关...
《Lucene入门到项目开发》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单但功能强大的API,可以帮助开发者快速实现对文本数据的检索和分析。 一...
**标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...
2. **分词器(Tokenizer)**:在Lucene.Net中,分词是预处理的关键步骤,它将输入的文本分割成一个个可搜索的词元。不同的语言和领域可能需要定制化的分词规则,Lucene.Net提供了灵活的分词器接口供开发者自定义。 ...
2. **Analyzer**:Analyzer是Lucene中处理文本的关键组件,它负责将输入的字符串分解成一系列的词元(tokens),并进行标准化,如去除停用词、词形还原等。 3. **Document**:在Lucene中,每个文档都是一个包含多个...
【Lucene入门知识详解】 Lucene是一个基于Java的全文索引引擎工具包,它并不是一个完整的全文搜索引擎,而是提供了一套构建搜索引擎的基础组件。Lucene的主要目标是方便开发者将其集成到各类应用程序中,以实现高效...
- **索引**:Lucene 的核心是索引,它是一种预处理步骤,将文档内容转换为便于快速搜索的数据结构。 - **分词**:Lucene 使用分词器(Tokenizer)将文档拆分为单独的词汇项(Tokens),这是建立索引的基础。 - **...
索引是预处理后的数据结构,用于快速查找文档;文档是信息的最小单位,包含多个字段;字段是文档中的具体信息,如标题、内容等;查询则用于指定我们要在索引中寻找的信息。 2. **工作流程**:使用 Lucene 首先需要...
### Lucene入门精要 #### 一、Lucene概览 Lucene,作为一款高性能的全文检索引擎架构,自诞生以来便因其卓越的性能、易用性和灵活性而在业界获得了广泛的应用与好评。它不仅能够独立运行,更可以无缝集成至各类...
**Lucene入门示例** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它是Java语言实现的,但提供了多种语言的接口,包括Python、C#等。本示例将帮助初学者理解Lucene的基本用法,以及如何在实际...
在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和如何构建一个基本的搜索系统。 ### 一、Lucene 2.4 的改进与性能提升 在Lucene 2.4版本中,主要的改动和性能提升包括: 1. **优化索引构建速度**:...
**Lucene入门源码解析** Lucene是一款高性能、全文检索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。它提供了丰富的API,使得开发者可以方便地在应用程序中实现全文检索功能。本篇文章将...
1. **索引(Indexing)**: 在Lucene.Net中,索引是文档的预处理形式,用于加速搜索。它通过分词(Tokenization)和建立倒排索引(Inverted Index)来实现。分词将文本拆分成关键词,倒排索引则将关键词映射到包含...