私は問題を解決しました。訂正やコメントを得るために私に答えを共有したいと思います。
問題は、avgLengthPath引数を計算する方法でした。この引数を取るメソッドをload()
見ると、平均の長さを含むファイルへのパスである文字列が必要であることがわかります。したがって、avgLengthPathは次のようになります。
/Users/admib/Study/avgLength
load()
方法は次のとおりです。
public static void load(String path) throws NumberFormatException,
IOException {
BufferedReader in = new BufferedReader(new FileReader(path));
String line;
while (null != (line = in.readLine())) {
String field = line;
Float avg = new Float(in.readLine());
BM25Parameters.setAverageLength(field, avg);
}
in.close();
}
ここで、そのようなファイルを作成する方法を確認しないでください。上記のメソッドがファイルを1行ずつ読み取り、各2行を。という別のメソッドに送信していることがわかりますBM25Parameters.setAverageLength()
。avgLengthPathファイルの形式は次のようになります。
CONTENT
459.2903f
ANCHOR
84.55523f
ここで、最初の行はファイル名で、2番目の行はこのフィールドの平均の長さです。また、3行目は別のファイルで、4行目はそのファイルの平均の長さです。
このようなファイルの問題は、デフォルトの状態でLuceneからドキュメントの長さを取得できないことです。これを克服するために、コレクションのインデックスを再作成し、Luceneによってインデックスが作成されるフィールドの1つとしてドキュメントの長さを追加しました。
最初に、ファイルを受け取り、ドキュメントの長さを文字列として返すメソッドを作成しました。私はそれを呼びますgetDocLength(File f)
:
public static String getDocLength(File f) throws IOException {
FileInputStream stream = new FileInputStream(f);
try {
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
String doc = Charset.defaultCharset().decode(bb).toString();
int length = doc.length();
return Integer.toString(length);
} finally {
stream.close();
}
}
このメソッドは、インデックス作成プロセス中に呼び出され、次のようにドキュメントの長さフィールドを追加します。
protected Document getDocument(File f) throws Exception {
Document doc = new Document();
String docLength = Integer.toString(io.getDocLength(f));
doc.add(new Field("contents", new FileReader(f), Field.TermVector.YES));
doc.add(new Field("docLength", i, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("filename", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("fullpath", f.getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
return doc;
}
最後に、インデックス内のすべてのドキュメントをループして平均ドキュメント長を計算し、最後に結果を正しい形式でavgLengthPathファイルに保存するメソッドを作成しました。私はこのメソッドを呼び出しましたgenerateAvgLengthPathFile()
:
public static void generateAvgLengthPathFile(String luceneIndexPath, String outputFilePath) {
try {
Directory dir = FSDirectory.open(new File(luceneIndexPath));
IndexReader reader = IndexReader.open(dir);
int totalLength = 0;
//here we loop through all the docs in the index
for (int i = 0; i < reader.maxDoc(); i++) {
if (reader.isDeleted(i)) {
continue;
}
Document doc = reader.document(i);
totalLength += Integer.parseInt(doc.get("docLength"));
}
//calculate the avarage length
float avarageLength = totalLength * 1.0f / reader.maxDoc() * 1.0f;
//create the a String varibale with the correct formate
String avgLengthPathFile = "contents" + "\n" + avarageLength;
//finally, save the file
Writer output = null;
String text = "contents" + "\n" + avarageLength;
File file = new File(outputFilePath);
output = new BufferedWriter(new FileWriter(file));
output.write(text);
output.close();
} catch (Exception e) {
System.err.println(e);
}
}