Note that the first version of LongSentenceFilter is not complete, because even after filtering there still may be French sentences of more than 100 words. Now this version tackles this problem. Note also that this version is not optimal from implementational view and a better version will be in next post.
package util;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
public class LongSentenceFilter {
public void filter(File enFile, File frFile, File oenFile, File ofrFile) {
/*go through both English and French files,
* remove sentences of more than 100 words in one file
* and remove corresponding sentences (with same sentence number)
* in the other file
* */
BufferedReader enBufferedReader;
BufferedReader frBufferedReader;
String line = null;
int lineCount = 0;
// record line numbers of those sentences that consist more than 100
// words either in English file or in French file
ArrayList<Integer> longSentenceIndices = new ArrayList<Integer>();
// output stringbuffer
StringBuffer enContent = new StringBuffer();
StringBuffer frContent = new StringBuffer();
try {
// go through English file, find those sentences of more than
// 100 words and keep record of those line numbers in
// _longSentenceIndices
enBufferedReader = new BufferedReader(new FileReader(enFile));
while ((line = enBufferedReader.readLine()) != null) {
String[] words = line.split(" ");
lineCount++;
if (words.length > 100)
longSentenceIndices.add(lineCount);
}
System.out.println("Number of sentences in original document: "
+ lineCount);
// go through French file, keep those sentences, of words less
// or equal to 100 and whose line numbers are not in
// _longSentenceIndices
// at the same time, keep line numbers of sentences of more than
// 100 words in _longSentenceIndices
lineCount = 0;
frBufferedReader = new BufferedReader(new FileReader(frFile));
while ((line = frBufferedReader.readLine()) != null) {
String[] words = line.split(" ");
lineCount++;
if (words.length <= 100
&& !longSentenceIndices.contains(lineCount)) {
frContent.append(line);
frContent.append('\n');
} else {
if (!longSentenceIndices.contains(lineCount))
longSentenceIndices.add(lineCount);
}
}
// go again through English file, keep those sentences, whose line
// number are not in _longSentenceIndices
lineCount = 0;
int newLineCount = 0;
enBufferedReader = new BufferedReader(new FileReader(enFile));
while ((line = enBufferedReader.readLine()) != null) {
lineCount++;
if (!longSentenceIndices.contains(lineCount)) {
newLineCount++;
enContent.append(line);
enContent.append('\n');
}
}
System.out.println("Number of sentences after filteration: "
+ newLineCount);
} catch (FileNotFoundException e2) {
e2.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// write stringbuffer to output files
Writer output;
try {
output = new BufferedWriter(new FileWriter(oenFile));
output.write(enContent.toString());
output.close();
output = new BufferedWriter(new FileWriter(ofrFile));
output.write(frContent.toString());
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
LongSentenceFilter filter = new LongSentenceFilter();
// English input, output
File enFile = new File("test/input/hansard.5.en.tok.lc");
File oenFile = new File("test/output/hansard.5.en.tok.lc.filtered");
// French input, output
File frFile = new File("test/input/hansard.5.fr.tok.lc");
File ofrFile = new File("test/output/hansard.5.fr.tok.lc.filtered");
// Note that _enFile and _frFile should be translation of each other!
filter.filter(enFile, frFile, oenFile, ofrFile);
}
}
分享到:
相关推荐
Joshua Kerievsky写的一本和GOF的设计模式、Martin Fowler重构-改善即有代码的设计齐名的著作! 因上传权限问题,本书压成了二部分,此为第2部分
2. **简洁性**:API应尽可能简洁,避免过多的复杂性。每个方法和类都应有明确的责任,遵循“单一职责原则”。同时,尽量减少API的公开表面,以减少潜在的错误使用和维护负担。 3. **一致性**:API的设计应当保持...
本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新方法,而且有助于读者结合...
标题“SPncfpdf_鞍点近似_Joshua_”和描述中的“鞍点近似From:Joshua Carmichael”暗示了这个压缩包文件内容与一个名为“SPncfpdf”的工具或算法有关,该工具或算法可能用于求解鞍点问题。鞍点在数学和计算机科学中...
重構技術的書,雖然是04年的書,值得大家一看
读书笔记:Effective Java 中文版(第2版)总结 (美)Joshua Bloch 著
[重构与模式].(美国)Joshua.Kerievsky.清晰版.part2 完整的pdf,总共 2 部
Joshua Bloch 所著《Effective Java 第二版》一书摘要这是我对 Joshua Bloch 所著《Effective Java 第 2 版》的总结。我在学习时会用到它,也可以作为快速参考。它并不是这本书的独立替代品,所以如果你真的想学习...
《Refactoring to Patterns》是Joshua Kerievsky所著的一本专业书籍,主要内容涉及软件设计中的重构和模式应用。本书详细介绍了通过一系列低级重构来安全地将设计向特定模式实现移动、靠近或远离的方法。Kerievsky以...
这个名为"joshua-springboot.zip"的压缩包包含了一个基于SpringBoot的入门示例项目,该项目可能包含了处理基本HTTP请求、与MySQL数据库交互以及集成Redis缓存等功能。 首先,让我们深入理解SpringBoot的核心特性。...
LIMIT是每次通过Joshua Project API时要获取的行数,1-1000,默认值: 1000 INDIVIDUAL如果已定义),则为返回的每个人员组行输出单独的JSON文件,默认值: false MINIMIZED如果定义,输出.min.json文件,否则...
《Effective Java》是Java编程领域的一本经典著作,由知名程序员和计算机科学家Joshua Bloch撰写。这本书的第二版深入探讨了如何编写高效、可维护的Java代码,并提供了许多实用的编程指南和最佳实践。以下是根据标题...
2. **无线技术**:无线智能开关使用无线通信技术,如蓝牙、Wi-Fi或Zigbee,使得用户可以远程控制开关,不受物理距离限制。这增加了便利性,尤其适用于智能家居系统,用户可以通过智能手机或其他设备轻松控制家中的...
标题“Joshua~Designs-开源”表明这是一个与开源软件项目相关的集合,由一个名为“Joshua”的开发者或团队创建。这个项目包含了多种不同的应用程序,包括访客留言簿、内容管理系统(CMS)、论坛、FTP客户端、SSH...
标题 "Joshua-Chang.github.io" 暗示这是一个个人网页项目,可能托管在GitHub上。GitHub Pages允许用户免费托管静态网站,而".github.io"是GitHub为用户提供个人域名的一种方式。这个项目的仓库名与标题相同,这通常...
Joshua Bloch和Neal Gafter在加入Google之前,都在Sun Microsystems担任资深工程师,对Java核心和类库开发有着显著贡献。他们共同撰写了《Java Puzzlers》一书,而Bloch还著有广受欢迎的《Effective Java》。他们的...
Joshua Bloch 所著《Effective Java 第二版》一书的源代码有效的 Java 示例这是 Joshua Bloch 编写的《Effective Java 第二版》一书的来源。除包名称外,其他均未修改。原始源代码可从...
《Java Puzzlers Sampler》是由Java领域的权威专家Joshua Bloch和Neal Gafter共同编著的一本书,书中收录了一系列令人困惑、出乎意料的Java编程问题,旨在帮助开发者更好地理解和避免这些潜在的陷阱。书中的...
盖茨比极简启动器 :rocket:快速开始 创建一个Gatsby网站。 使用Gatsby CLI创建一个新站点,并指定最小的启动器。 # create a new Gatsby site using the minimal starter npm init gatsby 开始开发。...
[重构与模式].(美国)Joshua.Kerievsky.清晰版 pdf (1) 全部pdf,共 2 卷