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

时间:2012-12-12 16:52:02

标签: java algorithm file-io

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

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

exclusions = new ArrayList<String>();
exclusions.add("a","and","the","or");

现在我想进行真实的测试,我的排除列表接近200字,我很乐意做这样的事情:

exclusions = new ArrayList<String>();
exclusions.add(each word in foo.txt);

长期来看,出于显而易见的原因,维护外部列表(而不是嵌入在我的代码中的列表)是可取的。使用Java中的所有文件读/写方法,我相当确定这可以完成,但我的搜索结果已经空了......我知道我必须搜索错误的关键字。任何人都知道在处理过程中包含外部列表的优雅方式吗?

6 个答案:

答案 0 :(得分:1)

您可以使用FileReader从文件中读取String并将其添加到ArrayList

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;
}

然后您可以使用List<String> exclusions = createExclusions("exclusions.txt");创建列表。

答案 1 :(得分:1)

这不会立即解决您所规定的解决方案,但可能会为您提供另一种可能更好的途径。

不是事先决定什么是无用的,你可以计算一切,然后过滤掉你认为无关紧要的东西(从信息携带的角度来看),因为它的压倒性存在。它类似于信号处理中的low-pass filter来消除噪声。

简而言之,算上一切。然后决定如果出现的频率高于您设置的阈值(您必须确定该阈值来自实验,例如,所有单词的5%是'the',这意味着它不携带信息)。< / p>

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

这就是我的两分钱。

答案 2 :(得分:0)

Google Guava库包含许多简化日常任务的有用方法。您可以使用其中一个将文件内容读取为字符串,并按空格字符分割:

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

Apache Commons IO提供类似的快捷方式:

String contents = FileUtils.readFileToString(new File("foo.txt"));
...

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Commons-io有支持此功能的实用工具。将commons-io包含为依赖项,然后发出

File myFile = ...;
List<String> exclusions = FileUtils.readLines( myFile );

如下所述: http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html

这假设每个排除词都在新行上。

答案 5 :(得分:0)

从文件中读取非常简单。

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"));
    }
}

foo.txt的

the
a
and
or

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