【发布时间】:2015-12-04 16:16:13
【问题描述】:
我试图在文本(文本文件)上应用字典(单词文件):
我们测试该单词是否存在于文本的一行中,如果是,我们将打印它(该行)。我们为每一行文本测试字典中的所有单词。
我使用了 EXPREG 模式+匹配器,但问题是时间。手术耗时5H。
2 档有 3330ko 和 55ko . 我的问题是是否有另一种方法可以像 UNITEX 但在 java 中执行此操作
public class Tratemant_Dic extends Thread {
Tratemant_Dic() {
}
public void run() {
try {
BufferedReader file_corpus = new BufferedReader(
new InputStreamReader(new FileInputStream(
"corpus-medical.TXT"), "UTF-16LE"));
PrintWriter ecrire = new PrintWriter("sort.html");
String line;
String nom = null;
ecrire.write("<mot><span style=\"color:red\">startsss</span></mot></br><ligne>start\n");
while ((line = file_corpus.readLine()) != null) {
BufferedReader file_nom = new BufferedReader(
new InputStreamReader(new FileInputStream(
"Fichie_sorte.DIC"), "UTF-16LE"));
while ((nom = file_nom.readLine()) != null) {
nom = nom.substring(0, nom.length() - 3);
Pattern p = Pattern.compile("(.*)\\W+" + nom + "\\b.*",
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(line);
if (m.find()) {
System.out.println(nom + "==>" + line);
ecrire.write("<mot><span style=\"color:red\">" + nom
+ "</span></mot></br><ligne>" + line + "\n");
}
}
file_nom.close();
}
ecrire.close();
System.out.println("FIN");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【问题讨论】:
-
输入和字典的大小是多少?
-
只看代码,对于您从
corpus-medical.TXT读取的每一行 1. 为什么要为每一行读取Fichie_sorte.DIC?只需阅读一次,这应该已经节省了您的时间。 2. 由于您的Fichie_sorte.DIC没有改变,这意味着您正在编译的所有正则表达式不需要为corpus-medical.TXT的每一行编译。这也应该减少时间和内存。 -
检查 apache commons IO baeldung.com/java-read-lines-large-file 并优化您的正则表达式策略
-
查看此 SO 帖子 stackoverflow.com/questions/33645806/…
标签: java