Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我需要一种优雅的方法来排除处理中的特定单词_Java_Algorithm_File Io - Fatal编程技术网

Java 我需要一种优雅的方法来排除处理中的特定单词

Java 我需要一种优雅的方法来排除处理中的特定单词,java,algorithm,file-io,Java,Algorithm,File Io,我正在编写一个算法,从文档文本中提取可能的关键字。我想计算单词的实例,并将前5个作为关键字。显然,我想排除“无关紧要”的词,以免每个文档都以“the”和“and”作为主要关键字出现 以下是我成功用于测试的策略: exclusions = new ArrayList<String>(); exclusions.add("a","and","the","or"); excludes=newarraylist(); 除外条款。添加(“a”、“和”、“或”); 现在我想做一个现实生活中的

我正在编写一个算法,从文档文本中提取可能的关键字。我想计算单词的实例,并将前5个作为关键字。显然,我想排除“无关紧要”的词,以免每个文档都以“the”和“and”作为主要关键字出现

以下是我成功用于测试的策略:

exclusions = new ArrayList<String>();
exclusions.add("a","and","the","or");
excludes=newarraylist();
除外条款。添加(“a”、“和”、“或”);
现在我想做一个现实生活中的测试,我的排除列表将近200个单词,我希望能够做到这样:

exclusions = new ArrayList<String>();
exclusions.add(each word in foo.txt);
excludes=newarraylist();
添加(foo.txt中的每个单词);

从长远来看,出于显而易见的原因,维护一个外部列表(而不是嵌入代码中的列表)是可取的。有了Java中所有的文件读/写方法,我很确定这是可以做到的,但我的搜索结果是空的……我知道我必须搜索错误的关键字。有人知道在处理过程中包含外部列表的优雅方法吗?

您可以使用
文件读取器
从文件中读取
字符串
并将其添加到
数组列表

private List<String> createExculsions(String file) throws IOException {
   BufferedReader reader = new BufferedReader(new FileReader(file));
   String word = null;
   List<String> exclusions = new ArrayList<String>();

   while((word = reader.readLine()) != null) {
      exclusions.add(word);
   }

   return exclusions;
}
private List createExcutions(字符串文件)引发IOException{
BufferedReader reader=新的BufferedReader(新文件读取器(文件));
字符串字=null;
列表排除项=新的ArrayList();
while((word=reader.readLine())!=null){
除外条款。添加(文字);
}
退货除外责任;
}

然后您可以使用
List excludes=createexcludes(“excludes.txt”)
创建列表。

这不会立即解决您正在处方的解决方案,但可能会为您提供另一种更好的方法

你不必事先决定什么是无用的,你可以数一数所有的东西,然后过滤掉你认为不重要的东西(从信息承载的角度来看),因为它无处不在。它类似于信号处理中的噪声消除

简言之,数一数。然后确定如果某个词出现的频率高于您设置的阈值(您必须通过实验确定阈值,比如说5%的词是“the”,这意味着它不携带信息)

如果你这样做,它甚至可以用于外语


谷歌番石榴库包含了许多有用的方法,可以简化日常任务。您可以使用其中之一将文件内容读取为字符串,并按空格字符将其拆分:

String contents = Files.toString(new File("foo.txt"), Charset.defaultCharset());
List<String> exclusions = Lists.newArrayList(contents.split("\\s"));

不确定它是否优雅,但几年前,我在这里创建了一个简单的解决方案,用于检测tweet中的语言或删除干扰词:

  • 它使用的数据类似于

Commons io具有支持此功能的实用程序。将commons io作为依赖项包含,然后发布

File myFile = ...;
List<String> exclusions = FileUtils.readLines( myFile );
文件myFile=。。。;
列表排除=FileUtils.readLines(myFile);
如中所述:


这假设每个排除字都位于新行。

从文件中读取非常简单

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;

public class ExcludeExample {
    public static HashSet<String> readExclusions(File file) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = "";
        HashSet<String> exclusions = new HashSet<String>();
        while ((line = br.readLine()) != null) {
            exclusions.add(line);
        }
        br.close();
        return exclusions;
    }

    public static void main(String[] args) throws IOException{
        File foo = new File("foo.txt");
        HashSet<String> exclusions = readExclusions(foo);
        System.out.println(exclusions.contains("the"));
        System.out.println(exclusions.contains("Java"));
    }
}

我使用HashSet而不是ArrayList,因为它具有更快的查找速度。

我会在前面说,对我来说,文件操作是Java最粗糙的部分。在HashSet中,filename是否引用我的排除列表的文本值?或者这是一个我没有看到的变量集还是从某个地方传递的?而且,File foo=new File(“foo.txt”)不会为我创建一个新的空白foo.txt吗?新文件(“foo.txt”)创建一个引用文件“foo.txt”的文件对象。它不会打开文件,该文件由传递给BufferedReader的FileReader打开。最好的方法是复制代码并试用,代码应该完全正常工作。我将变量名filename改为file,因为它更准确。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;

public class ExcludeExample {
    public static HashSet<String> readExclusions(File file) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = "";
        HashSet<String> exclusions = new HashSet<String>();
        while ((line = br.readLine()) != null) {
            exclusions.add(line);
        }
        br.close();
        return exclusions;
    }

    public static void main(String[] args) throws IOException{
        File foo = new File("foo.txt");
        HashSet<String> exclusions = readExclusions(foo);
        System.out.println(exclusions.contains("the"));
        System.out.println(exclusions.contains("Java"));
    }
}
the
a
and
or