2

インデクサー ファイルからインデックスを読み取りたい。

したがって、私が望む結果は、各ドキュメントのすべての用語と TF-IDF の数です。

私のためにいくつかのサンプルコードを提案してください。どうも :)

4

1 に答える 1

-1

まず、ドキュメントのリストを取得します。別の方法として、索引付けされた用語を繰り返し処理することも考えられますが、このメソッドIndexReader.terms()は 4.0 から削除されたようです (ただし、 には存在しますがAtomicReader、一見の価値があります)。すべてのドキュメントを取得するために私が知っている最善の方法は、ドキュメント ID でドキュメントを単純にループすることです。

//where reader is your IndexReader, however you go about opening/managing it
for (int i=0; i<reader.maxDoc(); i++) {
    if (reader.isDeleted(i))
        continue;
    //operate on the document with id = i ...
}

次に、索引付けされたすべての用語のリストが必要です。必要なデータが意味をなさないため、保存されたフィールドには関心がないと思います。あなたが使用できる用語を取得するためにIndexReader.getTermVectors(int)。直接アクセスする必要がないため、実際にはドキュメントを取得していないことに注意してください。中断したところから続けます。

String field;
FieldsEnum fieldsiterator;
TermsEnum termsiterator;
//To Simplify, you can rely on DefaultSimilarity to calculate tf and idf for you.
DefaultSimilarity freqcalculator = new DefaultSimilarity()
//numDocs and maxDoc are not the same thing:
int numDocs = reader.numDocs();
int maxDoc = reader.maxDoc();

for (int i=0; i<maxDoc; i++) {
    if (reader.isDeleted(i))
        continue;
    fieldsiterator = reader.getTermVectors(i).iterator();
    while (field = fieldsiterator.next()) {
        termsiterator = fieldsiterator.terms().iterator();
        while (terms.next()) {
            //id = document id, field = field name
            //String representations of the current term
            String termtext = termsiterator.term().utf8ToString();
            //Get idf, using docfreq from the reader.
            //I haven't tested this, and I'm not quite 100% sure of the context of this method.
            //If it doesn't work, idfalternate below should.
            int idf = termsiterator.docfreq();
            int idfalternate = freqcalculator.idf(reader.docFreq(field, termsiterator.term()), numDocs);
        }
    }
}
于 2013-01-08T17:25:02.300 に答える