2つの単語を含む行の数が必要です。この目的のために、私は次のコードを書いています: 入力ファイルは1000 lines
と約4,000 words
を含み、約4時間かかります。 Java
にライブラリがありますが、それはより速く行うことができますか? 実行時間を短縮するために、Appache Lucene
またはStanford Core NLP
を使用してこのコードを実装できますか?明確な言葉を取得Java 8を使用するファイル内の2つの単語の確率分布
ArrayList<String> reviews = new ArrayList<String>();
ArrayList<String> terms = new ArrayList<String>();
Map<String,Double> pij = new HashMap<String,Double>();
BufferedReader br = null;
FileReader fr = null;
try
{
fr = new FileReader("src/reviews-preprocessing.txt");
br = new BufferedReader(fr);
String line;
while ((line= br.readLine()) != null)
{
for(String term : line.split(" "))
{
if(!terms.contains(term))
terms.add(term);
}
reviews.add(line);
}
}
catch (IOException e) { e.printStackTrace();}
finally
{
try
{
if (br != null)
br.close();
if (fr != null)
fr.close();
}
catch (IOException ex) { ex.printStackTrace();}
}
long Count = reviews.size();
for(String term_i : terms)
{
for(String term_j : terms)
{
if(!term_i.equals(term_j))
{
double p = (double) reviews.parallelStream().filter(s -> s.contains(term_i) && s.contains(term_j)).count();
String key = String.format("%s_%s", term_i,term_j);
pij.put(key, p/Count);
}
}
}
ライブラリは魔法ではありません。ライブラリを使用していないためにコードが遅くなることはありません。別のストリーム操作を含む2つのネストされたループを使用しているため、速度が遅いです。つまり、 'term.size()'× 'term.size()'× 'reviews.size()'の操作です。 – Holger
そうですが、これは避けられません。だから私は、ParllelStreamを使うのではなく、より高速なメソッドを使うことができると考えました。 @Holger –
それは避けられないことです。それはアルゴリズムを開発する技術です。それは私たちが非常に多くの異なるソートアルゴリズムを知っている理由です。同じタスクを解決するにはさまざまな方法がありますが、より良い方法がないとは決して想像できません。 – Holger