1

ドキュメントのテキストから可能性の高いキーワードを抽出するアルゴリズムを作成しています。単語のインスタンスをカウントし、上位 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 にはすべてのファイルの読み取り/書き込みメソッドがあり、これが実行できることはかなり確信していますが、検索結果が空になりました...間違ったキーワードで検索しなければならないことはわかっています。外部リストを処理に含めるエレガントな方法を知っている人はいますか?

4

6 に答える 6

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");、リストを作成するために使用できます。

于 2012-12-12T16:55:39.843 に答える
1

これはあなたが処方している解決策にすぐに対処するものではありませんが、より良いかもしれない別の手段を提供するかもしれません.

事前に何が役に立たないかを判断する代わりに、すべてを数えてから、圧倒的な存在感のために(情報伝達の観点から)重要でないと判断したものを除外することができます. ノイズを除去するための信号処理におけるローパス フィルターに似ています。

要するに、すべてを数えます。次に、設定したしきい値よりも高い頻度で何かが表示されるかどうかを決定します (実験からそのしきい値を決定する必要があります。すべての単語の 5% が「the」であるとします。つまり、情報が含まれていないことを意味します)。

このようにすれば、外国語でもうまくいきます。

これでちょうど私の2セント。

于 2012-12-12T16:57:07.833 に答える
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

検索が高速なため、ArrayList の代わりに HashSet を使用しました。

于 2012-12-12T17:07:23.467 に答える
0

Google Guava ライブラリには、ルーチン タスクを簡素化する便利なメソッドが多数含まれています。それらの1つを使用して、ファイルの内容を文字列に読み取り、スペース文字で分割できます。

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"));
...
于 2012-12-12T16:59:17.550 に答える
0

エレガントかどうかはわかりませんが、数年前に、言語を検出したり、ツイートからノイズ ワードを削除したりするための簡単なソリューションを作成しました。

于 2012-12-12T17:00:17.757 に答える
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で説明されているように

これは、すべての除外ワードが新しい行にあることを前提としています。

于 2012-12-12T17:04:57.113 に答える